diff --git a/value/src/it/functional/src/test/java/com/google/auto/value/AutoValueTest.java b/value/src/it/functional/src/test/java/com/google/auto/value/AutoValueTest.java index d13c96aecc..90fff21d99 100644 --- a/value/src/it/functional/src/test/java/com/google/auto/value/AutoValueTest.java +++ b/value/src/it/functional/src/test/java/com/google/auto/value/AutoValueTest.java @@ -1626,7 +1626,7 @@ public static Builder builder() { @AutoValue.Builder public interface Builder { - Builder setAnInt(Integer x); + Builder setAnInt(int x); Builder setANullableInteger(int x); @@ -1646,12 +1646,6 @@ public void testPrimitiveAndBoxed() { PrimitiveAndBoxed instance2 = instance1.toBuilder().setANullableInteger(5).build(); assertThat(instance2.aNullableInteger()).isEqualTo(5); - - try { - instance1.toBuilder().setAnInt(null); - fail(); - } catch (NullPointerException expected) { - } } @AutoValue diff --git a/value/src/main/java/com/google/auto/value/processor/BuilderMethodClassifier.java b/value/src/main/java/com/google/auto/value/processor/BuilderMethodClassifier.java index 472d22d221..3d12ebb86c 100644 --- a/value/src/main/java/com/google/auto/value/processor/BuilderMethodClassifier.java +++ b/value/src/main/java/com/google/auto/value/processor/BuilderMethodClassifier.java @@ -485,6 +485,16 @@ private Optional getSetterFunction(E propertyElement, ExecutableElement return Optional.empty(); } } + if (!parameterElement.asType().getKind().isPrimitive() + && originalPropertyType(propertyElement).getKind().isPrimitive()) { + errorReporter + .reportWarning( + setter, + "[%sUnnecessaryBoxing] %s is primitive but parameter of setter method is not", + autoWhat(), + propertyString(propertyElement)); + return Optional.empty(); + } return Optional.of(Copier.IDENTITY); } 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 e4224913cf..40a39520ab 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 @@ -4008,6 +4008,36 @@ public void kotlinMetadataAnnotationsAreImplicitlyExcludedFromCopying() { .doesNotContain("kotlin.Metadata"); } + @Test + public void autoValueBuilderNullableSetterPrimitiveGetter() { + JavaFileObject javaFileObject = + JavaFileObjects.forSourceLines( + "foo.bar.Baz", + "package foo.bar;", + "", + "import com.google.auto.value.AutoValue;", + "", + "@AutoValue", + "public abstract class Baz {", + " abstract int blam();", + "", + " @AutoValue.Builder", + " public interface Builder {", + " Builder blam(Integer x);", + " Baz build();", + " }", + "}"); + Compilation compilation = + javac() + .withProcessors(new AutoValueProcessor(), new AutoValueBuilderProcessor()) + .compile(javaFileObject); + assertThat(compilation) + .hadWarningContaining( + "property method foo.bar.Baz.blam() is primitive but parameter of setter method is not") + .inFile(javaFileObject) + .onLineContaining("Builder blam(Integer x)"); + } + private static String sorted(String... imports) { return stream(imports).sorted().collect(joining("\n")); }