22
22
@ Generated ("org.inferred.freebuilder.processor.Processor" )
23
23
abstract class BuildableType_Builder {
24
24
25
- /** Creates a new builder using {@code value} as a template. */
25
+ /**
26
+ * Creates a new builder using {@code value} as a template.
27
+ *
28
+ * <p>If {@code value} is a partial, the builder will return more partials.
29
+ */
26
30
public static BuildableType .Builder from (BuildableType value ) {
27
- return new BuildableType .Builder ().mergeFrom (value );
31
+ if (value instanceof Rebuildable ) {
32
+ return ((Rebuildable ) value ).toBuilder ();
33
+ } else {
34
+ return new BuildableType .Builder ().mergeFrom (value );
35
+ }
28
36
}
29
37
30
38
private enum Property {
@@ -380,6 +388,10 @@ public BuildableType build() {
380
388
* will not be performed. Unset properties will throw an {@link UnsupportedOperationException}
381
389
* when accessed via the partial object.
382
390
*
391
+ * <p>The builder returned by {@link BuildableType.Builder#from(BuildableType)} will propagate the
392
+ * partial status of its input, overriding {@link BuildableType.Builder#build() build()} to return
393
+ * another partial. This allows for robust tests of modify-rebuild code.
394
+ *
383
395
* <p>Partials should only ever be used in tests. They permit writing robust test cases that won't
384
396
* fail if this type gains more application-level constraints (e.g. new required fields) in
385
397
* future. If you require partially complete values in production code, consider using a Builder.
@@ -389,7 +401,11 @@ public BuildableType buildPartial() {
389
401
return new Partial (this );
390
402
}
391
403
392
- private static final class Value extends BuildableType {
404
+ private abstract static class Rebuildable extends BuildableType {
405
+ public abstract Builder toBuilder ();
406
+ }
407
+
408
+ private static final class Value extends Rebuildable {
393
409
private final Type type ;
394
410
private final Type builderType ;
395
411
private final MergeBuilderMethod mergeBuilder ;
@@ -436,6 +452,19 @@ public Excerpt suppressUnchecked() {
436
452
return suppressUnchecked ;
437
453
}
438
454
455
+ @ Override
456
+ public Builder toBuilder () {
457
+ BuildableType_Builder builder = new Builder ();
458
+ builder .type = type ;
459
+ builder .builderType = builderType ;
460
+ builder .mergeBuilder = mergeBuilder ;
461
+ builder .partialToBuilder = partialToBuilder ;
462
+ builder .builderFactory = builderFactory ;
463
+ builder .suppressUnchecked = suppressUnchecked ;
464
+ builder ._unsetProperties .clear ();
465
+ return (Builder ) builder ;
466
+ }
467
+
439
468
@ Override
440
469
public boolean equals (Object obj ) {
441
470
if (!(obj instanceof Value )) {
@@ -474,7 +503,7 @@ public String toString() {
474
503
}
475
504
}
476
505
477
- private static final class Partial extends BuildableType {
506
+ private static final class Partial extends Rebuildable {
478
507
private final Type type ;
479
508
private final Type builderType ;
480
509
private final MergeBuilderMethod mergeBuilder ;
@@ -541,6 +570,27 @@ public Excerpt suppressUnchecked() {
541
570
return suppressUnchecked ;
542
571
}
543
572
573
+ private static class PartialBuilder extends Builder {
574
+ @ Override
575
+ public BuildableType build () {
576
+ return buildPartial ();
577
+ }
578
+ }
579
+
580
+ @ Override
581
+ public Builder toBuilder () {
582
+ BuildableType_Builder builder = new PartialBuilder ();
583
+ builder .type = type ;
584
+ builder .builderType = builderType ;
585
+ builder .mergeBuilder = mergeBuilder ;
586
+ builder .partialToBuilder = partialToBuilder ;
587
+ builder .builderFactory = builderFactory ;
588
+ builder .suppressUnchecked = suppressUnchecked ;
589
+ builder ._unsetProperties .clear ();
590
+ builder ._unsetProperties .addAll (_unsetProperties );
591
+ return (Builder ) builder ;
592
+ }
593
+
544
594
@ Override
545
595
public boolean equals (Object obj ) {
546
596
if (!(obj instanceof Partial )) {
0 commit comments