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

Commit 930c769

Browse files
authored
Merge pull request #243 from google/nullable.merge.bug
Handle defaults correctly when merging Nullable properties
2 parents cfa71c7 + 78055c2 commit 930c769

File tree

3 files changed

+486
-20
lines changed

3 files changed

+486
-20
lines changed

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

+28-2
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616
package org.inferred.freebuilder.processor;
1717

1818
import static com.google.common.base.MoreObjects.firstNonNull;
19+
import static javax.lang.model.type.TypeKind.DECLARED;
1920
import static org.inferred.freebuilder.processor.BuilderMethods.getter;
2021
import static org.inferred.freebuilder.processor.BuilderMethods.mapper;
2122
import static org.inferred.freebuilder.processor.BuilderMethods.setter;
23+
import static org.inferred.freebuilder.processor.util.ObjectsExcerpts.Nullability.NULLABLE;
2224
import static org.inferred.freebuilder.processor.util.feature.FunctionPackage.FUNCTION_PACKAGE;
2325

2426
import com.google.common.annotations.VisibleForTesting;
@@ -29,6 +31,8 @@
2931
import org.inferred.freebuilder.processor.PropertyCodeGenerator.Config;
3032
import org.inferred.freebuilder.processor.util.Block;
3133
import org.inferred.freebuilder.processor.util.Excerpt;
34+
import org.inferred.freebuilder.processor.util.Excerpts;
35+
import org.inferred.freebuilder.processor.util.ObjectsExcerpts;
3236
import org.inferred.freebuilder.processor.util.ParameterizedType;
3337
import org.inferred.freebuilder.processor.util.PreconditionExcerpts;
3438
import org.inferred.freebuilder.processor.util.SourceBuilder;
@@ -164,12 +168,34 @@ public void addFinalFieldAssignment(SourceBuilder code, String finalField, Strin
164168

165169
@Override
166170
public void addMergeFromValue(Block code, String value) {
167-
code.addLine("%s(%s.%s());", setter(property), value, property.getGetterName());
171+
Excerpt defaults = Declarations.freshBuilder(code, metadata).orNull();
172+
if (defaults != null) {
173+
code.addLine("if (%s) {", ObjectsExcerpts.notEquals(
174+
Excerpts.add("%s.%s()", value, property.getGetterName()),
175+
Excerpts.add("%s.%s()", defaults, getter(property)),
176+
DECLARED,
177+
NULLABLE));
178+
}
179+
code.addLine(" %s(%s.%s());", setter(property), value, property.getGetterName());
180+
if (defaults != null) {
181+
code.addLine("}");
182+
}
168183
}
169184

170185
@Override
171186
public void addMergeFromBuilder(Block code, String builder) {
172-
code.addLine("%s(%s.%s());", setter(property), builder, getter(property));
187+
Excerpt defaults = Declarations.freshBuilder(code, metadata).orNull();
188+
if (defaults != null) {
189+
code.addLine("if (%s) {", ObjectsExcerpts.notEquals(
190+
Excerpts.add("%s.%s()", builder, getter(property)),
191+
Excerpts.add("%s.%s()", defaults, getter(property)),
192+
DECLARED,
193+
NULLABLE));
194+
}
195+
code.addLine(" %s(%s.%s());", setter(property), builder, getter(property));
196+
if (defaults != null) {
197+
code.addLine("}");
198+
}
173199
}
174200

175201
@Override

0 commit comments

Comments
 (0)