]> source.dussan.org Git - aspectj.git/commitdiff
Improve array matching for all TypePattern subclasses
authorAlexander Kriegisch <Alexander@Kriegisch.name>
Sun, 15 Jan 2023 00:05:47 +0000 (01:05 +0100)
committerAlexander Kriegisch <Alexander@Kriegisch.name>
Sun, 15 Jan 2023 13:41:51 +0000 (14:41 +0100)
Relates to #24.

Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
13 files changed:
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/AndTypePattern.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/AnyTypePattern.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/AnyWithAnnotationTypePattern.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/EllipsisTypePattern.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/ExactTypePattern.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/HasMemberTypePattern.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/NoTypePattern.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/NotTypePattern.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/OrTypePattern.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/SignaturePattern.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/TypeCategoryTypePattern.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/TypePattern.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/WildTypePattern.java

index 83004d468e71af9aba5c489fa259f123f3f26e45..e4099a692ad12b527fd7a439822fea6b976780b5 100644 (file)
@@ -68,6 +68,11 @@ public class AndTypePattern extends TypePattern {
                return left.matchesStatically(type) && right.matchesStatically(type);
        }
 
+       @Override
+       protected boolean matchesArray(UnresolvedType type) {
+               return left.matchesArray(type) && right.matchesArray(type);
+       }
+
        @Override
        public void setIsVarArgs(boolean isVarArgs) {
                this.isVarArgs = isVarArgs;
index 2f71e7312ac00070af22b3f01bb03d5d8018b6a9..4201f3cfb0a9134be41f6a2f674afbc939a7bd39 100644 (file)
@@ -60,6 +60,11 @@ public class AnyTypePattern extends TypePattern {
                return FuzzyBoolean.YES;
        }
 
+       @Override
+       protected boolean matchesArray(UnresolvedType type) {
+               return true;
+       }
+
        @Override
        public void write(CompressingDataOutputStream s) throws IOException {
                s.writeByte(ANY_KEY);
index eafc0ebc1cd73f230d741a4a136b4f3406135207..f0583ffcf3573c85a41a0361feae01f1fbfb6ecd 100644 (file)
@@ -82,6 +82,11 @@ public class AnyWithAnnotationTypePattern extends TypePattern {
                return FuzzyBoolean.MAYBE;
        }
 
+       @Override
+       protected boolean matchesArray(UnresolvedType type) {
+               return true;
+       }
+
        @Override
        public TypePattern parameterizeWith(Map<String,UnresolvedType> typeVariableMap, World w) {
                AnyWithAnnotationTypePattern ret = new AnyWithAnnotationTypePattern(this.annotationPattern.parameterizeWith(
index 745edb9f155f86812e1e8f3620aa53368d99b7e3..34df30df5cfd9073d022b2d757f4f9154fa61d71 100644 (file)
@@ -17,6 +17,7 @@ import java.util.Map;
 import org.aspectj.util.FuzzyBoolean;
 import org.aspectj.weaver.CompressingDataOutputStream;
 import org.aspectj.weaver.ResolvedType;
+import org.aspectj.weaver.UnresolvedType;
 import org.aspectj.weaver.World;
 
 public class EllipsisTypePattern extends TypePattern {
@@ -59,6 +60,11 @@ public class EllipsisTypePattern extends TypePattern {
                return FuzzyBoolean.NO;
        }
 
+       @Override
+       protected boolean matchesArray(UnresolvedType type) {
+               return false;
+       }
+
        @Override
        public void write(CompressingDataOutputStream s) throws IOException {
                s.writeByte(ELLIPSIS_KEY);
index 9cd6ef6e24aa3362a3255831524cbe2f0ec2b2ef..6a747a3ecad9d5014350b653842d30e1c3e10c2c 100644 (file)
@@ -177,6 +177,11 @@ public class ExactTypePattern extends TypePattern {
                return (typeMatch && annMatch);
        }
 
+       @Override
+       protected boolean matchesArray(UnresolvedType type) {
+               return type.getDimensions() == getDimensions();
+       }
+
        public UnresolvedType getType() {
                return type;
        }
index 84730b900898a8c2eaa92d6bb47e27aeb0da6ee8..be09f77baf857135bc817bbf938b4af35ef1f3c7 100644 (file)
@@ -26,6 +26,7 @@ import org.aspectj.weaver.ISourceContext;
 import org.aspectj.weaver.Member;
 import org.aspectj.weaver.ResolvedMember;
 import org.aspectj.weaver.ResolvedType;
+import org.aspectj.weaver.UnresolvedType;
 import org.aspectj.weaver.VersionedDataInputStream;
 import org.aspectj.weaver.WeaverMessages;
 import org.aspectj.weaver.World;
@@ -121,6 +122,11 @@ public class HasMemberTypePattern extends TypePattern {
                return matchesExactly(type);
        }
 
+       @Override
+       protected boolean matchesArray(UnresolvedType type) {
+               return true;
+       }
+
        @Override
        public FuzzyBoolean matchesInstanceof(ResolvedType type) {
                throw new UnsupportedOperationException("hasmethod/field do not support instanceof matching");
index aac64a1d63fa02a636e57a6cf4d2c92457c58fff..585bf34d1bf134fb4a353c732563186765a7c262 100644 (file)
@@ -49,6 +49,11 @@ public class NoTypePattern extends TypePattern {
                return false;
        }
 
+       @Override
+       protected boolean matchesArray(UnresolvedType type) {
+               return false;
+       }
+
        /**
         * @see org.aspectj.weaver.patterns.TypePattern#matchesInstanceof(ResolvedType)
         */
index dca24c8f3383fdaae5dc4f527368ebb6ee6e4c68..b5c5aee5a05156f7e222f353c6b0ff9bb1c1efa5 100644 (file)
@@ -68,6 +68,11 @@ public class NotTypePattern extends TypePattern {
                return (!negatedPattern.matchesExactly(type, annotatedType) && annotationPattern.matches(annotatedType).alwaysTrue());
        }
 
+       @Override
+       protected boolean matchesArray(UnresolvedType type) {
+               return !negatedPattern.matchesArray(type);
+       }
+
        @Override
        public boolean matchesStatically(ResolvedType type) {
                return !negatedPattern.matchesStatically(type);
index 4d0f9157fc1c1be64674c944aecea0a811527214..627c4a7d0a66300591e01436ac7ab68a24f385d3 100644 (file)
@@ -73,6 +73,11 @@ public class OrTypePattern extends TypePattern {
                return left.matchesExactly(type, annotatedType) || right.matchesExactly(type, annotatedType);
        }
 
+       @Override
+       protected boolean matchesArray(UnresolvedType type) {
+               return left.matchesArray(type) || right.matchesArray(type);
+       }
+
        public boolean matchesStatically(ResolvedType type) {
                return left.matchesStatically(type) || right.matchesStatically(type);
        }
index 5b2e021c11de9f17851877fe6285b6b7679af531..4285da575df1837f50b55e17ae0e710eee0085b5 100644 (file)
@@ -465,7 +465,7 @@ public class SignaturePattern extends PatternNode implements ISignaturePattern {
         * Matches on name, declaring type, return type, parameter types, throws types
         */
        private FuzzyBoolean matchesExactlyMethod(JoinPointSignature aMethod, World world, boolean subjectMatch) {
-               if (aMethod.getReturnType().getDimensions() != returnType.getDimensions()) {
+               if (!returnType.matchesArray(aMethod.getReturnType())) {
                        return FuzzyBoolean.NO;
                }
                if (parametersCannotMatch(aMethod)) {
index df8345e9646c19b29937987dce96a21ecbf12452..1f98d074a00b77139c0e7e0fe946e8fe72976d4d 100644 (file)
@@ -67,6 +67,11 @@ public class TypeCategoryTypePattern extends TypePattern {
                return isRightCategory(type);
        }
 
+       @Override
+       protected boolean matchesArray(UnresolvedType type) {
+               return true;
+       }
+
        @Override
        public FuzzyBoolean matchesInstanceof(ResolvedType type) {
                return FuzzyBoolean.fromBoolean(isRightCategory(type));
index 8554e28a17b9eccaa8bb4341c4966360a5794742..b0e058d4528c7c212dcfb8af6a5837dd7a2a0eb1 100644 (file)
@@ -163,9 +163,7 @@ public abstract class TypePattern extends PatternNode {
 
        protected abstract boolean matchesExactly(ResolvedType type, ResolvedType annotatedType);
 
-       protected boolean matchesArray(ResolvedType type) {
-               return type.getDimensions() == getDimensions();
-       }
+       protected abstract boolean matchesArray(UnresolvedType type);
 
        protected boolean matchesSubtypes(ResolvedType type) {
                // System.out.println("matching: " + this + " to " + type);
index 512b72b26e2bd81cf74b329ebd3004f7c407259f..e43b6ca941b13846439c4b7df4e3e4db95dc151a 100644 (file)
@@ -233,7 +233,7 @@ public class WildTypePattern extends TypePattern {
                // Ensure the annotation pattern is resolved
                annotationPattern.resolve(type.getWorld());
 
-               return matchesExactlyByName(targetTypeName, type.isAnonymous(), type.isNested()) && matchesParameters(type, STATIC)
+               return matchesExactlyByName(targetTypeName.replaceFirst("(\\[\\])+$", ""), type.isAnonymous(), type.isNested()) && matchesParameters(type, STATIC)
                                && matchesArray(type)
                                && matchesBounds(type, STATIC)
                                && annotationPattern.matches(annotatedType, type.temporaryAnnotationTypes).alwaysTrue();
@@ -252,6 +252,12 @@ public class WildTypePattern extends TypePattern {
                return true;
        }
 
+       @Override
+       protected boolean matchesArray(UnresolvedType type) {
+               return type.getDimensions() == getDimensions() ||
+                        getDimensions() == 0 && namePatterns.length > 0 && namePatterns[namePatterns.length-1].toString().endsWith("*");
+       }
+
        // we've matched against the base (or raw) type, but if this type pattern specifies bounds because
        // it is a ? extends or ? super deal then we have to match them too.
        private boolean matchesBounds(ResolvedType aType, MatchKind staticOrDynamic) {
@@ -318,19 +324,6 @@ public class WildTypePattern extends TypePattern {
                        return innerMatchesExactly(targetTypeName, isAnonymous, isNested);
                }
 
-               if (isNamePatternStar()) {
-                       // we match if the dimensions match
-                       int numDimensionsInTargetType = 0;
-                       if (dim > 0) {
-                               int index;
-                               while ((index = targetTypeName.indexOf('[')) != -1) {
-                                       numDimensionsInTargetType++;
-                                       targetTypeName = targetTypeName.substring(index + 1);
-                               }
-        return numDimensionsInTargetType == dim;
-                       }
-               }
-
                // if our pattern is length 1, then known matches are exact matches
                // if it's longer than that, then known matches are prefixes of a sort
                if (namePatterns.length == 1) {
@@ -369,7 +362,7 @@ public class WildTypePattern extends TypePattern {
                        }
                }
 
-               return innerMatchesExactly(targetTypeName.substring(0, targetTypeName.length() - dim * 2), isAnonymous, isNested);
+               return innerMatchesExactly(targetTypeName, isAnonymous, isNested);
        }
 
        private int lastIndexOfDotOrDollar(String string) {