]> source.dussan.org Git - aspectj.git/commitdiff
Handle one- and multi-dimensional array return types correctly
authorAlexander Kriegisch <Alexander@Kriegisch.name>
Mon, 9 Jan 2023 17:03:50 +0000 (18:03 +0100)
committerAlexander Kriegisch <Alexander@Kriegisch.name>
Sun, 15 Jan 2023 13:41:51 +0000 (14:41 +0100)
Fixes https://github.com/eclipse/org.aspectj/issues/24, both the array
return type matching as such as well as matching dimensionality patterns
correctly. E.g., 'Foo*[]' is not the same as 'Foo*[][]'. This also works
correctly in combination with asterisks, even for primitive types, i.e.
'in*[][]' correctly matches a 2-dimensional array of 'int'.

Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
org.aspectj.matcher/src/main/java/org/aspectj/weaver/UnresolvedType.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/ExactTypePattern.java
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/SignaturePattern.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 16e3b9879849fd0a38674922ceeeb226b9175e17..d0611868fde45f403da86b78b127ac394643f178 100644 (file)
@@ -161,6 +161,10 @@ public class UnresolvedType implements Traceable, TypeVariableDeclaringElement {
                return signature.length() > 0 && signature.charAt(0) == '[';
        }
 
+       public final int getDimensions() {
+               return signature.replaceAll("^(\\[*).*", "$1").length();
+       }
+
        /**
         * Equality is checked based on the underlying signature.
         */
@@ -169,7 +173,8 @@ public class UnresolvedType implements Traceable, TypeVariableDeclaringElement {
                if (!(other instanceof UnresolvedType)) {
                        return false;
                }
-               return signature.equals(((UnresolvedType) other).signature);
+               final UnresolvedType unresolvedOther = (UnresolvedType) other;
+               return signature.equals(unresolvedOther.signature) && getDimensions() == unresolvedOther.getDimensions();
        }
 
        /**
@@ -178,7 +183,10 @@ public class UnresolvedType implements Traceable, TypeVariableDeclaringElement {
         */
        @Override
        public int hashCode() {
-               return signature.hashCode();
+               int result = 17;
+               result = 37 * result + signature.hashCode();
+               result = 37 * result + getDimensions();
+               return result;
        }
 
        protected UnresolvedType(String signature) {
index bedbc47323eb1510776484005e65ff0847a7c465..9cd6ef6e24aa3362a3255831524cbe2f0ec2b2ef 100644 (file)
@@ -95,6 +95,10 @@ public class ExactTypePattern extends TypePattern {
                return type.isArray();
        }
 
+       public int getDimensions() {
+               return type.getDimensions();
+       }
+
        /*
         * (non-Javadoc)
         *
@@ -122,6 +126,9 @@ public class ExactTypePattern extends TypePattern {
 
        @Override
        protected boolean matchesExactly(ResolvedType matchType) {
+               if (!matchesArray(matchType)) {
+                       return false;
+               }
                boolean typeMatch = this.type.equals(matchType);
                if (!typeMatch && (matchType.isParameterizedType() || matchType.isGenericType())) {
                        typeMatch = this.type.equals(matchType.getRawType());
@@ -150,6 +157,9 @@ public class ExactTypePattern extends TypePattern {
 
        @Override
        protected boolean matchesExactly(ResolvedType matchType, ResolvedType annotatedType) {
+               if (!matchesArray(matchType)) {
+                       return false;
+               }
                boolean typeMatch = this.type.equals(matchType);
                if (!typeMatch && (matchType.isParameterizedType() || matchType.isGenericType())) {
                        typeMatch = this.type.equals(matchType.getRawType());
index 250d125b8fca69bfc71058763d9f09336c7629cb..5b2e021c11de9f17851877fe6285b6b7679af531 100644 (file)
@@ -465,6 +465,9 @@ 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()) {
+                       return FuzzyBoolean.NO;
+               }
                if (parametersCannotMatch(aMethod)) {
                        // System.err.println("Parameter types pattern " + parameterTypes + " pcount: " + aMethod.getParameterTypes().length);
                        return FuzzyBoolean.NO;
index 8deea5abfc9f7779cb6e472c336242dc59ab86df..8554e28a17b9eccaa8bb4341c4966360a5794742 100644 (file)
@@ -90,6 +90,10 @@ public abstract class TypePattern extends PatternNode {
                return false;
        }
 
+       public int getDimensions() {
+               return 0;
+       }
+
        protected TypePattern(boolean includeSubtypes) {
                this(includeSubtypes, false);
        }
@@ -159,6 +163,10 @@ public abstract class TypePattern extends PatternNode {
 
        protected abstract boolean matchesExactly(ResolvedType type, ResolvedType annotatedType);
 
+       protected boolean matchesArray(ResolvedType type) {
+               return type.getDimensions() == getDimensions();
+       }
+
        protected boolean matchesSubtypes(ResolvedType type) {
                // System.out.println("matching: " + this + " to " + type);
                if (matchesExactly(type)) {
@@ -355,6 +363,3 @@ public abstract class TypePattern extends PatternNode {
        }
 
 }
-
-
-
index 37653a9cc83c3202e63b6bf81c38673de161ff22..512b72b26e2bd81cf74b329ebd3004f7c407259f 100644 (file)
@@ -234,6 +234,7 @@ public class WildTypePattern extends TypePattern {
                annotationPattern.resolve(type.getWorld());
 
                return matchesExactlyByName(targetTypeName, type.isAnonymous(), type.isNested()) && matchesParameters(type, STATIC)
+                               && matchesArray(type)
                                && matchesBounds(type, STATIC)
                                && annotationPattern.matches(annotatedType, type.temporaryAnnotationTypes).alwaysTrue();
        }
@@ -368,7 +369,7 @@ public class WildTypePattern extends TypePattern {
                        }
                }
 
-               return innerMatchesExactly(targetTypeName, isAnonymous, isNested);
+               return innerMatchesExactly(targetTypeName.substring(0, targetTypeName.length() - dim * 2), isAnonymous, isNested);
        }
 
        private int lastIndexOfDotOrDollar(String string) {