@@ -378,6 +378,7 @@ MergeTarget newEmptyTargetForField(
378
378
static class BuilderAdapter implements MergeTarget {
379
379
380
380
private final Message .Builder builder ;
381
+ private boolean hasNestedBuilders = true ;
381
382
382
383
@ Override
383
384
public Descriptors .Descriptor getDescriptorForType () {
@@ -393,13 +394,30 @@ public Object getField(Descriptors.FieldDescriptor field) {
393
394
return builder .getField (field );
394
395
}
395
396
397
+ private Message .Builder getFieldBuilder (Descriptors .FieldDescriptor field ) {
398
+ if (hasNestedBuilders ) {
399
+ try {
400
+ return builder .getFieldBuilder (field );
401
+ } catch (UnsupportedOperationException e ) {
402
+ hasNestedBuilders = false ;
403
+ }
404
+ }
405
+ return null ;
406
+ }
407
+
396
408
@ Override
397
409
public boolean hasField (Descriptors .FieldDescriptor field ) {
398
410
return builder .hasField (field );
399
411
}
400
412
401
413
@ Override
402
414
public MergeTarget setField (Descriptors .FieldDescriptor field , Object value ) {
415
+ if (!field .isRepeated () && value instanceof MessageLite .Builder ) {
416
+ if (value != getFieldBuilder (field )) {
417
+ builder .setField (field , ((MessageLite .Builder ) value ).buildPartial ());
418
+ }
419
+ return this ;
420
+ }
403
421
builder .setField (field , value );
404
422
return this ;
405
423
}
@@ -413,12 +431,18 @@ public MergeTarget clearField(Descriptors.FieldDescriptor field) {
413
431
@ Override
414
432
public MergeTarget setRepeatedField (
415
433
Descriptors .FieldDescriptor field , int index , Object value ) {
434
+ if (value instanceof MessageLite .Builder ) {
435
+ value = ((MessageLite .Builder ) value ).buildPartial ();
436
+ }
416
437
builder .setRepeatedField (field , index , value );
417
438
return this ;
418
439
}
419
440
420
441
@ Override
421
442
public MergeTarget addRepeatedField (Descriptors .FieldDescriptor field , Object value ) {
443
+ if (value instanceof MessageLite .Builder ) {
444
+ value = ((MessageLite .Builder ) value ).buildPartial ();
445
+ }
422
446
builder .addRepeatedField (field , value );
423
447
return this ;
424
448
}
@@ -536,11 +560,19 @@ public void mergeGroup(
536
560
Message defaultInstance )
537
561
throws IOException {
538
562
if (!field .isRepeated ()) {
563
+ Message .Builder subBuilder ;
539
564
if (hasField (field )) {
540
- input .readGroup (field .getNumber (), builder .getFieldBuilder (field ), extensionRegistry );
541
- return ;
565
+ subBuilder = getFieldBuilder (field );
566
+ if (subBuilder != null ) {
567
+ input .readGroup (field .getNumber (), subBuilder , extensionRegistry );
568
+ return ;
569
+ } else {
570
+ subBuilder = newMessageFieldInstance (field , defaultInstance );
571
+ subBuilder .mergeFrom ((Message ) getField (field ));
572
+ }
573
+ } else {
574
+ subBuilder = newMessageFieldInstance (field , defaultInstance );
542
575
}
543
- Message .Builder subBuilder = newMessageFieldInstance (field , defaultInstance );
544
576
input .readGroup (field .getNumber (), subBuilder , extensionRegistry );
545
577
Object unused = setField (field , subBuilder .buildPartial ());
546
578
} else {
@@ -558,11 +590,19 @@ public void mergeMessage(
558
590
Message defaultInstance )
559
591
throws IOException {
560
592
if (!field .isRepeated ()) {
593
+ Message .Builder subBuilder ;
561
594
if (hasField (field )) {
562
- input .readMessage (builder .getFieldBuilder (field ), extensionRegistry );
563
- return ;
595
+ subBuilder = getFieldBuilder (field );
596
+ if (subBuilder != null ) {
597
+ input .readMessage (subBuilder , extensionRegistry );
598
+ return ;
599
+ } else {
600
+ subBuilder = newMessageFieldInstance (field , defaultInstance );
601
+ subBuilder .mergeFrom ((Message ) getField (field ));
602
+ }
603
+ } else {
604
+ subBuilder = newMessageFieldInstance (field , defaultInstance );
564
605
}
565
- Message .Builder subBuilder = newMessageFieldInstance (field , defaultInstance );
566
606
input .readMessage (subBuilder , extensionRegistry );
567
607
Object unused = setField (field , subBuilder .buildPartial ());
568
608
} else {
@@ -586,11 +626,14 @@ private Message.Builder newMessageFieldInstance(
586
626
public MergeTarget newMergeTargetForField (
587
627
Descriptors .FieldDescriptor field , Message defaultInstance ) {
588
628
Message .Builder subBuilder ;
589
- if (defaultInstance != null ) {
590
- subBuilder = defaultInstance .newBuilderForType ();
591
- } else {
592
- subBuilder = builder .newBuilderForField (field );
629
+ if (!field .isRepeated () && hasField (field )) {
630
+ subBuilder = getFieldBuilder (field );
631
+ if (subBuilder != null ) {
632
+ return new BuilderAdapter (subBuilder );
633
+ }
593
634
}
635
+
636
+ subBuilder = newMessageFieldInstance (field , defaultInstance );
594
637
if (!field .isRepeated ()) {
595
638
Message originalMessage = (Message ) getField (field );
596
639
if (originalMessage != null ) {
@@ -626,7 +669,7 @@ public WireFormat.Utf8Validation getUtf8Validation(Descriptors.FieldDescriptor d
626
669
627
670
@ Override
628
671
public Object finish () {
629
- return builder . buildPartial () ;
672
+ return builder ;
630
673
}
631
674
}
632
675
0 commit comments