Skip to content

Commit 0dbfc0d

Browse files
author
Leland Takamine
committed
Update SuperficialValidation to validate supertypes and superinterfaces recursively.
1 parent 9f36c57 commit 0dbfc0d

File tree

2 files changed

+89
-1
lines changed

2 files changed

+89
-1
lines changed

common/src/main/java/com/google/auto/common/SuperficialValidation.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

1818
import java.util.List;
1919
import java.util.Map;
20+
import java.util.stream.Collectors;
2021
import javax.lang.model.element.AnnotationMirror;
2122
import javax.lang.model.element.AnnotationValue;
2223
import javax.lang.model.element.AnnotationValueVisitor;
@@ -63,10 +64,13 @@ public static boolean validateElements(Iterable<? extends Element> elements) {
6364
}
6465

6566
@Override public Boolean visitType(TypeElement e, Void p) {
67+
TypeMirror superclass = e.getSuperclass();
6668
return isValidBaseElement(e)
6769
&& validateElements(e.getTypeParameters())
6870
&& validateTypes(e.getInterfaces())
69-
&& validateType(e.getSuperclass());
71+
&& validateType(superclass)
72+
&& validateElements(e.getInterfaces().stream().map(MoreTypes::asElement).collect(Collectors.toList()))
73+
&& (superclass.getKind() == TypeKind.NONE || validateElement(MoreTypes.asElement(superclass)));
7074
}
7175

7276
@Override public Boolean visitVariable(VariableElement e, Void p) {

common/src/test/java/com/google/auto/common/SuperficialValidationTest.java

+84
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,90 @@ void runAssertions() {
276276
.failsToCompile();
277277
}
278278

279+
@Test
280+
public void missingSuperclass() {
281+
JavaFileObject javaFileObject = JavaFileObjects.forSourceLines(
282+
"test.TestClass",
283+
"package test;",
284+
"",
285+
"class TestClass extends Missing {}");
286+
assertAbout(javaSource())
287+
.that(javaFileObject)
288+
.processedWith(new AssertingProcessor() {
289+
@Override
290+
void runAssertions() {
291+
TypeElement testClassElement =
292+
processingEnv.getElementUtils().getTypeElement("test.TestClass");
293+
assertThat(SuperficialValidation.validateElement(testClassElement)).isFalse();
294+
}
295+
})
296+
.failsToCompile();
297+
}
298+
299+
@Test
300+
public void missingSuperinterface() {
301+
JavaFileObject javaFileObject = JavaFileObjects.forSourceLines(
302+
"test.TestClass",
303+
"package test;",
304+
"",
305+
"class TestClass implements Missing {}");
306+
assertAbout(javaSource())
307+
.that(javaFileObject)
308+
.processedWith(new AssertingProcessor() {
309+
@Override
310+
void runAssertions() {
311+
TypeElement testClassElement =
312+
processingEnv.getElementUtils().getTypeElement("test.TestClass");
313+
assertThat(SuperficialValidation.validateElement(testClassElement)).isFalse();
314+
}
315+
})
316+
.failsToCompile();
317+
}
318+
319+
@Test
320+
public void missingGrandparentSuperclass() {
321+
JavaFileObject javaFileObject = JavaFileObjects.forSourceLines(
322+
"test.TestClass",
323+
"package test;",
324+
"",
325+
"class Parent extends Missing {}",
326+
"",
327+
"class TestClass extends Parent {}");
328+
assertAbout(javaSource())
329+
.that(javaFileObject)
330+
.processedWith(new AssertingProcessor() {
331+
@Override
332+
void runAssertions() {
333+
TypeElement testClassElement =
334+
processingEnv.getElementUtils().getTypeElement("test.TestClass");
335+
assertThat(SuperficialValidation.validateElement(testClassElement)).isFalse();
336+
}
337+
})
338+
.failsToCompile();
339+
}
340+
341+
@Test
342+
public void missingGrandparentSuperinterface() {
343+
JavaFileObject javaFileObject = JavaFileObjects.forSourceLines(
344+
"test.TestClass",
345+
"package test;",
346+
"",
347+
"interface Parent extends Missing {}",
348+
"",
349+
"class TestClass implements Parent {}");
350+
assertAbout(javaSource())
351+
.that(javaFileObject)
352+
.processedWith(new AssertingProcessor() {
353+
@Override
354+
void runAssertions() {
355+
TypeElement testClassElement =
356+
processingEnv.getElementUtils().getTypeElement("test.TestClass");
357+
assertThat(SuperficialValidation.validateElement(testClassElement)).isFalse();
358+
}
359+
})
360+
.failsToCompile();
361+
}
362+
279363
private abstract static class AssertingProcessor extends AbstractProcessor {
280364
@Override
281365
public Set<String> getSupportedAnnotationTypes() {

0 commit comments

Comments
 (0)