Skip to content
This repository was archived by the owner on Oct 16, 2024. It is now read-only.

Commit 1f3e1a4

Browse files
authored
#408 Tighten value field type declarations
2 parents bc437ad + a6e5420 commit 1f3e1a4

20 files changed

+97
-53
lines changed

src/main/java/org/inferred/freebuilder/processor/GeneratedBuilder.java

+2-6
Original file line numberDiff line numberDiff line change
@@ -299,9 +299,7 @@ private void addValueType(SourceBuilder code) {
299299
datatype.getValueTypeVisibility(),
300300
datatype.getValueType().declaration(),
301301
extending(datatype.getType(), datatype.isInterfaceType()));
302-
generatorsByProperty.forEach((property, generator) -> {
303-
generator.addValueFieldDeclaration(code, property.getField());
304-
});
302+
generatorsByProperty.values().forEach(generator -> generator.addValueFieldDeclaration(code));
305303
addValueTypeConstructor(code);
306304
addValueTypeGetters(code);
307305
if (datatype.getHasToBuilderMethod()) {
@@ -448,9 +446,7 @@ private void addPartialType(SourceBuilder code) {
448446
}
449447

450448
private void addPartialFields(SourceBuilder code) {
451-
generatorsByProperty.forEach((property, generator) -> {
452-
generator.addValueFieldDeclaration(code, property.getField());
453-
});
449+
generatorsByProperty.values().forEach(generator -> generator.addValueFieldDeclaration(code));
454450
if (generatorsByProperty.values().stream().anyMatch(IS_REQUIRED)) {
455451
code.addLine(" private final %s<%s> %s;",
456452
EnumSet.class, datatype.getPropertyEnum(), UNSET_PROPERTIES);

src/main/java/org/inferred/freebuilder/processor/excerpt/BuildableList.java

+5-4
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,10 @@ private void addAddAllValues(SourceBuilder code) {
182182
}
183183

184184
private void addBuild(SourceBuilder code, String buildMethod) {
185-
code.addLine("")
186-
.addLine("%s<%s> %s() {", List.class, element.type(), buildMethod);
185+
code.addLine("");
187186
if (code.feature(GUAVA).isAvailable()) {
188-
code.addLine(" if (elements instanceof %s) {", ImmutableList.class)
187+
code.addLine("%s<%s> %s() {", ImmutableList.class, element.type(), buildMethod)
188+
.addLine(" if (elements instanceof %s) {", ImmutableList.class)
189189
.addLine(" return (%s<%s>) elements;", ImmutableList.class, element.type())
190190
.addLine(" }")
191191
.addLine(" %1$s.Builder<%2$s> values = %1$s.builder();",
@@ -195,7 +195,8 @@ private void addBuild(SourceBuilder code, String buildMethod) {
195195
.addLine(" }")
196196
.addLine(" return values.build();");
197197
} else {
198-
code.addLine(" switch (elements.size()) {")
198+
code.addLine("%s<%s> %s() {", List.class, element.type(), buildMethod)
199+
.addLine(" switch (elements.size()) {")
199200
.addLine(" case 0:")
200201
.addLine(" return %s.emptyList();", Collections.class)
201202
.addLine(" case 1:")

src/main/java/org/inferred/freebuilder/processor/property/BuildableListProperty.java

+8
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,14 @@ private BuildableListProperty(
133133
this.element = element;
134134
}
135135

136+
@Override
137+
public void addValueFieldDeclaration(SourceBuilder code) {
138+
code.addLine("private final %s<%s> %s;",
139+
code.feature(GUAVA).isAvailable() ? ImmutableList.class : List.class,
140+
element.type(),
141+
property.getField());
142+
}
143+
136144
@Override
137145
public void addBuilderFieldDeclaration(SourceBuilder code) {
138146
code.addLine("private final %1$s %2$s = new %1$s();",

src/main/java/org/inferred/freebuilder/processor/property/BuildableProperty.java

+5
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ private BuildableProperty(
9393
this.mutatorType = mutatorType;
9494
}
9595

96+
@Override
97+
public void addValueFieldDeclaration(SourceBuilder code) {
98+
code.addLine("private final %s %s;", property.getType(), property.getField());
99+
}
100+
96101
@Override
97102
public void addBuilderFieldDeclaration(SourceBuilder code) {
98103
code.addLine("private Object %s = null;", property.getField());

src/main/java/org/inferred/freebuilder/processor/property/DefaultProperty.java

+5-5
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,11 @@ public Initially initialState() {
114114
return hasDefault ? Initially.HAS_DEFAULT : Initially.REQUIRED;
115115
}
116116

117+
@Override
118+
public void addValueFieldDeclaration(SourceBuilder code) {
119+
code.addLine("private final %s %s;", property.getType(), property.getField());
120+
}
121+
117122
@Override
118123
public void addBuilderFieldDeclaration(SourceBuilder code) {
119124
code.addLine("private %s %s;", property.getType(), property.getField());
@@ -209,11 +214,6 @@ private void addGetter(SourceBuilder code) {
209214
.addLine("}");
210215
}
211216

212-
@Override
213-
public void addValueFieldDeclaration(SourceBuilder code, FieldAccess finalField) {
214-
code.add("private final %s %s;\n", property.getType(), finalField);
215-
}
216-
217217
@Override
218218
public void addFinalFieldAssignment(SourceBuilder code, Excerpt finalField, String builder) {
219219
code.addLine("%s = %s;", finalField, property.getField().on(builder));

src/main/java/org/inferred/freebuilder/processor/property/ListMultimapProperty.java

+6
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,12 @@ private static TypeMirror listMultimap(
148148
this.mutatorType = mutatorType;
149149
}
150150

151+
@Override
152+
public void addValueFieldDeclaration(SourceBuilder code) {
153+
code.addLine("private final %s<%s, %s> %s;",
154+
ImmutableListMultimap.class, keyType, valueType, property.getField());
155+
}
156+
151157
@Override
152158
public void addBuilderFieldDeclaration(SourceBuilder code) {
153159
code.addLine("private final %1$s<%2$s, %3$s> %4$s = %1$s.create();",

src/main/java/org/inferred/freebuilder/processor/property/ListProperty.java

+8
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,14 @@ private static TypeMirror wildcardSuperList(
157157
this.mutatorType = mutatorType;
158158
}
159159

160+
@Override
161+
public void addValueFieldDeclaration(SourceBuilder code) {
162+
code.addLine("private final %s<%s> %s;",
163+
code.feature(GUAVA).isAvailable() ? ImmutableList.class : List.class,
164+
elementType,
165+
property.getField());
166+
}
167+
160168
@Override
161169
public void addBuilderFieldDeclaration(SourceBuilder code) {
162170
if (code.feature(GUAVA).isAvailable()) {

src/main/java/org/inferred/freebuilder/processor/property/MapProperty.java

+9
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,15 @@ private static TypeMirror wildcardSuperMap(
144144
this.mutatorType = mutatorType;
145145
}
146146

147+
@Override
148+
public void addValueFieldDeclaration(SourceBuilder code) {
149+
code.addLine("private final %s<%s, %s> %s;",
150+
(code.feature(GUAVA).isAvailable()) ? ImmutableMap.class : Map.class,
151+
keyType,
152+
valueType,
153+
property.getField());
154+
}
155+
147156
@Override
148157
public void addBuilderFieldDeclaration(SourceBuilder code) {
149158
code.addLine("private final %1$s<%2$s, %3$s> %4$s = new %1$s<>();",

src/main/java/org/inferred/freebuilder/processor/property/MultisetProperty.java

+6
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,12 @@ private static TypeMirror multiset(
153153
this.mutatorType = mutatorType;
154154
}
155155

156+
@Override
157+
public void addValueFieldDeclaration(SourceBuilder code) {
158+
code.addLine("private final %s<%s> %s;",
159+
ImmutableMultiset.class, elementType, property.getField());
160+
}
161+
156162
@Override
157163
public void addBuilderFieldDeclaration(SourceBuilder code) {
158164
code.addLine("private final %1$s<%2$s> %3$s = %1$s.create();",

src/main/java/org/inferred/freebuilder/processor/property/NullableProperty.java

+8-9
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
import org.inferred.freebuilder.processor.Declarations;
3131
import org.inferred.freebuilder.processor.source.Excerpt;
3232
import org.inferred.freebuilder.processor.source.Excerpts;
33-
import org.inferred.freebuilder.processor.source.FieldAccess;
3433
import org.inferred.freebuilder.processor.source.FunctionalType;
3534
import org.inferred.freebuilder.processor.source.ObjectsExcerpts;
3635
import org.inferred.freebuilder.processor.source.SourceBuilder;
@@ -98,10 +97,16 @@ public Initially initialState() {
9897
return Initially.OPTIONAL;
9998
}
10099

100+
@Override
101+
public void addValueFieldDeclaration(SourceBuilder code) {
102+
addGetterAnnotations(code);
103+
code.add("private final %s %s;%n", property.getType(), property.getField());
104+
}
105+
101106
@Override
102107
public void addBuilderFieldDeclaration(SourceBuilder code) {
103108
addGetterAnnotations(code);
104-
code.add("private %s %s = null;\n", property.getType(), property.getField());
109+
code.add("private %s %s = null;%n", property.getType(), property.getField());
105110
}
106111

107112
@Override
@@ -122,7 +127,7 @@ private void addSetter(SourceBuilder code) {
122127
addAccessorAnnotations(code);
123128
code.add("public %s %s(", datatype.getBuilder(), setter(property));
124129
addGetterAnnotations(code);
125-
code.add("%s %s) {\n", property.getType(), property.getName())
130+
code.add("%s %s) {%n", property.getType(), property.getName())
126131
.addLine(" %s = %s;", property.getField(), property.getName())
127132
.addLine(" return (%s) this;", datatype.getBuilder())
128133
.addLine("}");
@@ -162,12 +167,6 @@ private void addGetter(SourceBuilder code) {
162167
.addLine("}");
163168
}
164169

165-
@Override
166-
public void addValueFieldDeclaration(SourceBuilder code, FieldAccess finalField) {
167-
addGetterAnnotations(code);
168-
code.add("private final %s %s;\n", property.getType(), finalField);
169-
}
170-
171170
@Override
172171
public void addFinalFieldAssignment(SourceBuilder code, Excerpt finalField, String builder) {
173172
code.addLine("%s = %s;", finalField, property.getField().on(builder));

src/main/java/org/inferred/freebuilder/processor/property/OptionalProperty.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
import org.inferred.freebuilder.processor.Datatype;
3535
import org.inferred.freebuilder.processor.Declarations;
3636
import org.inferred.freebuilder.processor.source.Excerpt;
37-
import org.inferred.freebuilder.processor.source.FieldAccess;
3837
import org.inferred.freebuilder.processor.source.FunctionalType;
3938
import org.inferred.freebuilder.processor.source.QualifiedName;
4039
import org.inferred.freebuilder.processor.source.SourceBuilder;
@@ -196,11 +195,11 @@ public Initially initialState() {
196195
}
197196

198197
@Override
199-
public void addValueFieldDeclaration(SourceBuilder code, FieldAccess finalField) {
198+
public void addValueFieldDeclaration(SourceBuilder code) {
200199
code.addLine("// Store a nullable object instead of an Optional. Escape analysis then")
201200
.addLine("// allows the JVM to optimize away the Optional objects created by our")
202201
.addLine("// getter method.")
203-
.addLine("private final %s %s;", elementType, finalField);
202+
.addLine("private final %s %s;", elementType, property.getField());
204203
}
205204

206205
@Override

src/main/java/org/inferred/freebuilder/processor/property/PrimitiveOptionalProperty.java

+2-3
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import org.inferred.freebuilder.processor.Declarations;
2323
import org.inferred.freebuilder.processor.model.MethodIntrospector;
2424
import org.inferred.freebuilder.processor.source.Excerpt;
25-
import org.inferred.freebuilder.processor.source.FieldAccess;
2625
import org.inferred.freebuilder.processor.source.FunctionalType;
2726
import org.inferred.freebuilder.processor.source.QualifiedName;
2827
import org.inferred.freebuilder.processor.source.SourceBuilder;
@@ -160,8 +159,8 @@ public Initially initialState() {
160159
}
161160

162161
@Override
163-
public void addValueFieldDeclaration(SourceBuilder code, FieldAccess finalField) {
164-
code.addLine("private final %s %s;", optional.type, finalField);
162+
public void addValueFieldDeclaration(SourceBuilder code) {
163+
code.addLine("private final %s %s;", optional.type, property.getField());
165164
}
166165

167166
@Override

src/main/java/org/inferred/freebuilder/processor/property/PropertyCodeGenerator.java

+1-4
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424

2525
import org.inferred.freebuilder.processor.Datatype;
2626
import org.inferred.freebuilder.processor.source.Excerpt;
27-
import org.inferred.freebuilder.processor.source.FieldAccess;
2827
import org.inferred.freebuilder.processor.source.SourceBuilder;
2928
import org.inferred.freebuilder.processor.source.Variable;
3029

@@ -136,9 +135,7 @@ public Initially initialState() {
136135
}
137136

138137
/** Add the field declaration for the property to the value's source code. */
139-
public void addValueFieldDeclaration(SourceBuilder code, FieldAccess finalField) {
140-
code.addLine("private final %s %s;", property.getType(), finalField);
141-
}
138+
public abstract void addValueFieldDeclaration(SourceBuilder code);
142139

143140
/** Add the field declaration for the property to the builder's source code. */
144141
public abstract void addBuilderFieldDeclaration(SourceBuilder code);

src/main/java/org/inferred/freebuilder/processor/property/SetMultimapProperty.java

+6
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,12 @@ private static TypeMirror setMultimap(
142142
this.mutatorType = mutatorType;
143143
}
144144

145+
@Override
146+
public void addValueFieldDeclaration(SourceBuilder code) {
147+
code.addLine("private final %s<%s, %s> %s;",
148+
ImmutableSetMultimap.class, keyType, valueType, property.getField());
149+
}
150+
145151
@Override
146152
public void addBuilderFieldDeclaration(SourceBuilder code) {
147153
code.addLine("private final %1$s<%2$s, %3$s> %4$s = %1$s.create();",

src/main/java/org/inferred/freebuilder/processor/property/SetProperty.java

+8
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,14 @@ private static TypeMirror wildcardSuperSet(
150150
this.overridesVarargsAddMethod = overridesVarargsAddMethod;
151151
}
152152

153+
@Override
154+
public void addValueFieldDeclaration(SourceBuilder code) {
155+
code.addLine("private final %s<%s> %s;",
156+
code.feature(GUAVA).isAvailable() ? ImmutableSet.class : Set.class,
157+
elementType,
158+
property.getField());
159+
}
160+
153161
@Override
154162
public void addBuilderFieldDeclaration(SourceBuilder code) {
155163
if (code.feature(GUAVA).isAvailable()) {

src/main/java/org/inferred/freebuilder/processor/property/SortedSetProperty.java

+8-10
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import org.inferred.freebuilder.processor.Declarations;
4141
import org.inferred.freebuilder.processor.excerpt.CheckedNavigableSet;
4242
import org.inferred.freebuilder.processor.source.Excerpt;
43-
import org.inferred.freebuilder.processor.source.FieldAccess;
4443
import org.inferred.freebuilder.processor.source.FunctionalType;
4544
import org.inferred.freebuilder.processor.source.PreconditionExcerpts;
4645
import org.inferred.freebuilder.processor.source.SourceBuilder;
@@ -154,6 +153,14 @@ private static TypeMirror wildcardSuperSortedSet(
154153
this.overridesVarargsAddMethod = overridesVarargsAddMethod;
155154
}
156155

156+
@Override
157+
public void addValueFieldDeclaration(SourceBuilder code) {
158+
code.addLine("private final %s<%s> %s;",
159+
code.feature(GUAVA).isAvailable() ? ImmutableSortedSet.class : SortedSet.class,
160+
elementType,
161+
property.getField());
162+
}
163+
157164
@Override
158165
public void addBuilderFieldDeclaration(SourceBuilder code) {
159166
code.addLine("private %s<%s> %s = null;", NavigableSet.class, elementType, property.getField());
@@ -449,15 +456,6 @@ private void addGetter(SourceBuilder code) {
449456
.addLine("}");
450457
}
451458

452-
@Override
453-
public void addValueFieldDeclaration(SourceBuilder code, FieldAccess finalField) {
454-
if (code.feature(GUAVA).isAvailable()) {
455-
code.addLine("private final %s<%s> %s;", ImmutableSortedSet.class, elementType, finalField);
456-
} else {
457-
code.addLine("private final %s<%s> %s;", SortedSet.class, elementType, finalField);
458-
}
459-
}
460-
461459
@Override
462460
public void addFinalFieldAssignment(SourceBuilder code, Excerpt finalField, String builder) {
463461
code.addLine("if (%s == null) {", property.getField().on(builder));

src/test/java/org/inferred/freebuilder/processor/property/ListSourceTest.java

+4-4
Original file line numberDiff line numberDiff line change
@@ -747,8 +747,8 @@ public void test_guava() {
747747
" }",
748748
"",
749749
" private static final class Value extends Person {",
750-
" private final List<String> name;",
751-
" private final List<Integer> age;",
750+
" private final ImmutableList<String> name;",
751+
" private final ImmutableList<Integer> age;",
752752
"",
753753
" private Value(Person_Builder builder) {",
754754
" this.name = ImmutableList.copyOf(builder.name);",
@@ -786,8 +786,8 @@ public void test_guava() {
786786
" }",
787787
"",
788788
" private static final class Partial extends Person {",
789-
" private final List<String> name;",
790-
" private final List<Integer> age;",
789+
" private final ImmutableList<String> name;",
790+
" private final ImmutableList<Integer> age;",
791791
"",
792792
" Partial(Person_Builder builder) {",
793793
" this.name = ImmutableList.copyOf(builder.name);",

src/test/java/org/inferred/freebuilder/processor/property/MapPropertyTest.java

-1
Original file line numberDiff line numberDiff line change
@@ -533,7 +533,6 @@ public void testJacksonInteroperability() {
533533
.addLine(" .build();")
534534
.addLine("%1$s mapper = new %1$s();", ObjectMapper.class)
535535
.addLine("String json = mapper.writeValueAsString(value);")
536-
.addLine("%s.out.println(json);", System.class)
537536
.addLine("DataType clone = mapper.readValue(json, DataType.class);")
538537
.addLine("assertThat(clone.%s).isEqualTo(%s);",
539538
convention.get(), exampleMap(0, 0, 1, 1))

src/test/java/org/inferred/freebuilder/processor/property/MapSourceTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -440,7 +440,7 @@ public void test_guava() {
440440
" }",
441441
"",
442442
" private static final class Value extends Person {",
443-
" private final Map<Integer, String> name;",
443+
" private final ImmutableMap<Integer, String> name;",
444444
"",
445445
" private Value(Person_Builder builder) {",
446446
" this.name = ImmutableMap.copyOf(builder.name);",
@@ -472,7 +472,7 @@ public void test_guava() {
472472
" }",
473473
"",
474474
" private static final class Partial extends Person {",
475-
" private final Map<Integer, String> name;",
475+
" private final ImmutableMap<Integer, String> name;",
476476
"",
477477
" Partial(Person_Builder builder) {",
478478
" this.name = ImmutableMap.copyOf(builder.name);",

src/test/java/org/inferred/freebuilder/processor/property/SetSourceTest.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -532,7 +532,7 @@ public void test_guava() {
532532
" }",
533533
"",
534534
" private static final class Value extends Person {",
535-
" private final Set<String> name;",
535+
" private final ImmutableSet<String> name;",
536536
"",
537537
" private Value(Person_Builder builder) {",
538538
" this.name = ImmutableSet.copyOf(builder.name);",
@@ -564,7 +564,7 @@ public void test_guava() {
564564
" }",
565565
"",
566566
" private static final class Partial extends Person {",
567-
" private final Set<String> name;",
567+
" private final ImmutableSet<String> name;",
568568
"",
569569
" Partial(Person_Builder builder) {",
570570
" this.name = ImmutableSet.copyOf(builder.name);",

0 commit comments

Comments
 (0)