aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorÉamonn McManus <emcmanus@google.com>2021-12-13 07:55:03 -0800
committerGoogle Java Core Libraries <java-libraries-firehose+copybara@google.com>2021-12-13 07:55:42 -0800
commit07f37b2be9e060f57eed3e3f5cdccab6a53f0927 (patch)
tree676ef3dd92c2f59b57497c6f7507f77fbca20c17
parent8a1d7263784327db25dd0ea943b1541a751416a5 (diff)
downloadauto-07f37b2be9e060f57eed3e3f5cdccab6a53f0927.tar.gz
Disallow `@AutoValue final class`.
We will otherwise try to generate a subclass for it which obviously won't compile. This is pretty unlikely anyway since a non-trivial `@AutoValue` class has to be abstract and a class can't be both final and abstract. Fixes https://github.com/google/auto/issues/1215. RELNOTES=n/a PiperOrigin-RevId: 416042702
-rw-r--r--value/src/main/java/com/google/auto/value/processor/AutoValueishProcessor.java9
-rw-r--r--value/src/test/java/com/google/auto/value/processor/AutoValueCompilationTest.java25
2 files changed, 32 insertions, 2 deletions
diff --git a/value/src/main/java/com/google/auto/value/processor/AutoValueishProcessor.java b/value/src/main/java/com/google/auto/value/processor/AutoValueishProcessor.java
index 56e8a98a..31f1ec1c 100644
--- a/value/src/main/java/com/google/auto/value/processor/AutoValueishProcessor.java
+++ b/value/src/main/java/com/google/auto/value/processor/AutoValueishProcessor.java
@@ -417,7 +417,7 @@ abstract class AutoValueishProcessor extends AbstractProcessor {
/**
* Validations common to all the subclasses. An {@code @AutoFoo} type must be a class, or possibly
* an interface for {@code @AutoBuilder}. If it is a class then it must have a non-private no-arg
- * constructor.
+ * constructor. And, since we'll be generating a subclass, it can't be final.
*/
private void validateType(TypeElement type) {
ElementKind kind = type.getKind();
@@ -441,6 +441,13 @@ abstract class AutoValueishProcessor extends AbstractProcessor {
simpleAnnotationName,
simpleAnnotationName);
}
+ if (type.getModifiers().contains(Modifier.FINAL)) {
+ errorReporter.abortWithError(
+ type,
+ "[%sFinal] @%s class must not be final",
+ simpleAnnotationName,
+ simpleAnnotationName);
+ }
}
/**
diff --git a/value/src/test/java/com/google/auto/value/processor/AutoValueCompilationTest.java b/value/src/test/java/com/google/auto/value/processor/AutoValueCompilationTest.java
index cd21ef37..09d4faf9 100644
--- a/value/src/test/java/com/google/auto/value/processor/AutoValueCompilationTest.java
+++ b/value/src/test/java/com/google/auto/value/processor/AutoValueCompilationTest.java
@@ -577,6 +577,29 @@ public class AutoValueCompilationTest {
}
@Test
+ public void autoValueMustNotBeFinal() {
+ JavaFileObject javaFileObject =
+ JavaFileObjects.forSourceLines(
+ "foo.bar.Baz",
+ "package foo.bar;",
+ "",
+ "import com.google.auto.value.AutoValue;",
+ "",
+ "@AutoValue",
+ "public final class Baz {",
+ " public Baz create() {",
+ " return new AutoValue_Baz();",
+ " }",
+ "}");
+ Compilation compilation =
+ javac().withProcessors(new AutoValueProcessor()).compile(javaFileObject);
+ assertThat(compilation)
+ .hadErrorContaining("@AutoValue class must not be final")
+ .inFile(javaFileObject)
+ .onLineContaining("class Baz");
+ }
+
+ @Test
public void autoValueMustBeStatic() {
JavaFileObject javaFileObject =
JavaFileObjects.forSourceLines(
@@ -603,7 +626,7 @@ public class AutoValueCompilationTest {
}
@Test
- public void autoValueMustBeNotBePrivate() {
+ public void autoValueMustNotBePrivate() {
JavaFileObject javaFileObject =
JavaFileObjects.forSourceLines(
"foo.bar.Baz",