Browse Source

WildTypePattern: match generic type params correctly for array types

For array reference types, match type parameters on component type, not
on array type itself.

Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
pull/220/head
Alexander Kriegisch 1 year ago
parent
commit
2a1ec081e1

+ 8
- 1
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/WildTypePattern.java View 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;

Loading…
Cancel
Save