Browse Source

Handle one- and multi-dimensional array return types correctly

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>
tags/V1_9_20
Alexander Kriegisch 1 year ago
parent
commit
6e79467e0a

+ 10
- 2
org.aspectj.matcher/src/main/java/org/aspectj/weaver/UnresolvedType.java View 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) {

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

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

+ 8
- 3
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/TypePattern.java View 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 {
}

}




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

Loading…
Cancel
Save