]> source.dussan.org Git - aspectj.git/commitdiff
WildTypePattern: match generic type params correctly for array types
authorAlexander Kriegisch <Alexander@Kriegisch.name>
Tue, 17 Jan 2023 14:46:18 +0000 (15:46 +0100)
committerAlexander Kriegisch <Alexander@Kriegisch.name>
Fri, 12 Apr 2024 13:32:39 +0000 (15:32 +0200)
For array reference types, match type parameters on component type, not
on array type itself.

Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/WildTypePattern.java

index a77421e56ee019f3d935dea93becc0215423b5b5..4a30f22810e342ecb65223b4c8679f1c9b841d09 100644 (file)
@@ -14,6 +14,7 @@ package org.aspectj.weaver.patterns;
 
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
@@ -25,6 +26,7 @@ import org.aspectj.bridge.MessageUtil;
 import org.aspectj.util.FileUtil;
 import org.aspectj.util.FuzzyBoolean;
 import org.aspectj.weaver.AjAttribute;
+import org.aspectj.weaver.ArrayReferenceType;
 import org.aspectj.weaver.BCException;
 import org.aspectj.weaver.BoundedReferenceType;
 import org.aspectj.weaver.CompressingDataOutputStream;
@@ -39,6 +41,7 @@ import org.aspectj.weaver.UnresolvedType;
 import org.aspectj.weaver.UnresolvedTypeVariableReferenceType;
 import org.aspectj.weaver.VersionedDataInputStream;
 import org.aspectj.weaver.WeaverMessages;
+import org.aspectj.weaver.WildcardedUnresolvedType;
 import org.aspectj.weaver.World;
 
 /**
@@ -233,7 +236,8 @@ public class WildTypePattern extends TypePattern {
                // Ensure the annotation pattern is resolved
                annotationPattern.resolve(type.getWorld());
 
-               return matchesExactlyByName(targetTypeName.replaceFirst("(\\[\\])+$", ""), 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();
@@ -242,6 +246,9 @@ public class WildTypePattern extends TypePattern {
        // we've matched against the base (or raw) type, but if this type pattern specifies parameters or
        // type variables we need to make sure we match against them too
        private boolean matchesParameters(ResolvedType aType, MatchKind staticOrDynamic) {
+               // For array reference types, match type parameters on component type, not on array type itself
+               if (aType instanceof ArrayReferenceType)
+                       aType = aType.getResolvedComponentType();
                if (!isGeneric && typeParameters.size() > 0) {
                        if (!aType.isParameterizedType()) {
                                return false;