diff options
author | acolyer <acolyer> | 2005-09-21 14:59:55 +0000 |
---|---|---|
committer | acolyer <acolyer> | 2005-09-21 14:59:55 +0000 |
commit | a39f595c0cdcddf8eac0b99e1918d0578f2dc501 (patch) | |
tree | 94865da1d5f277582d9d0720347693cd3b3c258a /org.aspectj.ajdt.core/src | |
parent | fc2d08e2ae9d03fb377bd0ed0bd56983af4687a5 (diff) | |
download | aspectj-a39f595c0cdcddf8eac0b99e1918d0578f2dc501.tar.gz aspectj-a39f595c0cdcddf8eac0b99e1918d0578f2dc501.zip |
tests and implementation for 108120 - runtime pointcut parsing and matching.
Diffstat (limited to 'org.aspectj.ajdt.core/src')
3 files changed, 47 insertions, 4 deletions
diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AtAspectJAnnotationFactory.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AtAspectJAnnotationFactory.java index c58ab7a2b..b8a8c8c37 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AtAspectJAnnotationFactory.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AtAspectJAnnotationFactory.java @@ -115,9 +115,18 @@ public class AtAspectJAnnotationFactory { return makeSingleStringMemberAnnotation(typeName, pos, pointcutExpression); } - public static Annotation createPointcutAnnotation(String pointcutExpression, int pos) { + public static Annotation createPointcutAnnotation(String pointcutExpression, String argNames, int pos) { char[][] typeName = new char[][] {org,aspectj,lang,annotation,pointcut}; - return makeSingleStringMemberAnnotation(typeName, pos, pointcutExpression); + long[] positions = new long[] {pos,pos,pos,pos,pos}; + TypeReference annType = new QualifiedTypeReference(typeName,positions); + NormalAnnotation ann = new NormalAnnotation(annType,pos); + Expression pcExpr = new StringLiteral(pointcutExpression.toCharArray(),pos,pos); + MemberValuePair[] mvps = new MemberValuePair[2]; + mvps[0] = new MemberValuePair("value".toCharArray(),pos,pos,pcExpr); + Expression argExpr = new StringLiteral(argNames.toCharArray(),pos,pos); + mvps[1] = new MemberValuePair("argNames".toCharArray(),pos,pos,argExpr); + ann.memberValuePairs = mvps; + return ann; } public static Annotation createDeclareErrorOrWarningAnnotation(String pointcutExpression, String message, boolean isError, int pos) { diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java index f1734a9ab..abe77d9f0 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java @@ -115,7 +115,9 @@ public class PointcutDeclaration extends AjMethodDeclaration { * */ public void addAtAspectJAnnotations() { - Annotation pcutAnnotation = AtAspectJAnnotationFactory.createPointcutAnnotation(getPointcut().toString(),declarationSourceStart);; + String argNames = buildArgNameRepresentation(); + Annotation pcutAnnotation = + AtAspectJAnnotationFactory.createPointcutAnnotation(getPointcutText(),argNames,declarationSourceStart);; if (annotations == null) { annotations = new Annotation[] { pcutAnnotation }; } else { @@ -127,6 +129,28 @@ public class PointcutDeclaration extends AjMethodDeclaration { generateSyntheticPointcutMethod = true; } + private String getPointcutText() { + String text = getPointcut().toString(); + if (text.indexOf("BindingTypePattern") == -1) return text; + // has been wrecked by resolution, try to reconstruct from tokens + if (pointcutDesignator != null) { + text = pointcutDesignator.getPointcutDeclarationText(); + } + return text; + } + + private String buildArgNameRepresentation() { + StringBuffer args = new StringBuffer(); + if (this.arguments != null) { + for (int i = 0; i < this.arguments.length; i++) { + if (i != 0) args.append(","); + args.append(new String(this.arguments[i].name)); + } + } + return args.toString(); + } + + // coming from an @Pointcut declaration public void setGenerateSyntheticPointcutMethod() { generateSyntheticPointcutMethod = true; diff --git a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDesignator.java b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDesignator.java index bb824eaee..5d10403b3 100644 --- a/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDesignator.java +++ b/org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDesignator.java @@ -30,7 +30,7 @@ import org.aspectj.weaver.patterns.Pointcut; public class PointcutDesignator extends ASTNode { private Pointcut pointcut; - private PseudoTokens tokens; //XXX redundant + private PseudoTokens tokens; private boolean isError = false; public PointcutDesignator(Parser parser, PseudoTokens tokens) { @@ -89,6 +89,16 @@ public class PointcutDesignator extends ASTNode { return pointcut; } + public String getPointcutDeclarationText() { + StringBuffer sb = new StringBuffer(); + PseudoToken[] toks = tokens.tokens; + for (int i = 0; i < (toks.length -1); i++) { + sb.append(toks[i].getString()); + sb.append(" "); + } + return sb.toString(); + } + public boolean isError() { return isError; } |