Skip to content

Commit 2c98c18

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

File tree

2 files changed

+133
-1
lines changed

2 files changed

+133
-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+
&& e.getInterfaces().stream().map(MoreTypes::asElement).allMatch(SuperficialValidation::validateElement)
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

+128
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@
1919
import static com.google.common.truth.Truth.assertThat;
2020
import static com.google.common.truth.Truth.assertWithMessage;
2121
import static com.google.testing.compile.JavaSourceSubjectFactory.javaSource;
22+
import static com.google.testing.compile.JavaSourcesSubjectFactory.javaSources;
2223

24+
import com.google.common.collect.ImmutableList;
2325
import com.google.common.collect.ImmutableSet;
2426
import com.google.testing.compile.JavaFileObjects;
2527
import java.util.Set;
@@ -199,6 +201,42 @@ public void handlesRecursiveType() {
199201
.compilesWithoutError();
200202
}
201203

204+
@Test
205+
public void handlesRecursiveSuperinterface() {
206+
JavaFileObject javaFileObject = JavaFileObjects.forSourceLines(
207+
"test.TestClass",
208+
"package test;",
209+
"",
210+
"interface TestClass implements TestClass {}");
211+
assertAbout(javaSource())
212+
.that(javaFileObject)
213+
.processedWith(new AssertingProcessor() {
214+
@Override
215+
void runAssertions() {
216+
assertWithMessage("Should not reach annotation processing.").fail();
217+
}
218+
})
219+
.failsToCompile();
220+
}
221+
222+
@Test
223+
public void handlesRecursiveSuperclass() {
224+
JavaFileObject javaFileObject = JavaFileObjects.forSourceLines(
225+
"test.TestClass",
226+
"package test;",
227+
"",
228+
"class TestClass extends TestClass {}");
229+
assertAbout(javaSource())
230+
.that(javaFileObject)
231+
.processedWith(new AssertingProcessor() {
232+
@Override
233+
void runAssertions() {
234+
assertWithMessage("Should not reach annotation processing.").fail();
235+
}
236+
})
237+
.failsToCompile();
238+
}
239+
202240
@Test
203241
public void missingWildcardBound() {
204242
JavaFileObject javaFileObject = JavaFileObjects.forSourceLines(
@@ -276,6 +314,96 @@ void runAssertions() {
276314
.failsToCompile();
277315
}
278316

317+
@Test
318+
public void missingSuperclass() {
319+
JavaFileObject javaFileObject = JavaFileObjects.forSourceLines(
320+
"test.TestClass",
321+
"package test;",
322+
"",
323+
"class TestClass extends Missing {}");
324+
assertAbout(javaSource())
325+
.that(javaFileObject)
326+
.processedWith(new AssertingProcessor() {
327+
@Override
328+
void runAssertions() {
329+
TypeElement testClassElement =
330+
processingEnv.getElementUtils().getTypeElement("test.TestClass");
331+
assertThat(SuperficialValidation.validateElement(testClassElement)).isFalse();
332+
}
333+
})
334+
.failsToCompile();
335+
}
336+
337+
@Test
338+
public void missingSuperinterface() {
339+
JavaFileObject javaFileObject = JavaFileObjects.forSourceLines(
340+
"test.TestClass",
341+
"package test;",
342+
"",
343+
"class TestClass implements Missing {}");
344+
assertAbout(javaSource())
345+
.that(javaFileObject)
346+
.processedWith(new AssertingProcessor() {
347+
@Override
348+
void runAssertions() {
349+
TypeElement testClassElement =
350+
processingEnv.getElementUtils().getTypeElement("test.TestClass");
351+
assertThat(SuperficialValidation.validateElement(testClassElement)).isFalse();
352+
}
353+
})
354+
.failsToCompile();
355+
}
356+
357+
@Test
358+
public void missingGrandparentSuperclass() {
359+
JavaFileObject parentJavaFileObject = JavaFileObjects.forSourceLines(
360+
"test.Parent",
361+
"package test;",
362+
"",
363+
"class Parent extends Missing {}");
364+
JavaFileObject testClassJavaFileObject = JavaFileObjects.forSourceLines(
365+
"test.TestClass",
366+
"package test;",
367+
"",
368+
"class TestClass extends Parent {}");
369+
assertAbout(javaSources())
370+
.that(ImmutableList.of(parentJavaFileObject, testClassJavaFileObject))
371+
.processedWith(new AssertingProcessor() {
372+
@Override
373+
void runAssertions() {
374+
TypeElement testClassElement =
375+
processingEnv.getElementUtils().getTypeElement("test.TestClass");
376+
assertThat(SuperficialValidation.validateElement(testClassElement)).isFalse();
377+
}
378+
})
379+
.failsToCompile();
380+
}
381+
382+
@Test
383+
public void missingGrandparentSuperinterface() {
384+
JavaFileObject parentJavaFileObject = JavaFileObjects.forSourceLines(
385+
"test.Parent",
386+
"package test;",
387+
"",
388+
"interface Parent extends Missing {}");
389+
JavaFileObject testClassJavaFileObject = JavaFileObjects.forSourceLines(
390+
"test.TestClass",
391+
"package test;",
392+
"",
393+
"class TestClass implements Parent {}");
394+
assertAbout(javaSources())
395+
.that(ImmutableList.of(parentJavaFileObject, testClassJavaFileObject))
396+
.processedWith(new AssertingProcessor() {
397+
@Override
398+
void runAssertions() {
399+
TypeElement testClassElement =
400+
processingEnv.getElementUtils().getTypeElement("test.TestClass");
401+
assertThat(SuperficialValidation.validateElement(testClassElement)).isFalse();
402+
}
403+
})
404+
.failsToCompile();
405+
}
406+
279407
private abstract static class AssertingProcessor extends AbstractProcessor {
280408
@Override
281409
public Set<String> getSupportedAnnotationTypes() {

0 commit comments

Comments
 (0)