summaryrefslogtreecommitdiffstats
path: root/org.aspectj.ajdt.core/src
diff options
context:
space:
mode:
authoracolyer <acolyer>2005-02-17 12:58:24 +0000
committeracolyer <acolyer>2005-02-17 12:58:24 +0000
commitb4574b90b2db6cdae830e702825d86957447c3b9 (patch)
treed93001dbf1804933f64350dbd52bc1ced5402e7c /org.aspectj.ajdt.core/src
parentdb5e1868bb553bad01441e70db166ac4429de2f2 (diff)
downloadaspectj-b4574b90b2db6cdae830e702825d86957447c3b9.tar.gz
aspectj-b4574b90b2db6cdae830e702825d86957447c3b9.zip
support for annotations on ITDs, and declare annotation
Diffstat (limited to 'org.aspectj.ajdt.core/src')
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/DeclareAnnotationDeclaration.java52
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/DeclareDeclaration.java11
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PseudoTokens.java11
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeFieldBinding.java1
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeMethodBinding.java2
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/parser/DeclarationFactory.java14
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java27
7 files changed, 115 insertions, 3 deletions
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/DeclareAnnotationDeclaration.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/DeclareAnnotationDeclaration.java
new file mode 100644
index 000000000..7e4edec32
--- /dev/null
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/DeclareAnnotationDeclaration.java
@@ -0,0 +1,52 @@
+/* *******************************************************************
+ * Copyright (c) 2005 IBM Corporation.
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Common Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * Adrian Colyer initial implementation
+ * ******************************************************************/
+
+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.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));
+ }
+
+ 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.
+ }
+
+ private void addAnnotation(Annotation ann) {
+ if (this.annotations == null) {
+ this.annotations = new Annotation[1];
+ } else {
+ Annotation[] old = this.annotations;
+ this.annotations = new Annotation[old.length + 1];
+ System.arraycopy(old,0,this.annotations,1,old.length);
+ }
+ this.annotations[0] = ann;
+ }
+
+}
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/DeclareDeclaration.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/DeclareDeclaration.java
index f869259c8..8796a3409 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/DeclareDeclaration.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/DeclareDeclaration.java
@@ -48,14 +48,23 @@ public class DeclareDeclaration extends AjMethodDeclaration {
/**
- * A pointcut declaration exists in a classfile only as an attibute on the
+ * A declare declaration exists in a classfile only as an attibute on the
* class. Unlike advice and inter-type declarations, it has no corresponding
* method.
+ * **AMC** changed the above policy in the case of declare annotation, which uses a
+ * corresponding method as the anchor for the declared annotation
*/
public void generateCode(ClassScope classScope, ClassFile classFile) {
classFile.extraAttributes.add(new EclipseAttributeAdapter(new AjAttribute.DeclareAttribute(declareDecl)));
+ if (shouldDelegateCodeGeneration()) {
+ super.generateCode(classScope,classFile);
+ }
return;
}
+
+ protected boolean shouldDelegateCodeGeneration() {
+ return false;
+ }
public void parseStatements(
Parser parser,
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PseudoTokens.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PseudoTokens.java
index 4644f75d5..be4baf0d5 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PseudoTokens.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PseudoTokens.java
@@ -139,6 +139,17 @@ public class PseudoTokens extends ASTNode {
}
}
+ public Declare parseAnnotationDeclare(Parser parser) {
+ PatternParser patternParser = new PatternParser(tokenSource);
+ try {
+ Declare ret = patternParser.parseDeclareAnnotation();
+ checkEof(parser);
+ return ret;
+ } catch (ParserException pe) {
+ reportError(parser, pe);
+ return null;
+ } }
+
public void postParse(TypeDeclaration typeDec, MethodDeclaration enclosingDec) {
for (int i=0, len=tokens.length; i < len; i++) {
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeFieldBinding.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeFieldBinding.java
index 4ec365b8e..c3c766b9e 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeFieldBinding.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeFieldBinding.java
@@ -100,7 +100,6 @@ public class InterTypeFieldBinding extends FieldBinding {
return false;
}
-
public SyntheticMethodBinding getAccessMethod(boolean isReadAccess) {
if (isReadAccess) return reader;
else return writer;
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeMethodBinding.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeMethodBinding.java
index 39d780947..f3abe8dea 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeMethodBinding.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/lookup/InterTypeMethodBinding.java
@@ -56,7 +56,7 @@ public class InterTypeMethodBinding extends MethodBinding {
}
-
+
//XXX this is identical to InterTypeFieldBinding
public boolean canBeSeenBy(TypeBinding receiverType, InvocationSite invocationSite, Scope scope) {
scope.compilationUnitScope().recordTypeReference(declaringClass);
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/parser/DeclarationFactory.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/parser/DeclarationFactory.java
index d9f557afe..250e791f0 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/parser/DeclarationFactory.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/parser/DeclarationFactory.java
@@ -16,6 +16,7 @@ import org.aspectj.ajdt.internal.compiler.ast.AdviceDeclaration;
import org.aspectj.ajdt.internal.compiler.ast.AjConstructorDeclaration;
import org.aspectj.ajdt.internal.compiler.ast.AjMethodDeclaration;
import org.aspectj.ajdt.internal.compiler.ast.AspectDeclaration;
+import org.aspectj.ajdt.internal.compiler.ast.DeclareAnnotationDeclaration;
import org.aspectj.ajdt.internal.compiler.ast.DeclareDeclaration;
import org.aspectj.ajdt.internal.compiler.ast.IfPseudoToken;
import org.aspectj.ajdt.internal.compiler.ast.InterTypeConstructorDeclaration;
@@ -30,8 +31,10 @@ import org.aspectj.ajdt.internal.compiler.ast.PseudoTokens;
import org.aspectj.ajdt.internal.core.builder.EclipseSourceContext;
import org.aspectj.weaver.AdviceKind;
import org.aspectj.weaver.patterns.Declare;
+import org.aspectj.weaver.patterns.DeclareAnnotation;
import org.aspectj.org.eclipse.jdt.internal.compiler.CompilationResult;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Argument;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Expression;
@@ -200,6 +203,17 @@ public class DeclarationFactory implements IDeclarationFactory {
}
/* (non-Javadoc)
+ * @see org.aspectj.org.eclipse.jdt.internal.compiler.parser.Parser.IDeclarationFactory#createDeclareAnnotationDeclaration(org.aspectj.org.eclipse.jdt.internal.compiler.CompilationResult, org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode, org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation, org.aspectj.org.eclipse.jdt.internal.compiler.parser.Parser)
+ */
+ public MethodDeclaration createDeclareAnnotationDeclaration(
+ CompilationResult result, ASTNode pseudoTokens,
+ Annotation annotation, Parser parser) {
+ DeclareAnnotation declare = (DeclareAnnotation) ((PseudoTokens)pseudoTokens).parseAnnotationDeclare(parser);
+ DeclareAnnotationDeclaration decl = new DeclareAnnotationDeclaration(result,declare,annotation);
+ return decl;
+ }
+
+ /* (non-Javadoc)
* @see org.eclipse.jdt.internal.compiler.parser.Parser.IDeclarationFactory#createInterTypeFieldDeclaration(org.eclipse.jdt.internal.compiler.CompilationResult, org.eclipse.jdt.internal.compiler.ast.TypeReference)
*/
public MethodDeclaration createInterTypeFieldDeclaration(CompilationResult result, TypeReference onType) {
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java
index 9a6e11857..63648a82f 100644
--- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java
+++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/problem/AjProblemReporter.java
@@ -26,12 +26,15 @@ import org.aspectj.org.eclipse.jdt.internal.compiler.IErrorHandlingPolicy;
import org.aspectj.org.eclipse.jdt.internal.compiler.IProblemFactory;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ASTNode;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.AbstractMethodDeclaration;
+import org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation;
import org.aspectj.org.eclipse.jdt.internal.compiler.ast.ExplicitConstructorCall;
import org.aspectj.org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
import org.aspectj.org.eclipse.jdt.internal.compiler.impl.ReferenceContext;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.Binding;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.MethodBinding;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.SourceTypeBinding;
+import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TagBits;
import org.aspectj.org.eclipse.jdt.internal.compiler.lookup.TypeBinding;
import org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemReporter;
import org.aspectj.util.FuzzyBoolean;
@@ -216,6 +219,30 @@ public class AjProblemReporter extends ProblemReporter {
super.abstractMethodMustBeImplemented(type, abstractMethod);
}
+ /* (non-Javadoc)
+ * @see org.aspectj.org.eclipse.jdt.internal.compiler.problem.ProblemReporter#disallowedTargetForAnnotation(org.aspectj.org.eclipse.jdt.internal.compiler.ast.Annotation)
+ */
+ public void disallowedTargetForAnnotation(Annotation annotation) {
+ // if the annotation's recipient is an ITD, it might be allowed after all...
+ if (annotation.recipient instanceof MethodBinding) {
+ MethodBinding binding = (MethodBinding) annotation.recipient;
+ String name = new String(binding.selector);
+ if (name.startsWith("ajc$")) {
+ long metaTagBits = annotation.resolvedType.getAnnotationTagBits(); // could be forward reference
+ if (name.indexOf("interField") != -1) {
+ if ((metaTagBits & TagBits.AnnotationForField) != 0) return;
+ } else if (name.indexOf("InterConstructor") != -1) {
+ if ((metaTagBits & TagBits.AnnotationForConstructor) != 0) return;
+ } else if (name.indexOf("interMethod") != -1) {
+ if ((metaTagBits & TagBits.AnnotationForMethod) != 0) return;
+ }
+ }
+ }
+
+ // not our special case, report the problem...
+ super.disallowedTargetForAnnotation(annotation);
+ }
+
public void handle(
int problemId,
String[] problemArguments,