@@ -201,7 +201,7 @@ private static void addMergeFromBuilderMethod(SourceBuilder code, Metadata metad
201
201
.addLine (" * Does not affect any properties not set on the input." )
202
202
.addLine (" */" )
203
203
.addLine ("public %1$s mergeFrom(%1$s template) {" , metadata .getBuilder ());
204
- Block body = Block . methodBody (code , "template" );
204
+ Block body = methodBody (code , "template" );
205
205
for (Property property : metadata .getProperties ()) {
206
206
property .getCodeGenerator ().addMergeFromBuilder (body , "template" );
207
207
}
@@ -425,66 +425,68 @@ private static void addValueTypeToString(SourceBuilder code, Metadata metadata)
425
425
code .addLine ("" )
426
426
.addLine (" @%s" , Override .class )
427
427
.addLine (" public %s toString() {" , String .class );
428
+ Block body = methodBody (code );
428
429
switch (metadata .getProperties ().size ()) {
429
430
case 0 : {
430
- code .addLine (" return \" %s{}\" ;" , metadata .getType ().getSimpleName ());
431
+ body .addLine (" return \" %s{}\" ;" , metadata .getType ().getSimpleName ());
431
432
break ;
432
433
}
433
434
434
435
case 1 : {
435
- code .add (" return \" %s{" , metadata .getType ().getSimpleName ());
436
+ body .add (" return \" %s{" , metadata .getType ().getSimpleName ());
436
437
Property property = getOnlyElement (metadata .getProperties ());
437
438
if (property .getCodeGenerator ().getType () == Type .OPTIONAL ) {
438
- code .add ("\" + (%1$s != null ? \" %2$s=\" + %1$s : \" \" ) + \" }\" ;\n " ,
439
+ body .add ("\" + (%1$s != null ? \" %2$s=\" + %1$s : \" \" ) + \" }\" ;\n " ,
439
440
property .getField (), property .getName ());
440
441
} else {
441
- code .add ("%s=\" + %s + \" }\" ;\n " , property .getName (), property .getField ());
442
+ body .add ("%s=\" + %s + \" }\" ;\n " , property .getName (), property .getField ());
442
443
}
443
444
break ;
444
445
}
445
446
446
447
default : {
447
448
if (!any (metadata .getProperties (), IS_OPTIONAL )) {
448
449
// If none of the properties are optional, use string concatenation for performance.
449
- code .addLine (" return \" %s{\" " , metadata .getType ().getSimpleName ());
450
+ body .addLine (" return \" %s{\" " , metadata .getType ().getSimpleName ());
450
451
Property lastProperty = getLast (metadata .getProperties ());
451
452
for (Property property : metadata .getProperties ()) {
452
- code .add (" + \" %s=\" + %s" , property .getName (), property .getField ());
453
+ body .add (" + \" %s=\" + %s" , property .getName (), property .getField ());
453
454
if (property != lastProperty ) {
454
- code .add (" + \" , \" \n " );
455
+ body .add (" + \" , \" \n " );
455
456
} else {
456
- code .add (" + \" }\" ;\n " );
457
+ body .add (" + \" }\" ;\n " );
457
458
}
458
459
}
459
- } else if (code .feature (GUAVA ).isAvailable ()) {
460
+ } else if (body .feature (GUAVA ).isAvailable ()) {
460
461
// If Guava is available, use COMMA_JOINER for readability.
461
- code .addLine (" return \" %s{\" " , metadata .getType ().getSimpleName ())
462
+ body .addLine (" return \" %s{\" " , metadata .getType ().getSimpleName ())
462
463
.addLine (" + COMMA_JOINER.join(" );
463
464
Property lastProperty = getLast (metadata .getProperties ());
464
465
for (Property property : metadata .getProperties ()) {
465
- code .add (" " );
466
+ body .add (" " );
466
467
if (property .getCodeGenerator ().getType () == Type .OPTIONAL ) {
467
- code .add ("(%s != null ? " , property .getField ());
468
+ body .add ("(%s != null ? " , property .getField ());
468
469
}
469
- code .add ("\" %s=\" + %s" , property .getName (), property .getField ());
470
+ body .add ("\" %s=\" + %s" , property .getName (), property .getField ());
470
471
if (property .getCodeGenerator ().getType () == Type .OPTIONAL ) {
471
- code .add (" : null)" );
472
+ body .add (" : null)" );
472
473
}
473
474
if (property != lastProperty ) {
474
- code .add (",\n " );
475
+ body .add (",\n " );
475
476
} else {
476
- code .add (")\n " );
477
+ body .add (")\n " );
477
478
}
478
479
}
479
- code .addLine (" + \" }\" ;" );
480
+ body .addLine (" + \" }\" ;" );
480
481
} else {
481
482
// Use StringBuilder if no better choice is available.
482
- writeToStringWithBuilder (code , metadata , false );
483
+ writeToStringWithBuilder (body , metadata , false );
483
484
}
484
485
break ;
485
486
}
486
487
}
487
- code .addLine (" }" );
488
+ code .add (body )
489
+ .addLine (" }" );
488
490
}
489
491
490
492
private static void addPartialType (SourceBuilder code , Metadata metadata ) {
@@ -626,12 +628,14 @@ private static void addPartialType(SourceBuilder code, Metadata metadata) {
626
628
code .addLine ("" )
627
629
.addLine (" @%s" , Override .class )
628
630
.addLine (" public %s toString() {" , String .class );
629
- if (metadata .getProperties ().size () > 1 && !code .feature (GUAVA ).isAvailable ()) {
630
- writeToStringWithBuilder (code , metadata , true );
631
+ Block body = methodBody (code );
632
+ if (metadata .getProperties ().size () > 1 && !body .feature (GUAVA ).isAvailable ()) {
633
+ writeToStringWithBuilder (body , metadata , true );
631
634
} else {
632
- writePartialToStringWithConcatenation (code , metadata );
635
+ writePartialToStringWithConcatenation (body , metadata );
633
636
}
634
- code .addLine (" }" );
637
+ code .add (body )
638
+ .addLine (" }" );
635
639
}
636
640
code .addLine ("}" );
637
641
}
@@ -668,14 +672,17 @@ private static void addPartialToBuilderMethod(SourceBuilder code, Metadata metad
668
672
code .addLine (" }" );
669
673
}
670
674
671
- private static void writeToStringWithBuilder (
672
- SourceBuilder code , Metadata metadata , boolean isPartial ) {
673
- code .addLine ("%1$s result = new %1$s(\" %2$s%3$s{\" );" ,
674
- StringBuilder .class , isPartial ? "partial " : "" , metadata .getType ().getSimpleName ());
675
+ private static void writeToStringWithBuilder (Block code , Metadata metadata , boolean isPartial ) {
676
+ Excerpt result = code .declare (
677
+ Excerpts .add ("%s" , StringBuilder .class ),
678
+ "result" ,
679
+ Excerpts .add ("new %s(\" %s%s{\" )" ,
680
+ StringBuilder .class , isPartial ? "partial " : "" , metadata .getType ().getSimpleName ()));
675
681
boolean noDefaults = !any (metadata .getProperties (), HAS_DEFAULT );
682
+ Excerpt separator = null ;
676
683
if (noDefaults ) {
677
684
// We need to keep track of whether to output a separator
678
- code .addLine ( "String separator = \" \" ;" );
685
+ separator = code .declare ( Excerpts . add ( "String" ), " separator" , Excerpts . add ( " \" \" " ) );
679
686
}
680
687
boolean seenDefault = false ;
681
688
Property first = metadata .getProperties ().get (0 );
@@ -699,15 +706,16 @@ private static void writeToStringWithBuilder(
699
706
break ;
700
707
}
701
708
if (noDefaults && property != first ) {
702
- code .addLine ("result .append(separator );" );
709
+ code .addLine ("%s .append(%s );" , result , separator );
703
710
} else if (!noDefaults && hadSeenDefault ) {
704
- code .addLine ("result .append(\" , \" );" );
711
+ code .addLine ("%s .append(\" , \" );" , result );
705
712
}
706
- code .addLine ("result.append(\" %s=\" ).append(%s);" , property .getName (), property .getField ());
713
+ code .addLine ("%s.append(\" %s=\" ).append(%s);" ,
714
+ result , property .getName (), property .getField ());
707
715
if (!noDefaults && !seenDefault ) {
708
- code .addLine ("result .append(\" , \" );" );
716
+ code .addLine ("%s .append(\" , \" );" , result );
709
717
} else if (noDefaults && property != last ) {
710
- code .addLine ("separator = \" , \" ;" );
718
+ code .addLine ("%s = \" , \" ;" , separator );
711
719
}
712
720
switch (property .getCodeGenerator ().getType ()) {
713
721
case HAS_DEFAULT :
@@ -724,8 +732,8 @@ private static void writeToStringWithBuilder(
724
732
break ;
725
733
}
726
734
}
727
- code .addLine ("result .append(\" }\" );" )
728
- .addLine ("return result .toString();" );
735
+ code .addLine ("%s .append(\" }\" );" , result )
736
+ .addLine ("return %s .toString();" , result );
729
737
}
730
738
731
739
private static void writePartialToStringWithConcatenation (SourceBuilder code , Metadata metadata ) {
0 commit comments