diff options
author | acolyer <acolyer> | 2005-02-17 12:58:24 +0000 |
---|---|---|
committer | acolyer <acolyer> | 2005-02-17 12:58:24 +0000 |
commit | b4574b90b2db6cdae830e702825d86957447c3b9 (patch) | |
tree | d93001dbf1804933f64350dbd52bc1ced5402e7c /org.aspectj.ajdt.core/src | |
parent | db5e1868bb553bad01441e70db166ac4429de2f2 (diff) | |
download | aspectj-b4574b90b2db6cdae830e702825d86957447c3b9.tar.gz aspectj-b4574b90b2db6cdae830e702825d86957447c3b9.zip |
support for annotations on ITDs, and declare annotation
Diffstat (limited to 'org.aspectj.ajdt.core/src')
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, |