]> source.dussan.org Git - aspectj.git/commitdiff
Declare annotation: filled in the blanks
authoraclement <aclement>
Thu, 10 Mar 2005 20:35:22 +0000 (20:35 +0000)
committeraclement <aclement>
Thu, 10 Mar 2005 20:35:22 +0000 (20:35 +0000)
org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/DeclareAnnotationDeclaration.java

index 7e4edec322739da840e6667d966f4414e7e81a07..158228a4c189628624659614f053da263c25638d 100644 (file)
@@ -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;
    }
-   
+       
 }