diff options
Diffstat (limited to 'weaver')
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 Binary files differindex 6937bff13..af35626c6 100644 --- a/weaver/testdata/dummyAspect.jar +++ b/weaver/testdata/dummyAspect.jar diff --git a/weaver/testdata/ltw-acaspects.jar b/weaver/testdata/ltw-acaspects.jar Binary files differindex 702daa9c6..7ee6e9888 100644 --- a/weaver/testdata/ltw-acaspects.jar +++ b/weaver/testdata/ltw-acaspects.jar diff --git a/weaver/testdata/ltw-aspects.jar b/weaver/testdata/ltw-aspects.jar Binary files differindex dc76dd816..f09ee3db1 100644 --- a/weaver/testdata/ltw-aspects.jar +++ b/weaver/testdata/ltw-aspects.jar diff --git a/weaver/testdata/ltw-classes.jar b/weaver/testdata/ltw-classes.jar Binary files differindex f5ba5080e..1dfcc034b 100644 --- a/weaver/testdata/ltw-classes.jar +++ b/weaver/testdata/ltw-classes.jar diff --git a/weaver/testdata/ltw-deaspects.jar b/weaver/testdata/ltw-deaspects.jar Binary files differindex e86ffbe18..186e49409 100644 --- a/weaver/testdata/ltw-deaspects.jar +++ b/weaver/testdata/ltw-deaspects.jar diff --git a/weaver/testdata/ltw-dwaspects.jar b/weaver/testdata/ltw-dwaspects.jar Binary files differindex 382f74857..791213a88 100644 --- a/weaver/testdata/ltw-dwaspects.jar +++ b/weaver/testdata/ltw-dwaspects.jar diff --git a/weaver/testdata/ltw-itdaspects.jar b/weaver/testdata/ltw-itdaspects.jar Binary files differindex a0a9b3798..eedfaf505 100644 --- a/weaver/testdata/ltw-itdaspects.jar +++ b/weaver/testdata/ltw-itdaspects.jar diff --git a/weaver/testdata/ltw-peraspects.jar b/weaver/testdata/ltw-peraspects.jar Binary files differindex aca77d231..53f31b7e6 100644 --- a/weaver/testdata/ltw-peraspects.jar +++ b/weaver/testdata/ltw-peraspects.jar diff --git a/weaver/testdata/ltw-woven.jar b/weaver/testdata/ltw-woven.jar Binary files differindex ec1fe6d06..c60f5c745 100644 --- a/weaver/testdata/ltw-woven.jar +++ b/weaver/testdata/ltw-woven.jar diff --git a/weaver/testdata/megatrace.jar b/weaver/testdata/megatrace.jar Binary files differindex 14ae666ee..23a58710d 100644 --- a/weaver/testdata/megatrace.jar +++ b/weaver/testdata/megatrace.jar diff --git a/weaver/testdata/megatrace0easy.jar b/weaver/testdata/megatrace0easy.jar Binary files differindex 7d076431f..4c025a67f 100644 --- a/weaver/testdata/megatrace0easy.jar +++ b/weaver/testdata/megatrace0easy.jar diff --git a/weaver/testdata/megatrace0hard.jar b/weaver/testdata/megatrace0hard.jar Binary files differindex 63842de96..15f34d5d3 100644 --- a/weaver/testdata/megatrace0hard.jar +++ b/weaver/testdata/megatrace0hard.jar diff --git a/weaver/testdata/megatraceNoweave.jar b/weaver/testdata/megatraceNoweave.jar Binary files differindex 772aafbd7..3d5b1fa08 100644 --- a/weaver/testdata/megatraceNoweave.jar +++ b/weaver/testdata/megatraceNoweave.jar diff --git a/weaver/testdata/tracing.jar b/weaver/testdata/tracing.jar Binary files differindex fc4aef974..8ce561163 100644 --- a/weaver/testdata/tracing.jar +++ b/weaver/testdata/tracing.jar 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() { |