diff options
author | acolyer <acolyer> | 2005-08-18 09:34:43 +0000 |
---|---|---|
committer | acolyer <acolyer> | 2005-08-18 09:34:43 +0000 |
commit | 4a5c56c32b142fe6decf40ee32d942bc50a5a7ac (patch) | |
tree | 2a60ce51c69a28f3ef4ffc6776b591c6bea4e7f0 /weaver | |
parent | dde3a9141c63bd2911896735855625cd50803040 (diff) | |
download | aspectj-4a5c56c32b142fe6decf40ee32d942bc50a5a7ac.tar.gz aspectj-4a5c56c32b142fe6decf40ee32d942bc50a5a7ac.zip |
support for parameterizeWith
Diffstat (limited to 'weaver')
10 files changed, 101 insertions, 0 deletions
diff --git a/weaver/src/org/aspectj/weaver/patterns/AndAnnotationTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/AndAnnotationTypePattern.java index 4635051b2..1b1fe151c 100644 --- a/weaver/src/org/aspectj/weaver/patterns/AndAnnotationTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/AndAnnotationTypePattern.java @@ -11,6 +11,7 @@ package org.aspectj.weaver.patterns; import java.io.DataOutputStream; import java.io.IOException; +import java.util.Map; import org.aspectj.util.FuzzyBoolean; import org.aspectj.weaver.AnnotatedElement; @@ -54,6 +55,14 @@ public class AndAnnotationTypePattern extends AnnotationTypePattern { return this; } + public AnnotationTypePattern parameterizeWith(Map typeVariableMap) { + AnnotationTypePattern newLeft = left.parameterizeWith(typeVariableMap); + AnnotationTypePattern newRight = right.parameterizeWith(typeVariableMap); + AndAnnotationTypePattern ret = new AndAnnotationTypePattern(newLeft,newRight); + ret.copyLocationFrom(this); + return ret; + } + public static AnnotationTypePattern read(VersionedDataInputStream s, ISourceContext context) throws IOException { AnnotationTypePattern p = new AndAnnotationTypePattern( AnnotationTypePattern.read(s,context), diff --git a/weaver/src/org/aspectj/weaver/patterns/AndTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/AndTypePattern.java index 4ea4852a8..e3d4d3d86 100644 --- a/weaver/src/org/aspectj/weaver/patterns/AndTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/AndTypePattern.java @@ -15,6 +15,7 @@ package org.aspectj.weaver.patterns; import java.io.DataOutputStream; import java.io.IOException; +import java.util.Map; import org.aspectj.util.FuzzyBoolean; import org.aspectj.weaver.ISourceContext; @@ -120,6 +121,14 @@ public class AndTypePattern extends TypePattern { return this; } + public TypePattern parameterizeWith(Map typeVariableMap) { + TypePattern newLeft = left.parameterizeWith(typeVariableMap); + TypePattern newRight = right.parameterizeWith(typeVariableMap); + AndTypePattern ret = new AndTypePattern(newLeft,newRight); + ret.copyLocationFrom(this); + return ret; + } + public TypePattern resolveBindingsFromRTTI(boolean allowBinding, boolean requireExactType) { if (requireExactType) return TypePattern.NO; left = left.resolveBindingsFromRTTI(allowBinding,requireExactType); diff --git a/weaver/src/org/aspectj/weaver/patterns/AnnotationTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/AnnotationTypePattern.java index 822a22ac9..16e5f4cf7 100644 --- a/weaver/src/org/aspectj/weaver/patterns/AnnotationTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/AnnotationTypePattern.java @@ -11,6 +11,7 @@ package org.aspectj.weaver.patterns; import java.io.DataOutputStream; import java.io.IOException; +import java.util.Map; import org.aspectj.util.FuzzyBoolean; import org.aspectj.weaver.AnnotatedElement; @@ -45,6 +46,8 @@ public abstract class AnnotationTypePattern extends PatternNode { public abstract void resolve(World world); + public abstract AnnotationTypePattern parameterizeWith(Map/*name -> ResolvedType*/ typeVariableMap); + public boolean isAny() { return false; } /** @@ -107,6 +110,10 @@ class AnyAnnotationTypePattern extends AnnotationTypePattern { } public boolean isAny() { return true; } + + public AnnotationTypePattern parameterizeWith(Map arg0) { + return this; + } } class EllipsisAnnotationTypePattern extends AnnotationTypePattern { @@ -128,4 +135,8 @@ class EllipsisAnnotationTypePattern extends AnnotationTypePattern { return visitor.visit(this, data); } + public AnnotationTypePattern parameterizeWith(Map arg0) { + return this; + } + }
\ No newline at end of file diff --git a/weaver/src/org/aspectj/weaver/patterns/ExactAnnotationTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/ExactAnnotationTypePattern.java index 97db59fb9..976158de5 100644 --- a/weaver/src/org/aspectj/weaver/patterns/ExactAnnotationTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/ExactAnnotationTypePattern.java @@ -11,6 +11,7 @@ package org.aspectj.weaver.patterns; import java.io.DataOutputStream; import java.io.IOException; +import java.util.Map; import org.aspectj.bridge.IMessage; import org.aspectj.bridge.MessageUtil; @@ -19,6 +20,7 @@ import org.aspectj.weaver.AnnotatedElement; import org.aspectj.weaver.BCException; import org.aspectj.weaver.ISourceContext; import org.aspectj.weaver.ResolvedType; +import org.aspectj.weaver.TypeVariableReference; import org.aspectj.weaver.UnresolvedType; import org.aspectj.weaver.VersionedDataInputStream; import org.aspectj.weaver.WeaverMessages; @@ -157,6 +159,24 @@ public class ExactAnnotationTypePattern extends AnnotationTypePattern { return this; } + public AnnotationTypePattern parameterizeWith(Map typeVariableMap) { + UnresolvedType newAnnotationType = annotationType; + if (annotationType.isTypeVariableReference()) { + TypeVariableReference t = (TypeVariableReference) annotationType; + String key = t.getTypeVariable().getName(); + if (typeVariableMap.containsKey(key)) { + newAnnotationType = (UnresolvedType) typeVariableMap.get(key); + } + } else if (annotationType.isParameterizedType()) { + newAnnotationType = annotationType.parameterize(typeVariableMap); + } + ExactAnnotationTypePattern ret = new ExactAnnotationTypePattern(newAnnotationType); + ret.formalName = formalName; + ret.bindingPattern = bindingPattern; + ret.copyLocationFrom(this); + return ret; + } + private String maybeGetSimpleName() { if (formalName != null) return formalName; String ret = annotationType.getName(); diff --git a/weaver/src/org/aspectj/weaver/patterns/NotAnnotationTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/NotAnnotationTypePattern.java index 5e0293158..fbbdf3a54 100644 --- a/weaver/src/org/aspectj/weaver/patterns/NotAnnotationTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/NotAnnotationTypePattern.java @@ -11,6 +11,7 @@ package org.aspectj.weaver.patterns; import java.io.DataOutputStream; import java.io.IOException; +import java.util.Map; import org.aspectj.util.FuzzyBoolean; import org.aspectj.weaver.AnnotatedElement; @@ -50,6 +51,14 @@ public class NotAnnotationTypePattern extends AnnotationTypePattern { return this; } + + public AnnotationTypePattern parameterizeWith(Map typeVariableMap) { + AnnotationTypePattern newNegatedPattern = negatedPattern.parameterizeWith(typeVariableMap); + NotAnnotationTypePattern ret = new NotAnnotationTypePattern(newNegatedPattern); + ret.copyLocationFrom(this); + return ret; + } + /* (non-Javadoc) * @see org.aspectj.weaver.patterns.PatternNode#write(java.io.DataOutputStream) */ diff --git a/weaver/src/org/aspectj/weaver/patterns/NotTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/NotTypePattern.java index 620ac473d..cc611cb88 100644 --- a/weaver/src/org/aspectj/weaver/patterns/NotTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/NotTypePattern.java @@ -15,6 +15,7 @@ package org.aspectj.weaver.patterns; import java.io.DataOutputStream; import java.io.IOException; +import java.util.Map; import org.aspectj.util.FuzzyBoolean; import org.aspectj.weaver.AjAttribute; @@ -114,6 +115,13 @@ public class NotTypePattern extends TypePattern { return this; } + public TypePattern parameterizeWith(Map typeVariableMap) { + TypePattern newNegatedPattern = negatedPattern.parameterizeWith(typeVariableMap); + NotTypePattern ret = new NotTypePattern(newNegatedPattern); + ret.copyLocationFrom(this); + return ret; + } + public TypePattern resolveBindingsFromRTTI(boolean allowBinding, boolean requireExactType) { if (requireExactType) return TypePattern.NO; negatedPattern = negatedPattern.resolveBindingsFromRTTI(allowBinding,requireExactType); diff --git a/weaver/src/org/aspectj/weaver/patterns/OrAnnotationTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/OrAnnotationTypePattern.java index 562fafe00..4f3192422 100644 --- a/weaver/src/org/aspectj/weaver/patterns/OrAnnotationTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/OrAnnotationTypePattern.java @@ -11,6 +11,7 @@ package org.aspectj.weaver.patterns; import java.io.DataOutputStream; import java.io.IOException; +import java.util.Map; import org.aspectj.util.FuzzyBoolean; import org.aspectj.weaver.AnnotatedElement; @@ -48,6 +49,14 @@ public class OrAnnotationTypePattern extends AnnotationTypePattern { return this; } + public AnnotationTypePattern parameterizeWith(Map typeVariableMap) { + AnnotationTypePattern newLeft = left.parameterizeWith(typeVariableMap); + AnnotationTypePattern newRight = right.parameterizeWith(typeVariableMap); + OrAnnotationTypePattern ret = new OrAnnotationTypePattern(newLeft,newRight); + ret.copyLocationFrom(this); + return ret; + } + public Object accept(PatternNodeVisitor visitor, Object data) { return visitor.visit(this,data); } diff --git a/weaver/src/org/aspectj/weaver/patterns/OrTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/OrTypePattern.java index 007f982dd..8dd01b9f0 100644 --- a/weaver/src/org/aspectj/weaver/patterns/OrTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/OrTypePattern.java @@ -15,6 +15,7 @@ package org.aspectj.weaver.patterns; import java.io.DataOutputStream; import java.io.IOException; +import java.util.Map; import org.aspectj.util.FuzzyBoolean; import org.aspectj.weaver.ISourceContext; @@ -132,6 +133,14 @@ public class OrTypePattern extends TypePattern { return this; } + public TypePattern parameterizeWith(Map typeVariableMap) { + TypePattern newLeft = left.parameterizeWith(typeVariableMap); + TypePattern newRight = right.parameterizeWith(typeVariableMap); + OrTypePattern ret = new OrTypePattern(newLeft,newRight); + ret.copyLocationFrom(this); + return ret; + } + public TypePattern resolveBindingsFromRTTI(boolean allowBinding, boolean requireExactType) { if (requireExactType) return TypePattern.NO; left = left.resolveBindingsFromRTTI(allowBinding,requireExactType); diff --git a/weaver/src/org/aspectj/weaver/patterns/ThrowsPattern.java b/weaver/src/org/aspectj/weaver/patterns/ThrowsPattern.java index 9a006ac47..c678dcdb3 100644 --- a/weaver/src/org/aspectj/weaver/patterns/ThrowsPattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/ThrowsPattern.java @@ -15,6 +15,7 @@ package org.aspectj.weaver.patterns; import java.io.DataOutputStream; import java.io.IOException; +import java.util.Map; import org.aspectj.weaver.ISourceContext; import org.aspectj.weaver.ResolvedType; @@ -81,6 +82,14 @@ public class ThrowsPattern extends PatternNode { return this; } + public ThrowsPattern parameterizeWith(Map/*name -> resolved type*/ typeVariableMap) { + ThrowsPattern ret = new ThrowsPattern( + required.parameterizeWith(typeVariableMap), + forbidden.parameterizeWith(typeVariableMap)); + ret.copyLocationFrom(this); + return ret; + } + public boolean matches(UnresolvedType[] tys, World world) { if (this == ANY) return true; diff --git a/weaver/src/org/aspectj/weaver/patterns/WildAnnotationTypePattern.java b/weaver/src/org/aspectj/weaver/patterns/WildAnnotationTypePattern.java index 81e397033..f1a8f2899 100644 --- a/weaver/src/org/aspectj/weaver/patterns/WildAnnotationTypePattern.java +++ b/weaver/src/org/aspectj/weaver/patterns/WildAnnotationTypePattern.java @@ -11,6 +11,7 @@ package org.aspectj.weaver.patterns; import java.io.DataOutputStream; import java.io.IOException; +import java.util.Map; import org.aspectj.bridge.IMessage; import org.aspectj.bridge.MessageUtil; @@ -96,6 +97,13 @@ public class WildAnnotationTypePattern extends AnnotationTypePattern { return this; } } + + public AnnotationTypePattern parameterizeWith(Map typeVariableMap) { + WildAnnotationTypePattern ret = new WildAnnotationTypePattern(typePattern.parameterizeWith(typeVariableMap)); + ret.copyLocationFrom(this); + ret.resolved = resolved; + return ret; + } private static final byte VERSION = 1; // rev if ser. form changes /* (non-Javadoc) |