summaryrefslogtreecommitdiffstats
path: root/org.aspectj.ajdt.core/src
diff options
context:
space:
mode:
authoracolyer <acolyer>2005-09-21 14:59:55 +0000
committeracolyer <acolyer>2005-09-21 14:59:55 +0000
commita39f595c0cdcddf8eac0b99e1918d0578f2dc501 (patch)
tree94865da1d5f277582d9d0720347693cd3b3c258a /org.aspectj.ajdt.core/src
parentfc2d08e2ae9d03fb377bd0ed0bd56983af4687a5 (diff)
downloadaspectj-a39f595c0cdcddf8eac0b99e1918d0578f2dc501.tar.gz
aspectj-a39f595c0cdcddf8eac0b99e1918d0578f2dc501.zip
tests and implementation for 108120 - runtime pointcut parsing and matching.
Diffstat (limited to 'org.aspectj.ajdt.core/src')
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/AtAspectJAnnotationFactory.java13
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDeclaration.java26
-rw-r--r--org.aspectj.ajdt.core/src/org/aspectj/ajdt/internal/compiler/ast/PointcutDesignator.java12
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;
}