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

Commit 84b1484

Browse files
authored
Merge pull request #174 from google/issues/98-merge.default.value
Ignore default values when merging
2 parents 8ec314b + d1ffab4 commit 84b1484

20 files changed

+4264
-3699
lines changed

build.gradle

+18
Original file line numberDiff line numberDiff line change
@@ -579,6 +579,24 @@ eclipse.classpath {
579579
plusConfigurations.clear()
580580
plusConfigurations += [ configurations.compileClasspath ]
581581
}
582+
// Exclude everything in src except src/main
583+
eclipse.project.file.withXml {
584+
if (asNode().find { it.name() == 'filteredResources' } == null) {
585+
asNode().append(new XmlParser().parseText("""
586+
<filteredResources>
587+
<filter>
588+
<id>""" + System.currentTimeMillis() + """</id>
589+
<name>src</name>
590+
<type>9</type>
591+
<matcher>
592+
<id>org.eclipse.ui.ide.multiFilter</id>
593+
<arguments>1.0-name-matches-false-false-main</arguments>
594+
</matcher>
595+
</filter>
596+
</filteredResources>
597+
"""))
598+
}
599+
}
582600

583601
import org.gradle.plugins.ide.eclipse.model.EclipseModel
584602
extensions.create("eclipseTest", EclipseModel)

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ public void addPartialFieldAssignment(SourceBuilder code, String finalField, Str
264264
}
265265

266266
@Override
267-
public void addMergeFromValue(SourceBuilder code, String value) {
267+
public void addMergeFromValue(Block code, String value) {
268268
String propertyName = property.getName();
269269
if (propertyName.equals(value)) {
270270
propertyName = "this." + propertyName; // see issue #78

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

+5-3
Original file line numberDiff line numberDiff line change
@@ -179,11 +179,13 @@ private static void addMergeFromValueMethod(SourceBuilder code, Metadata metadat
179179
metadata.getType().getQualifiedName())
180180
.addLine(" */")
181181
.addLine("public %s mergeFrom(%s value) {", metadata.getBuilder(), metadata.getType());
182+
Block body = new Block(code);
182183
for (Property property : metadata.getProperties()) {
183-
property.getCodeGenerator().addMergeFromValue(code, "value");
184+
property.getCodeGenerator().addMergeFromValue(body, "value");
184185
}
185-
code.add(" return (%s) this;\n", metadata.getBuilder());
186-
code.addLine("}");
186+
code.add(body)
187+
.addLine(" return (%s) this;", metadata.getBuilder())
188+
.addLine("}");
187189
}
188190

189191
private static void addMergeFromBuilderMethod(SourceBuilder code, Metadata metadata) {

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

+43-5
Original file line numberDiff line numberDiff line change
@@ -168,19 +168,57 @@ public void addFinalFieldAssignment(SourceBuilder code, String finalField, Strin
168168
}
169169

170170
@Override
171-
public void addMergeFromValue(SourceBuilder code, String value) {
172-
code.addLine("%s(%s.%s());", setter(property), value, property.getGetterName());
171+
public void addMergeFromValue(Block code, String value) {
172+
Excerpt defaults = Declarations.freshBuilder(code, metadata).orNull();
173+
if (defaults != null) {
174+
code.add("if (");
175+
if (!hasDefault) {
176+
code.add("%s._unsetProperties.contains(%s.%s) || ",
177+
defaults, metadata.getPropertyEnum(), property.getAllCapsName());
178+
}
179+
if (isPrimitive) {
180+
code.add("%s.%s() != %s.%s()",
181+
value, property.getGetterName(), defaults, getter(property));
182+
} else {
183+
code.add("!%s.%s().equals(%s.%s())",
184+
value, property.getGetterName(), defaults, getter(property));
185+
}
186+
code.add(") {%n");
187+
}
188+
code.addLine(" %s(%s.%s());", setter(property), value, property.getGetterName());
189+
if (defaults != null) {
190+
code.addLine("}");
191+
}
173192
}
174193

175194
@Override
176195
public void addMergeFromBuilder(Block code, String builder) {
177-
if (!hasDefault) {
178-
Excerpt base = Declarations.upcastToGeneratedBuilder(code, metadata, builder);
196+
Excerpt base =
197+
hasDefault ? null : Declarations.upcastToGeneratedBuilder(code, metadata, builder);
198+
Excerpt defaults = Declarations.freshBuilder(code, metadata).orNull();
199+
if (defaults != null) {
200+
code.add("if (");
201+
if (!hasDefault) {
202+
code.add("!%s._unsetProperties.contains(%s.%s) && ",
203+
base, metadata.getPropertyEnum(), property.getAllCapsName())
204+
.add("(%s._unsetProperties.contains(%s.%s) ||",
205+
defaults, metadata.getPropertyEnum(), property.getAllCapsName());
206+
}
207+
if (isPrimitive) {
208+
code.add("%1$s.%2$s() != %3$s.%2$s()", builder, getter(property), defaults);
209+
} else {
210+
code.add("!%1$s.%2$s().equals(%3$s.%2$s())", builder, getter(property), defaults);
211+
}
212+
if (!hasDefault) {
213+
code.add(")");
214+
}
215+
code.add(") {%n");
216+
} else if (!hasDefault) {
179217
code.addLine("if (!%s._unsetProperties.contains(%s.%s)) {",
180218
base, metadata.getPropertyEnum(), property.getAllCapsName());
181219
}
182220
code.addLine(" %s(%s.%s());", setter(property), builder, getter(property));
183-
if (!hasDefault) {
221+
if (defaults != null || !hasDefault) {
184222
code.addLine("}");
185223
}
186224
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ public void addFinalFieldAssignment(SourceBuilder code, String finalField, Strin
369369
}
370370

371371
@Override
372-
public void addMergeFromValue(SourceBuilder code, String value) {
372+
public void addMergeFromValue(Block code, String value) {
373373
code.addLine("%s(%s.%s());", putAllMethod(property), value, property.getGetterName());
374374
}
375375

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ public void addFinalFieldAssignment(SourceBuilder code, String finalField, Strin
280280
}
281281

282282
@Override
283-
public void addMergeFromValue(SourceBuilder code, String value) {
283+
public void addMergeFromValue(Block code, String value) {
284284
code.addLine("%s(%s.%s());", addAllMethod(property), value, property.getGetterName());
285285
}
286286

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -303,7 +303,7 @@ public void addFinalFieldAssignment(SourceBuilder code, String finalField, Strin
303303
}
304304

305305
@Override
306-
public void addMergeFromValue(SourceBuilder code, String value) {
306+
public void addMergeFromValue(Block code, String value) {
307307
code.addLine("%s(%s.%s());", putAllMethod(property), value, property.getGetterName());
308308
}
309309

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ public void addFinalFieldAssignment(SourceBuilder code, String finalField, Strin
311311
}
312312

313313
@Override
314-
public void addMergeFromValue(SourceBuilder code, String value) {
314+
public void addMergeFromValue(Block code, String value) {
315315
code.addLine("%s(%s.%s());", addAllMethod(property), value, property.getGetterName());
316316
}
317317

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ public void addFinalFieldAssignment(SourceBuilder code, String finalField, Strin
163163
}
164164

165165
@Override
166-
public void addMergeFromValue(SourceBuilder code, String value) {
166+
public void addMergeFromValue(Block code, String value) {
167167
code.addLine("%s(%s.%s());", setter(property), value, property.getGetterName());
168168
}
169169

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@ public void addFinalFieldAssignment(SourceBuilder code, String finalField, Strin
323323
}
324324

325325
@Override
326-
public void addMergeFromValue(SourceBuilder code, String value) {
326+
public void addMergeFromValue(Block code, String value) {
327327
String propertyValue = value + "." + property.getGetterName() + "()";
328328
optional.invokeIfPresent(code, propertyValue, setter(property));
329329
}

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public void addPartialFieldAssignment(SourceBuilder code, String finalField, Str
117117
}
118118

119119
/** Add a merge from value for the property to the builder's source code. */
120-
public abstract void addMergeFromValue(SourceBuilder code, String value);
120+
public abstract void addMergeFromValue(Block code, String value);
121121

122122
/** Add a merge from builder for the property to the builder's source code. */
123123
public abstract void addMergeFromBuilder(Block code, String builder);

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -365,7 +365,7 @@ public void addFinalFieldAssignment(SourceBuilder code, String finalField, Strin
365365
}
366366

367367
@Override
368-
public void addMergeFromValue(SourceBuilder code, String value) {
368+
public void addMergeFromValue(Block code, String value) {
369369
code.addLine("%s(%s.%s());", putAllMethod(property), value, property.getGetterName());
370370
}
371371

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

+1-1
Original file line numberDiff line numberDiff line change
@@ -299,7 +299,7 @@ public void addFinalFieldAssignment(SourceBuilder code, String finalField, Strin
299299
}
300300

301301
@Override
302-
public void addMergeFromValue(SourceBuilder code, String value) {
302+
public void addMergeFromValue(Block code, String value) {
303303
code.addLine("%s(%s.%s());", addAllMethod(property), value, property.getGetterName());
304304
}
305305

0 commit comments

Comments
 (0)