Skip to content

Commit

Permalink
fixup! add support to traverse JavaType signature
Browse files Browse the repository at this point in the history
Review: Make test ensure correct visitation method is called
Signed-off-by: Peter Gafert <peter.gafert@archunit.org>
  • Loading branch information
codecholeric committed Apr 7, 2024
1 parent f002cbb commit 464b1dd
Showing 1 changed file with 78 additions and 24 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,13 @@ class SimpleClass {
JavaClass clazz = new ClassFileImporter().importClass(SimpleClass.class);

List<JavaType> traversedClasses = new ArrayList<>();
clazz.traverseSignature(newTrackingVisitor(traversedClasses));
clazz.traverseSignature(new AllRejectingSignatureVisitor() {
@Override
public Result visitClass(JavaClass type) {
traversedClasses.add(type);
return Result.STOP;
}
});

assertThatTypes(traversedClasses).matchExactly(SimpleClass.class);
}
Expand All @@ -39,13 +45,15 @@ class SimpleClass {
JavaType arrayType = new ClassFileImporter().importClass(SimpleClass.class).getField("field").getType();

List<JavaType> traversedClasses = new ArrayList<>();
arrayType.traverseSignature(newTrackingVisitor(traversedClasses));
arrayType.traverseSignature(new AllRejectingSignatureVisitor() {
@Override
public Result visitArrayType(JavaClass type) {
traversedClasses.add(type);
return Result.STOP;
}
});

assertThatTypes(traversedClasses).matchExactly(
SimpleClass[][].class,
SimpleClass[].class,
SimpleClass.class
);
assertThatTypes(traversedClasses).matchExactly(SimpleClass[][].class);
}

@Test
Expand All @@ -60,12 +68,15 @@ class SomeClass<T> {
.getType();

List<JavaType> traversedTypes = new ArrayList<>();
typeVariable.traverseSignature(newTrackingVisitor(traversedTypes));
typeVariable.traverseSignature(new AllRejectingSignatureVisitor() {
@Override
public Result visitTypeVariable(JavaTypeVariable<?> type) {
traversedTypes.add(type);
return Result.STOP;
}
});

assertThat(traversedTypes).containsOnly(
typeVariable,
typeVariable.getBounds().get(0) // implicitly java.lang.Object
);
assertThat(traversedTypes).containsOnly(typeVariable);
}

@Test
Expand All @@ -80,12 +91,15 @@ class SomeClass {
.getType();

List<JavaType> traversedTypes = new ArrayList<>();
parameterizedType.traverseSignature(newTrackingVisitor(traversedTypes));
parameterizedType.traverseSignature(new AllRejectingSignatureVisitor() {
@Override
public Result visitParameterizedType(JavaParameterizedType type) {
traversedTypes.add(type);
return Result.STOP;
}
});

assertThat(traversedTypes).containsOnly(
parameterizedType,
getOnlyElement(parameterizedType.getActualTypeArguments())
);
assertThat(traversedTypes).containsOnly(parameterizedType);
}

@Test
Expand All @@ -102,7 +116,13 @@ class SomeClass {
JavaWildcardType wildcardType = (JavaWildcardType) getOnlyElement(parameterizedType.getActualTypeArguments());

List<JavaType> traversedTypes = new ArrayList<>();
wildcardType.traverseSignature(newTrackingVisitor(traversedTypes));
wildcardType.traverseSignature(new AllRejectingSignatureVisitor() {
@Override
public Result visitWildcardType(JavaWildcardType type) {
traversedTypes.add(type);
return Result.STOP;
}
});

assertThat(traversedTypes).containsOnly(wildcardType);
}
Expand All @@ -119,13 +139,15 @@ class SomeClass<T> {
.getType();

List<JavaType> traversedTypes = new ArrayList<>();
genericArrayType.traverseSignature(newTrackingVisitor(traversedTypes));
genericArrayType.traverseSignature(new AllRejectingSignatureVisitor() {
@Override
public Result visitGenericArrayType(JavaGenericArrayType type) {
traversedTypes.add(type);
return Result.STOP;
}
});

assertThat(traversedTypes).containsOnly(
genericArrayType,
genericArrayType.getComponentType(),
((JavaTypeVariable<?>) genericArrayType.getComponentType()).getBounds().get(0) // implicitly java.lang.Object
);
assertThat(traversedTypes).containsOnly(genericArrayType);
}

@Test
Expand Down Expand Up @@ -383,4 +405,36 @@ <T extends JavaType> T expect(JavaType javaType) {
return (T) javaType;
}
}

private static class AllRejectingSignatureVisitor implements JavaType.SignatureVisitor {
@Override
public Result visitClass(JavaClass type) {
throw new UnsupportedOperationException("should not be called");
}

@Override
public Result visitArrayType(JavaClass type) {
throw new UnsupportedOperationException("should not be called");
}

@Override
public Result visitParameterizedType(JavaParameterizedType type) {
throw new UnsupportedOperationException("should not be called");
}

@Override
public Result visitTypeVariable(JavaTypeVariable<?> type) {
throw new UnsupportedOperationException("should not be called");
}

@Override
public Result visitGenericArrayType(JavaGenericArrayType type) {
throw new UnsupportedOperationException("should not be called");
}

@Override
public Result visitWildcardType(JavaWildcardType type) {
throw new UnsupportedOperationException("should not be called");
}
}
}

0 comments on commit 464b1dd

Please sign in to comment.