Browse Source

Enable type parameter traversal in exact type patterns

Closes #221

Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
pull/212/head
Alexander Kriegisch 1 year ago
parent
commit
97d8f7339e

+ 2
- 2
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/BindingTypePattern.java View File

@@ -29,7 +29,7 @@ public class BindingTypePattern extends ExactTypePattern implements BindingPatte
private String bindingName;

public BindingTypePattern(UnresolvedType type, int index, boolean isVarArgs) {
super(type, false, isVarArgs);
super(type, false, isVarArgs, null);
this.formalIndex = index;
}

@@ -89,7 +89,7 @@ public class BindingTypePattern extends ExactTypePattern implements BindingPatte

public TypePattern remapAdviceFormals(IntMap bindings) {
if (!bindings.hasKey(formalIndex)) {
return new ExactTypePattern(type, false, isVarArgs);
return new ExactTypePattern(type, false, isVarArgs, null);
} else {
int newFormalIndex = bindings.get(formalIndex);
return new BindingTypePattern(type, newFormalIndex, isVarArgs);

+ 11
- 7
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/ExactTypePattern.java View File

@@ -79,14 +79,14 @@ public class ExactTypePattern extends TypePattern {
if (type.isArray() && this.type.isArray()) {
ResolvedType componentType = type.getComponentType().resolve(type.getWorld());
UnresolvedType newPatternType = this.type.getComponentType();
ExactTypePattern etp = new ExactTypePattern(newPatternType, includeSubtypes, false);
ExactTypePattern etp = new ExactTypePattern(newPatternType, includeSubtypes, false, typeParameters);
return etp.matchesSubtypes(componentType, type);
}
return match;
}

public ExactTypePattern(UnresolvedType type, boolean includeSubtypes, boolean isVarArgs) {
super(includeSubtypes, isVarArgs);
public ExactTypePattern(UnresolvedType type, boolean includeSubtypes, boolean isVarArgs, TypePatternList typeParams) {
super(includeSubtypes, isVarArgs, typeParams);
this.type = type;
}

@@ -283,8 +283,12 @@ public class ExactTypePattern extends TypePattern {
if (version > EXACT_VERSION) {
throw new BCException("ExactTypePattern was written by a more recent version of AspectJ");
}
TypePattern ret = new ExactTypePattern(s.isAtLeast169() ? s.readSignatureAsUnresolvedType() : UnresolvedType.read(s), s
.readBoolean(), s.readBoolean());
TypePattern ret = new ExactTypePattern(
s.isAtLeast169() ? s.readSignatureAsUnresolvedType() : UnresolvedType.read(s),
s.readBoolean(),
s.readBoolean(),
null // set null first, use 'setTypeParameters' below
);
ret.setAnnotationTypePattern(AnnotationTypePattern.read(s, context));
ret.setTypeParameters(TypePatternList.read(s, context));
ret.readLocation(context, s);
@@ -292,7 +296,7 @@ public class ExactTypePattern extends TypePattern {
}

public static TypePattern readTypePatternOldStyle(DataInputStream s, ISourceContext context) throws IOException {
TypePattern ret = new ExactTypePattern(UnresolvedType.read(s), s.readBoolean(), false);
TypePattern ret = new ExactTypePattern(UnresolvedType.read(s), s.readBoolean(), false, null);
ret.readLocation(context, s);
return ret;
}
@@ -342,7 +346,7 @@ public class ExactTypePattern extends TypePattern {
} else if (type.isParameterizedType()) {
newType = w.resolve(type).parameterize(typeVariableMap);
}
ExactTypePattern ret = new ExactTypePattern(newType, includeSubtypes, isVarArgs);
ExactTypePattern ret = new ExactTypePattern(newType, includeSubtypes, isVarArgs, typeParameters);
ret.annotationPattern = annotationPattern.parameterizeWith(typeVariableMap, w);
ret.copyLocationFrom(this);
return ret;

+ 2
- 0
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/HasMemberTypePattern.java View File

@@ -198,8 +198,10 @@ public class HasMemberTypePattern extends TypePattern {
return visitor.visit(this, data);
}

@Override
public Object traverse(PatternNodeVisitor visitor, Object data) {
Object ret = accept(visitor, data);
super.traverse(visitor, ret);
if (this.signaturePattern != null)
this.signaturePattern.traverse(visitor, ret);
return ret;

+ 9
- 0
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/TypePattern.java View File

@@ -360,4 +360,13 @@ public abstract class TypePattern extends PatternNode {
return false;
}

@Override
public Object traverse(PatternNodeVisitor visitor, Object data) {
Object ret = accept(visitor, data);
if (annotationPattern != null)
annotationPattern.traverse(visitor, ret);
if (typeParameters != null)
typeParameters.traverse(visitor, ret);
return ret;
}
}

+ 17
- 3
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/TypeVariablePattern.java View File

@@ -45,7 +45,7 @@ public class TypeVariablePattern extends PatternNode {
*/
public TypeVariablePattern(String variableName) {
this.name = variableName;
this.upperBound = new ExactTypePattern(UnresolvedType.OBJECT, false, false);
this.upperBound = new ExactTypePattern(UnresolvedType.OBJECT, false, false, null);
this.lowerBound = null;
this.interfaceBounds = null;
}
@@ -67,7 +67,7 @@ public class TypeVariablePattern extends PatternNode {
this.name = variableName;
this.upperBound = upperLimit;
if (upperBound == null) {
upperBound = new ExactTypePattern(UnresolvedType.OBJECT, false, false);
upperBound = new ExactTypePattern(UnresolvedType.OBJECT, false, false, null);
}
this.interfaceBounds = interfaceBounds;
this.lowerBound = lowerBound;
@@ -77,7 +77,21 @@ public class TypeVariablePattern extends PatternNode {
return visitor.visit(this, data);
}

public String getName() {
public Object traverse(PatternNodeVisitor visitor, Object data) {
Object ret = accept(visitor, data);
if (lowerBound != null)
lowerBound.traverse(visitor, ret);
if (upperBound != null)
upperBound.traverse(visitor, ret);
if (interfaceBounds != null) {
for (TypePattern pattern : interfaceBounds) {
pattern.traverse(visitor, ret);
}
}
return ret;
}

public String getName() {
return name;
}


+ 1
- 0
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/TypeVariablePatternList.java View File

@@ -73,6 +73,7 @@ public class TypeVariablePatternList extends PatternNode {
return visitor.visit(this, data);
}

@Override
public Object traverse(PatternNodeVisitor visitor, Object data) {
Object ret = accept(visitor, data);
if (patterns != null) {

+ 1
- 1
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/WildAnnotationTypePattern.java View File

@@ -299,7 +299,7 @@ public class WildAnnotationTypePattern extends AnnotationTypePattern {
if (fullyQualifiedName != null && fullyQualifiedName.contains(".")) {
ResolvedType resolvedType = world.resolve(UnresolvedType.forName(fullyQualifiedName));
if (resolvedType != null && !resolvedType.isMissing()) {
typePattern = new ExactTypePattern(resolvedType, false, false);
typePattern = new ExactTypePattern(resolvedType, false, false, null);
}
}
}

+ 5
- 5
org.aspectj.matcher/src/main/java/org/aspectj/weaver/patterns/WildTypePattern.java View File

@@ -804,7 +804,7 @@ public class WildTypePattern extends TypePattern {
if (dim != 0) {
aType = UnresolvedType.makeArray(aType, dim);
}
ret = new ExactTypePattern(aType, includeSubtypes, isVarArgs);
ret = new ExactTypePattern(aType, includeSubtypes, isVarArgs, typeParameters);
}
ret.setAnnotationTypePattern(annotationPattern);
ret.copyLocationFrom(this);
@@ -841,7 +841,7 @@ public class WildTypePattern extends TypePattern {
}
if (canBeExact) {
// might have changed if we find out include subtypes is set on one of the bounds...
return new ExactTypePattern(type, includeSubtypes, isVarArgs);
return new ExactTypePattern(type, includeSubtypes, isVarArgs, typeParameters);
}
}

@@ -878,7 +878,7 @@ public class WildTypePattern extends TypePattern {
if (dim != 0) {
type = ResolvedType.makeArray(type, dim);
}
return new ExactTypePattern(type, includeSubtypes, isVarArgs);
return new ExactTypePattern(type, includeSubtypes, isVarArgs, typeParameters);
} else {
// AMC... just leave it as a wild type pattern then?
importedPrefixes = scope.getImportedPrefixes();
@@ -940,7 +940,7 @@ public class WildTypePattern extends TypePattern {
if (dim != 0) {
rType = ResolvedType.makeArray(rType, dim);
}
return new ExactTypePattern(rType, includeSubtypes, isVarArgs);
return new ExactTypePattern(rType, includeSubtypes, isVarArgs, typeParameters);
} else {
// we have to set bounds on the TypeVariable held by tvrType before resolving it
boolean canCreateExactTypePattern = true;
@@ -973,7 +973,7 @@ public class WildTypePattern extends TypePattern {
if (dim != 0) {
rType = ResolvedType.makeArray(rType, dim);
}
return new ExactTypePattern(rType, includeSubtypes, isVarArgs);
return new ExactTypePattern(rType, includeSubtypes, isVarArgs, typeParameters);
}
return this; // leave as wild type pattern then
}

+ 1
- 1
org.aspectj.matcher/src/test/java/org/aspectj/weaver/patterns/ParserTestCase.java View File

@@ -290,7 +290,7 @@ public class ParserTestCase extends PatternsTestCase {
public void testParseAllowedSuperInTypeVariable() {
PatternParser parser = new PatternParser("T super Number+");
TypeVariablePattern tv = parser.parseTypeVariable();
TypeVariablePattern expected = new TypeVariablePattern("T", new ExactTypePattern(UnresolvedType.OBJECT, false, false),
TypeVariablePattern expected = new TypeVariablePattern("T", new ExactTypePattern(UnresolvedType.OBJECT, false, false, null),
null, new PatternParser("Number+").parseTypePattern());
assertEquals("Expected type variable T super Number+", expected, tv);
}

Loading…
Cancel
Save