aboutsummaryrefslogtreecommitdiffstats
path: root/weaver
diff options
context:
space:
mode:
Diffstat (limited to 'weaver')
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/AndTypePattern.java21
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java8
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/NotTypePattern.java20
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/OrTypePattern.java21
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/TypePattern.java36
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/WildAnnotationTypePattern.java1
-rw-r--r--weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java10
-rw-r--r--weaver/testdata/dummyAspect.jarbin833 -> 861 bytes
-rw-r--r--weaver/testdata/ltw-acaspects.jarbin2462 -> 2485 bytes
-rw-r--r--weaver/testdata/ltw-aspects.jarbin1486 -> 1508 bytes
-rw-r--r--weaver/testdata/ltw-classes.jarbin1486 -> 1486 bytes
-rw-r--r--weaver/testdata/ltw-deaspects.jarbin1105 -> 1131 bytes
-rw-r--r--weaver/testdata/ltw-dwaspects.jarbin1112 -> 1136 bytes
-rw-r--r--weaver/testdata/ltw-itdaspects.jarbin5386 -> 5469 bytes
-rw-r--r--weaver/testdata/ltw-peraspects.jarbin1888 -> 1916 bytes
-rw-r--r--weaver/testdata/ltw-woven.jarbin2705 -> 2735 bytes
-rw-r--r--weaver/testdata/megatrace.jarbin5746 -> 5890 bytes
-rw-r--r--weaver/testdata/megatrace0easy.jarbin3635 -> 3712 bytes
-rw-r--r--weaver/testdata/megatrace0hard.jarbin3531 -> 3615 bytes
-rw-r--r--weaver/testdata/megatraceNoweave.jarbin3183 -> 3234 bytes
-rw-r--r--weaver/testdata/tracing.jarbin2653 -> 2706 bytes
-rw-r--r--weaver/testsrc/org/aspectj/weaver/patterns/AnnotationPatternTestCase.java8
22 files changed, 115 insertions, 10 deletions
diff --git a/weaver/src/org/aspectj/weaver/patterns/AndTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/AndTypePattern.java
index 20cdea8ab..022ba5570 100644
--- a/weaver/src/org/aspectj/weaver/patterns/AndTypePattern.java
+++ b/weaver/src/org/aspectj/weaver/patterns/AndTypePattern.java
@@ -51,6 +51,11 @@ public class AndTypePattern extends TypePattern {
return left.matchesExactly(type) && right.matchesExactly(type);
}
+ protected boolean matchesExactly(ResolvedTypeX type, ResolvedTypeX annotatedType) {
+ return left.matchesExactly(type,annotatedType) && right.matchesExactly(type,annotatedType);
+ }
+
+
public boolean matchesStatically(Class type) {
return left.matchesStatically(type) && right.matchesStatically(type);
}
@@ -74,6 +79,22 @@ public class AndTypePattern extends TypePattern {
right.setIsVarArgs(isVarArgs);
}
+ public void setAnnotationTypePattern(AnnotationTypePattern annPatt) {
+ if (annPatt == AnnotationTypePattern.ANY) return;
+ if (left.annotationPattern == AnnotationTypePattern.ANY) {
+ left.setAnnotationTypePattern(annPatt);
+ } else {
+ left.setAnnotationTypePattern(
+ new AndAnnotationTypePattern(left.annotationPattern,annPatt));
+ }
+ if (right.annotationPattern == AnnotationTypePattern.ANY) {
+ right.setAnnotationTypePattern(annPatt);
+ } else {
+ right.setAnnotationTypePattern(
+ new AndAnnotationTypePattern(right.annotationPattern,annPatt));
+ }
+ }
+
public void write(DataOutputStream s) throws IOException {
s.writeByte(TypePattern.AND);
left.write(s);
diff --git a/weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java
index 5d948adca..b4e4ea7e3 100644
--- a/weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java
+++ b/weaver/src/org/aspectj/weaver/patterns/ExactTypePattern.java
@@ -92,10 +92,18 @@ public class ExactTypePattern extends TypePattern {
protected boolean matchesExactly(ResolvedTypeX matchType) {
boolean typeMatch = this.type.equals(matchType);
+ annotationPattern.resolve(matchType.getWorld());
boolean annMatch = this.annotationPattern.matches(matchType).alwaysTrue();
return (typeMatch && annMatch);
}
+ protected boolean matchesExactly(ResolvedTypeX matchType, ResolvedTypeX annotatedType) {
+ boolean typeMatch = this.type.equals(matchType);
+ annotationPattern.resolve(matchType.getWorld());
+ boolean annMatch = this.annotationPattern.matches(annotatedType).alwaysTrue();
+ return (typeMatch && annMatch);
+ }
+
public TypeX getType() { return type; }
public FuzzyBoolean matchesInstanceof(ResolvedTypeX matchType) {
diff --git a/weaver/src/org/aspectj/weaver/patterns/NotTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/NotTypePattern.java
index 772b4cdd4..4106af216 100644
--- a/weaver/src/org/aspectj/weaver/patterns/NotTypePattern.java
+++ b/weaver/src/org/aspectj/weaver/patterns/NotTypePattern.java
@@ -17,6 +17,7 @@ import java.io.DataOutputStream;
import java.io.IOException;
import org.aspectj.util.FuzzyBoolean;
+import org.aspectj.weaver.AjAttribute;
import org.aspectj.weaver.ISourceContext;
import org.aspectj.weaver.ResolvedTypeX;
import org.aspectj.weaver.VersionedDataInputStream;
@@ -51,7 +52,11 @@ public class NotTypePattern extends TypePattern {
}
protected boolean matchesExactly(ResolvedTypeX type) {
- return !pattern.matchesExactly(type);
+ return (!pattern.matchesExactly(type) && annotationPattern.matches(type).alwaysTrue());
+ }
+
+ protected boolean matchesExactly(ResolvedTypeX type, ResolvedTypeX annotatedType) {
+ return (!pattern.matchesExactly(type,annotatedType) && annotationPattern.matches(annotatedType).alwaysTrue());
}
public boolean matchesStatically(Class type) {
@@ -70,14 +75,27 @@ public class NotTypePattern extends TypePattern {
return !pattern.matchesStatically(type);
}
+ public void setAnnotationTypePattern(AnnotationTypePattern annPatt) {
+ super.setAnnotationTypePattern(annPatt);
+ }
+
+ public void setIsVarArgs(boolean isVarArgs) {
+ pattern.setIsVarArgs(isVarArgs);
+ }
+
+
public void write(DataOutputStream s) throws IOException {
s.writeByte(TypePattern.NOT);
pattern.write(s);
+ annotationPattern.write(s);
writeLocation(s);
}
public static TypePattern read(VersionedDataInputStream s, ISourceContext context) throws IOException {
TypePattern ret = new NotTypePattern(TypePattern.read(s, context));
+ if (s.getMajorVersion()>=AjAttribute.WeaverVersionInfo.WEAVER_VERSION_MAJOR_AJ150) {
+ ret.annotationPattern = AnnotationTypePattern.read(s,context);
+ }
ret.readLocation(context, s);
return ret;
}
diff --git a/weaver/src/org/aspectj/weaver/patterns/OrTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/OrTypePattern.java
index 642f09ace..e5e372d80 100644
--- a/weaver/src/org/aspectj/weaver/patterns/OrTypePattern.java
+++ b/weaver/src/org/aspectj/weaver/patterns/OrTypePattern.java
@@ -54,6 +54,11 @@ public class OrTypePattern extends TypePattern {
//??? if these had side-effects, this sort-circuit could be a mistake
return left.matchesExactly(type) || right.matchesExactly(type);
}
+
+ protected boolean matchesExactly(ResolvedTypeX type, ResolvedTypeX annotatedType) {
+ //??? if these had side-effects, this sort-circuit could be a mistake
+ return left.matchesExactly(type,annotatedType) || right.matchesExactly(type,annotatedType);
+ }
public boolean matchesStatically(ResolvedTypeX type) {
return left.matchesStatically(type) || right.matchesStatically(type);
@@ -78,6 +83,22 @@ public class OrTypePattern extends TypePattern {
right.setIsVarArgs(isVarArgs);
}
+ public void setAnnotationTypePattern(AnnotationTypePattern annPatt) {
+ if (annPatt == AnnotationTypePattern.ANY) return;
+ if (left.annotationPattern == AnnotationTypePattern.ANY) {
+ left.setAnnotationTypePattern(annPatt);
+ } else {
+ left.setAnnotationTypePattern(
+ new AndAnnotationTypePattern(left.annotationPattern,annPatt));
+ }
+ if (right.annotationPattern == AnnotationTypePattern.ANY) {
+ right.setAnnotationTypePattern(annPatt);
+ } else {
+ right.setAnnotationTypePattern(
+ new AndAnnotationTypePattern(right.annotationPattern,annPatt));
+ }
+ }
+
public void write(DataOutputStream s) throws IOException {
s.writeByte(TypePattern.OR);
left.write(s);
diff --git a/weaver/src/org/aspectj/weaver/patterns/TypePattern.java b/weaver/src/org/aspectj/weaver/patterns/TypePattern.java
index 3e3446ab3..cf0aa4809 100644
--- a/weaver/src/org/aspectj/weaver/patterns/TypePattern.java
+++ b/weaver/src/org/aspectj/weaver/patterns/TypePattern.java
@@ -169,6 +169,8 @@ public abstract class TypePattern extends PatternNode {
}
protected abstract boolean matchesExactly(ResolvedTypeX type);
+
+ protected abstract boolean matchesExactly(ResolvedTypeX type, ResolvedTypeX annotatedType);
protected boolean matchesSubtypes(ResolvedTypeX type) {
//System.out.println("matching: " + this + " to " + type);
@@ -180,7 +182,22 @@ public abstract class TypePattern extends PatternNode {
// FuzzyBoolean ret = FuzzyBoolean.NO; // ??? -eh
for (Iterator i = type.getDirectSupertypes(); i.hasNext(); ) {
ResolvedTypeX superType = (ResolvedTypeX)i.next();
- if (matchesSubtypes(superType)) return true;
+ if (matchesSubtypes(superType,type)) return true;
+ }
+ return false;
+ }
+
+ protected boolean matchesSubtypes(ResolvedTypeX superType, ResolvedTypeX annotatedType) {
+ //System.out.println("matching: " + this + " to " + type);
+ if (matchesExactly(superType,annotatedType)) {
+ //System.out.println(" true");
+ return true;
+ }
+
+ // FuzzyBoolean ret = FuzzyBoolean.NO; // ??? -eh
+ for (Iterator i = superType.getDirectSupertypes(); i.hasNext(); ) {
+ ResolvedTypeX superSuperType = (ResolvedTypeX)i.next();
+ if (matchesSubtypes(superSuperType,annotatedType)) return true;
}
return false;
}
@@ -317,6 +334,10 @@ class EllipsisTypePattern extends TypePattern {
protected boolean matchesExactly(ResolvedTypeX type) {
return false;
}
+
+ protected boolean matchesExactly(ResolvedTypeX type, ResolvedTypeX annotatedType) {
+ return false;
+ }
/**
* @see org.aspectj.weaver.patterns.TypePattern#matchesInstanceof(IType)
@@ -385,6 +406,10 @@ class AnyTypePattern extends TypePattern {
return true;
}
+ protected boolean matchesExactly(ResolvedTypeX type, ResolvedTypeX annotatedType) {
+ return true;
+ }
+
/**
* @see org.aspectj.weaver.patterns.TypePattern#matchesInstanceof(IType)
*/
@@ -461,6 +486,11 @@ class AnyWithAnnotationTypePattern extends TypePattern {
annotationPattern.resolve(type.getWorld());
return annotationPattern.matches(type).alwaysTrue();
}
+
+ protected boolean matchesExactly(ResolvedTypeX type, ResolvedTypeX annotatedType) {
+ annotationPattern.resolve(type.getWorld());
+ return annotationPattern.matches(annotatedType).alwaysTrue();
+ }
public FuzzyBoolean matchesInstanceof(ResolvedTypeX type) {
return FuzzyBoolean.YES;
@@ -531,6 +561,10 @@ class NoTypePattern extends TypePattern {
protected boolean matchesExactly(ResolvedTypeX type) {
return false;
}
+
+ protected boolean matchesExactly(ResolvedTypeX type, ResolvedTypeX annotatedType) {
+ return false;
+ }
/**
* @see org.aspectj.weaver.patterns.TypePattern#matchesInstanceof(IType)
diff --git a/weaver/src/org/aspectj/weaver/patterns/WildAnnotationTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/WildAnnotationTypePattern.java
index 8ca0dd1b5..9019954e2 100644
--- a/weaver/src/org/aspectj/weaver/patterns/WildAnnotationTypePattern.java
+++ b/weaver/src/org/aspectj/weaver/patterns/WildAnnotationTypePattern.java
@@ -75,6 +75,7 @@ public class WildAnnotationTypePattern extends AnnotationTypePattern {
public AnnotationTypePattern resolveBindings(IScope scope, Bindings bindings,
boolean allowBinding)
{
+ if (resolved) return this;
this.typePattern = typePattern.resolveBindings(scope,bindings,false,false);
resolved = true;
if (typePattern instanceof ExactTypePattern) {
diff --git a/weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java
index 97a1ee019..0dff4aaad 100644
--- a/weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java
+++ b/weaver/src/org/aspectj/weaver/patterns/WildTypePattern.java
@@ -117,6 +117,10 @@ public class WildTypePattern extends TypePattern {
* @see org.aspectj.weaver.TypePattern#matchesExactly(IType)
*/
protected boolean matchesExactly(ResolvedTypeX type) {
+ return matchesExactly(type,type);
+ }
+
+ protected boolean matchesExactly(ResolvedTypeX type, ResolvedTypeX annotatedType) {
String targetTypeName = type.getName();
//System.err.println("match: " + targetTypeName + ", " + knownMatches); //Arrays.asList(importedPrefixes));
@@ -124,9 +128,10 @@ public class WildTypePattern extends TypePattern {
annotationPattern.resolve(type.getWorld());
return matchesExactlyByName(targetTypeName) &&
- annotationPattern.matches(type).alwaysTrue();
+ annotationPattern.matches(annotatedType).alwaysTrue();
}
-
+
+
/**
* Used in conjunction with checks on 'isStar()' to tell you if this pattern represents '*' or '*[]' which are
* different !
@@ -450,6 +455,7 @@ public class WildTypePattern extends TypePattern {
} else {
if (dim != 0) type = TypeX.makeArray(type, dim);
TypePattern ret = new ExactTypePattern(type, includeSubtypes,isVarArgs);
+ ret.setAnnotationTypePattern(annotationPattern);
ret.copyLocationFrom(this);
return ret;
}
diff --git a/weaver/testdata/dummyAspect.jar b/weaver/testdata/dummyAspect.jar
index 6937bff13..af35626c6 100644
--- a/weaver/testdata/dummyAspect.jar
+++ b/weaver/testdata/dummyAspect.jar
Binary files differ
diff --git a/weaver/testdata/ltw-acaspects.jar b/weaver/testdata/ltw-acaspects.jar
index 702daa9c6..7ee6e9888 100644
--- a/weaver/testdata/ltw-acaspects.jar
+++ b/weaver/testdata/ltw-acaspects.jar
Binary files differ
diff --git a/weaver/testdata/ltw-aspects.jar b/weaver/testdata/ltw-aspects.jar
index dc76dd816..f09ee3db1 100644
--- a/weaver/testdata/ltw-aspects.jar
+++ b/weaver/testdata/ltw-aspects.jar
Binary files differ
diff --git a/weaver/testdata/ltw-classes.jar b/weaver/testdata/ltw-classes.jar
index f5ba5080e..1dfcc034b 100644
--- a/weaver/testdata/ltw-classes.jar
+++ b/weaver/testdata/ltw-classes.jar
Binary files differ
diff --git a/weaver/testdata/ltw-deaspects.jar b/weaver/testdata/ltw-deaspects.jar
index e86ffbe18..186e49409 100644
--- a/weaver/testdata/ltw-deaspects.jar
+++ b/weaver/testdata/ltw-deaspects.jar
Binary files differ
diff --git a/weaver/testdata/ltw-dwaspects.jar b/weaver/testdata/ltw-dwaspects.jar
index 382f74857..791213a88 100644
--- a/weaver/testdata/ltw-dwaspects.jar
+++ b/weaver/testdata/ltw-dwaspects.jar
Binary files differ
diff --git a/weaver/testdata/ltw-itdaspects.jar b/weaver/testdata/ltw-itdaspects.jar
index a0a9b3798..eedfaf505 100644
--- a/weaver/testdata/ltw-itdaspects.jar
+++ b/weaver/testdata/ltw-itdaspects.jar
Binary files differ
diff --git a/weaver/testdata/ltw-peraspects.jar b/weaver/testdata/ltw-peraspects.jar
index aca77d231..53f31b7e6 100644
--- a/weaver/testdata/ltw-peraspects.jar
+++ b/weaver/testdata/ltw-peraspects.jar
Binary files differ
diff --git a/weaver/testdata/ltw-woven.jar b/weaver/testdata/ltw-woven.jar
index ec1fe6d06..c60f5c745 100644
--- a/weaver/testdata/ltw-woven.jar
+++ b/weaver/testdata/ltw-woven.jar
Binary files differ
diff --git a/weaver/testdata/megatrace.jar b/weaver/testdata/megatrace.jar
index 14ae666ee..23a58710d 100644
--- a/weaver/testdata/megatrace.jar
+++ b/weaver/testdata/megatrace.jar
Binary files differ
diff --git a/weaver/testdata/megatrace0easy.jar b/weaver/testdata/megatrace0easy.jar
index 7d076431f..4c025a67f 100644
--- a/weaver/testdata/megatrace0easy.jar
+++ b/weaver/testdata/megatrace0easy.jar
Binary files differ
diff --git a/weaver/testdata/megatrace0hard.jar b/weaver/testdata/megatrace0hard.jar
index 63842de96..15f34d5d3 100644
--- a/weaver/testdata/megatrace0hard.jar
+++ b/weaver/testdata/megatrace0hard.jar
Binary files differ
diff --git a/weaver/testdata/megatraceNoweave.jar b/weaver/testdata/megatraceNoweave.jar
index 772aafbd7..3d5b1fa08 100644
--- a/weaver/testdata/megatraceNoweave.jar
+++ b/weaver/testdata/megatraceNoweave.jar
Binary files differ
diff --git a/weaver/testdata/tracing.jar b/weaver/testdata/tracing.jar
index fc4aef974..8ce561163 100644
--- a/weaver/testdata/tracing.jar
+++ b/weaver/testdata/tracing.jar
Binary files differ
diff --git a/weaver/testsrc/org/aspectj/weaver/patterns/AnnotationPatternTestCase.java b/weaver/testsrc/org/aspectj/weaver/patterns/AnnotationPatternTestCase.java
index 136ab98fa..47b6d46b6 100644
--- a/weaver/testsrc/org/aspectj/weaver/patterns/AnnotationPatternTestCase.java
+++ b/weaver/testsrc/org/aspectj/weaver/patterns/AnnotationPatternTestCase.java
@@ -170,18 +170,14 @@ public class AnnotationPatternTestCase extends TestCase {
PatternParser p = new PatternParser("(@(Foo || Boo) (Foo || Boo))");
TypePattern t = p.parseTypePattern();
assertTrue("OrTypePattern",t instanceof OrTypePattern);
- WildAnnotationTypePattern wtp = (WildAnnotationTypePattern) t.annotationPattern;
- assertEquals("@((Foo || Boo))",wtp.toString());
- assertEquals("(@((Foo || Boo)) (Foo || Boo))",t.toString());
+ assertEquals("((@((Foo || Boo)) Foo) || (@((Foo || Boo)) Boo))",t.toString());
}
public void testNotSyntax() {
PatternParser p = new PatternParser("!@Foo (Foo || Boo))");
TypePattern t = p.parseTypePattern();
assertTrue("OrTypePattern",t instanceof OrTypePattern);
- NotAnnotationTypePattern natp = (NotAnnotationTypePattern) t.annotationPattern;
- assertEquals("!@(Foo)",natp.toString());
- assertEquals("(!@(Foo) (Foo || Boo))",t.toString());
+ assertEquals("((!@(Foo) Foo) || (!@(Foo) Boo))",t.toString());
}
public void testParseMethodOrConstructorSigNoAP() {