aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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",