Browse Source

Improve array matching for all TypePattern subclasses

Relates to #24.

Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
tags/V1_9_20
Alexander Kriegisch 1 year ago
parent
commit
9cf956c283

+ 5
- 0
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/AndTypePattern.java View 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;

+ 5
- 0
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/AnyTypePattern.java View 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);

+ 5
- 0
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/AnyWithAnnotationTypePattern.java View 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(

+ 6
- 0
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/EllipsisTypePattern.java View 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);

+ 5
- 0
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/ExactTypePattern.java View 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;
}

+ 6
- 0
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/HasMemberTypePattern.java View 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");

+ 5
- 0
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/NoTypePattern.java View 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)
*/

+ 5
- 0
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/NotTypePattern.java View 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);

+ 5
- 0
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/OrTypePattern.java View 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);
}

+ 1
- 1
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/SignaturePattern.java View 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)) {

+ 5
- 0
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/TypeCategoryTypePattern.java View 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));

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

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

Loading…
Cancel
Save