Skip to content

Commit 328a25c

Browse files
cushonGoogle Java Core Libraries
authored andcommitted
Report a warning for setters with boxed primitive types for primitive properties
RELNOTES=Report a diagnostic for setters with boxed primitive types for primitive properties PiperOrigin-RevId: 659352853
1 parent 812a797 commit 328a25c

File tree

3 files changed

+41
-7
lines changed

3 files changed

+41
-7
lines changed

value/src/it/functional/src/test/java/com/google/auto/value/AutoValueTest.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1626,7 +1626,7 @@ public static Builder builder() {
16261626

16271627
@AutoValue.Builder
16281628
public interface Builder {
1629-
Builder setAnInt(Integer x);
1629+
Builder setAnInt(int x);
16301630

16311631
Builder setANullableInteger(int x);
16321632

@@ -1646,12 +1646,6 @@ public void testPrimitiveAndBoxed() {
16461646

16471647
PrimitiveAndBoxed instance2 = instance1.toBuilder().setANullableInteger(5).build();
16481648
assertThat(instance2.aNullableInteger()).isEqualTo(5);
1649-
1650-
try {
1651-
instance1.toBuilder().setAnInt(null);
1652-
fail();
1653-
} catch (NullPointerException expected) {
1654-
}
16551649
}
16561650

16571651
@AutoValue

value/src/main/java/com/google/auto/value/processor/BuilderMethodClassifier.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,16 @@ private Optional<Copier> getSetterFunction(E propertyElement, ExecutableElement
485485
return Optional.empty();
486486
}
487487
}
488+
if (!parameterElement.asType().getKind().isPrimitive()
489+
&& originalPropertyType(propertyElement).getKind().isPrimitive()) {
490+
errorReporter
491+
.reportWarning(
492+
setter,
493+
"[%sUnnecessaryBoxing] %s is primitive but parameter of setter method is not",
494+
autoWhat(),
495+
propertyString(propertyElement));
496+
return Optional.empty();
497+
}
488498
return Optional.of(Copier.IDENTITY);
489499
}
490500

value/src/test/java/com/google/auto/value/processor/AutoValueCompilationTest.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4008,6 +4008,36 @@ public void kotlinMetadataAnnotationsAreImplicitlyExcludedFromCopying() {
40084008
.doesNotContain("kotlin.Metadata");
40094009
}
40104010

4011+
@Test
4012+
public void autoValueBuilderNullableSetterPrimitiveGetter() {
4013+
JavaFileObject javaFileObject =
4014+
JavaFileObjects.forSourceLines(
4015+
"foo.bar.Baz",
4016+
"package foo.bar;",
4017+
"",
4018+
"import com.google.auto.value.AutoValue;",
4019+
"",
4020+
"@AutoValue",
4021+
"public abstract class Baz {",
4022+
" abstract int blam();",
4023+
"",
4024+
" @AutoValue.Builder",
4025+
" public interface Builder {",
4026+
" Builder blam(Integer x);",
4027+
" Baz build();",
4028+
" }",
4029+
"}");
4030+
Compilation compilation =
4031+
javac()
4032+
.withProcessors(new AutoValueProcessor(), new AutoValueBuilderProcessor())
4033+
.compile(javaFileObject);
4034+
assertThat(compilation)
4035+
.hadWarningContaining(
4036+
"property method foo.bar.Baz.blam() is primitive but parameter of setter method is not")
4037+
.inFile(javaFileObject)
4038+
.onLineContaining("Builder blam(Integer x)");
4039+
}
4040+
40114041
private static String sorted(String... imports) {
40124042
return stream(imports).sorted().collect(joining("\n"));
40134043
}

0 commit comments

Comments
 (0)