|
|
@@ -8,32 +8,60 @@ |
|
|
|
* |
|
|
|
* Contributors: |
|
|
|
* Adrian Colyer initial implementation |
|
|
|
* Andy Clement wired up to back end |
|
|
|
* ******************************************************************/ |
|
|
|
|
|
|
|
package org.aspectj.ajdt.internal.compiler.ast; |
|
|
|
|
|
|
|
import org.aspectj.org.eclipse.jdt.internal.compiler.CompilationResult; |
|
|
|
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation; |
|
|
|
import org.aspectj.org.eclipse.jdt.internal.compiler.flow.FlowInfo; |
|
|
|
import org.aspectj.org.eclipse.jdt.internal.compiler.flow.InitializationFlowContext; |
|
|
|
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ClassScope; |
|
|
|
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits; |
|
|
|
import org.aspectj.weaver.patterns.DeclareAnnotation; |
|
|
|
|
|
|
|
public class DeclareAnnotationDeclaration extends DeclareDeclaration { |
|
|
|
|
|
|
|
private Annotation annotation; |
|
|
|
|
|
|
|
|
|
|
|
public DeclareAnnotationDeclaration(CompilationResult result, DeclareAnnotation symbolicDeclare, Annotation annotation) { |
|
|
|
super(result,symbolicDeclare); |
|
|
|
this.annotation = annotation; |
|
|
|
addAnnotation(annotation); |
|
|
|
symbolicDeclare.setAnnotationString(annotation.toString()); |
|
|
|
symbolicDeclare.setAnnotationMethod(new String(selector)); |
|
|
|
super(result,symbolicDeclare); |
|
|
|
this.annotation = annotation; |
|
|
|
|
|
|
|
addAnnotation(annotation); |
|
|
|
if (symbolicDeclare==null) return; // there is an error that will already be getting reported (e.g. incorrect pattern on decaf/decac) |
|
|
|
symbolicDeclare.setAnnotationString(annotation.toString()); |
|
|
|
symbolicDeclare.setAnnotationMethod(new String(selector)); |
|
|
|
} |
|
|
|
|
|
|
|
public void analyseCode(ClassScope classScope, |
|
|
|
InitializationFlowContext initializationContext, FlowInfo flowInfo) { |
|
|
|
super.analyseCode(classScope, initializationContext, flowInfo); |
|
|
|
|
|
|
|
long bits = annotation.resolvedType.getAnnotationTagBits(); |
|
|
|
|
|
|
|
if ((bits&TagBits.AnnotationTarget)!=0) { |
|
|
|
// The annotation is stored against a method. For declare @type we need to |
|
|
|
// confirm the annotation targets the right types. Earlier checking will |
|
|
|
// have not found this problem because an annotation for target METHOD will |
|
|
|
// not be reported on as we *do* store it against a method in this case |
|
|
|
DeclareAnnotation.Kind k = ((DeclareAnnotation)declareDecl).getKind(); |
|
|
|
if (k.equals(DeclareAnnotation.AT_TYPE)) |
|
|
|
if ((bits&TagBits.AnnotationForMethod)!=0) |
|
|
|
classScope.problemReporter().disallowedTargetForAnnotation(annotation); |
|
|
|
if (k.equals(DeclareAnnotation.AT_FIELD)) |
|
|
|
if ((bits&TagBits.AnnotationForMethod)!=0) |
|
|
|
classScope.problemReporter().disallowedTargetForAnnotation(annotation); |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public Annotation getDeclaredAnnotation() { |
|
|
|
return annotation; |
|
|
|
} |
|
|
|
|
|
|
|
/* (non-Javadoc) |
|
|
|
* @see org.aspectj.ajdt.internal.compiler.ast.DeclareDeclaration#shouldDelegateCodeGeneration() |
|
|
|
*/ |
|
|
|
protected boolean shouldDelegateCodeGeneration() { |
|
|
|
return true; // declare annotation needs a method to be written out. |
|
|
|
} |
|
|
@@ -48,5 +76,5 @@ public class DeclareAnnotationDeclaration extends DeclareDeclaration { |
|
|
|
} |
|
|
|
this.annotations[0] = ann; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
} |