From 849aa4fddadb40439a30967131d2847b90fb139f Mon Sep 17 00:00:00 2001 From: Jan Rieke Date: Sun, 9 Sep 2018 19:47:51 +0200 Subject: SuperBuilder toBuilder; test cases --- .../resource/before/SuperBuilderBasicToBuilder.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 test/transform/resource/before/SuperBuilderBasicToBuilder.java (limited to 'test/transform/resource/before') diff --git a/test/transform/resource/before/SuperBuilderBasicToBuilder.java b/test/transform/resource/before/SuperBuilderBasicToBuilder.java new file mode 100644 index 00000000..bc3578f5 --- /dev/null +++ b/test/transform/resource/before/SuperBuilderBasicToBuilder.java @@ -0,0 +1,18 @@ +import java.util.List; + +public class SuperBuilderBasicToBuilder { + @lombok.experimental.SuperBuilder(toBuilder=true) + public static class Parent { + int field1; + @lombok.Singular List items; + } + + @lombok.experimental.SuperBuilder(toBuilder=true) + public static class Child extends Parent { + double field3; + } + + public static void test() { + Child x = Child.builder().field3(0.0).field1(5).item("").build().toBuilder().build(); + } +} -- cgit From a2b884c71194c780d37ccbd84561abd6a0f63741 Mon Sep 17 00:00:00 2001 From: Jan Rieke Date: Tue, 11 Sep 2018 20:37:16 +0200 Subject: SuperBuilder: fixed ObtainVia --- .../eclipse/handlers/HandleSuperBuilder.java | 4 +-- .../after-delombok/SuperBuilderBasicToBuilder.java | 38 +++++++++++++++++++++- .../after-ecj/SuperBuilderBasicToBuilder.java | 33 +++++++++++++++++-- .../before/SuperBuilderBasicToBuilder.java | 14 ++++++++ 4 files changed, 84 insertions(+), 5 deletions(-) (limited to 'test/transform/resource/before') diff --git a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java index 1bbc514e..bb78e82a 100644 --- a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java +++ b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java @@ -646,9 +646,9 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler { boolean obtainIsStatic = bfd.obtainVia.isStatic(); for (int i = 0; i < tgt.length; i++) { MessageSend obtainExpr = new MessageSend(); - obtainExpr.receiver = obtainIsStatic ? new SingleNameReference(type.getName().toCharArray(), 0) : new ThisReference(0, 0); + obtainExpr.receiver = obtainIsStatic ? new SingleNameReference(type.getName().toCharArray(), 0) : new SingleNameReference(instanceVariableName.toCharArray(), 0); obtainExpr.selector = obtainName.toCharArray(); - if (obtainIsStatic) obtainExpr.arguments = new Expression[] {new ThisReference(0, 0)}; + if (obtainIsStatic) obtainExpr.arguments = new Expression[] {new SingleNameReference(instanceVariableName.toCharArray(), 0)}; tgt[i] = obtainExpr; } } diff --git a/test/transform/resource/after-delombok/SuperBuilderBasicToBuilder.java b/test/transform/resource/after-delombok/SuperBuilderBasicToBuilder.java index 404984b9..7d34d28a 100644 --- a/test/transform/resource/after-delombok/SuperBuilderBasicToBuilder.java +++ b/test/transform/resource/after-delombok/SuperBuilderBasicToBuilder.java @@ -2,16 +2,34 @@ import java.util.List; public class SuperBuilderBasicToBuilder { public static class Parent { int field1; + int obtainViaField; + int obtainViaMethod; + String obtainViaStaticMethod; List items; + int method() { + return 2; + } + private static String staticMethod(Parent instance) { + return "staticMethod"; + } @java.lang.SuppressWarnings("all") public static abstract class ParentBuilder> { @java.lang.SuppressWarnings("all") private int field1; @java.lang.SuppressWarnings("all") + private int obtainViaField; + @java.lang.SuppressWarnings("all") + private int obtainViaMethod; + @java.lang.SuppressWarnings("all") + private String obtainViaStaticMethod; + @java.lang.SuppressWarnings("all") private java.util.ArrayList items; @java.lang.SuppressWarnings("all") protected B $fillValuesFrom(final C instance) { this.field1(instance.field1); + this.obtainViaField(instance.field1); + this.obtainViaMethod(instance.method()); + this.obtainViaStaticMethod(Parent.staticMethod(instance)); this.items(instance.items == null ? java.util.Collections.emptyList() : instance.items); return self(); } @@ -25,6 +43,21 @@ public class SuperBuilderBasicToBuilder { return self(); } @java.lang.SuppressWarnings("all") + public B obtainViaField(final int obtainViaField) { + this.obtainViaField = obtainViaField; + return self(); + } + @java.lang.SuppressWarnings("all") + public B obtainViaMethod(final int obtainViaMethod) { + this.obtainViaMethod = obtainViaMethod; + return self(); + } + @java.lang.SuppressWarnings("all") + public B obtainViaStaticMethod(final String obtainViaStaticMethod) { + this.obtainViaStaticMethod = obtainViaStaticMethod; + return self(); + } + @java.lang.SuppressWarnings("all") public B item(final String item) { if (this.items == null) this.items = new java.util.ArrayList(); this.items.add(item); @@ -44,7 +77,7 @@ public class SuperBuilderBasicToBuilder { @java.lang.Override @java.lang.SuppressWarnings("all") public java.lang.String toString() { - return "SuperBuilderBasicToBuilder.Parent.ParentBuilder(field1=" + this.field1 + ", items=" + this.items + ")"; + return "SuperBuilderBasicToBuilder.Parent.ParentBuilder(field1=" + this.field1 + ", obtainViaField=" + this.obtainViaField + ", obtainViaMethod=" + this.obtainViaMethod + ", obtainViaStaticMethod=" + this.obtainViaStaticMethod + ", items=" + this.items + ")"; } } @java.lang.SuppressWarnings("all") @@ -66,6 +99,9 @@ public class SuperBuilderBasicToBuilder { @java.lang.SuppressWarnings("all") protected Parent(final ParentBuilder b) { this.field1 = b.field1; + this.obtainViaField = b.obtainViaField; + this.obtainViaMethod = b.obtainViaMethod; + this.obtainViaStaticMethod = b.obtainViaStaticMethod; java.util.List items; switch (b.items == null ? 0 : b.items.size()) { case 0: diff --git a/test/transform/resource/after-ecj/SuperBuilderBasicToBuilder.java b/test/transform/resource/after-ecj/SuperBuilderBasicToBuilder.java index 2b294d65..974d933d 100644 --- a/test/transform/resource/after-ecj/SuperBuilderBasicToBuilder.java +++ b/test/transform/resource/after-ecj/SuperBuilderBasicToBuilder.java @@ -1,15 +1,20 @@ import java.util.List; - public class SuperBuilderBasicToBuilder { public static @lombok.experimental.SuperBuilder(toBuilder = true) class Parent { public static abstract @java.lang.SuppressWarnings("all") class ParentBuilder> { private @java.lang.SuppressWarnings("all") int field1; + private @java.lang.SuppressWarnings("all") int obtainViaField; + private @java.lang.SuppressWarnings("all") int obtainViaMethod; + private @java.lang.SuppressWarnings("all") String obtainViaStaticMethod; private @java.lang.SuppressWarnings("all") java.util.ArrayList items; public ParentBuilder() { super(); } protected @java.lang.SuppressWarnings("all") B $fillValuesFrom(final C instance) { field1(instance.field1); + obtainViaField(instance.field1); + obtainViaMethod(instance.method()); + obtainViaStaticMethod(Parent.staticMethod(instance)); items(((instance.items == null) ? java.util.Collections.emptyList() : instance.items)); return self(); } @@ -19,6 +24,18 @@ public class SuperBuilderBasicToBuilder { this.field1 = field1; return self(); } + public @java.lang.SuppressWarnings("all") B obtainViaField(final int obtainViaField) { + this.obtainViaField = obtainViaField; + return self(); + } + public @java.lang.SuppressWarnings("all") B obtainViaMethod(final int obtainViaMethod) { + this.obtainViaMethod = obtainViaMethod; + return self(); + } + public @java.lang.SuppressWarnings("all") B obtainViaStaticMethod(final String obtainViaStaticMethod) { + this.obtainViaStaticMethod = obtainViaStaticMethod; + return self(); + } public @java.lang.SuppressWarnings("all") B item(String item) { if ((this.items == null)) this.items = new java.util.ArrayList(); @@ -37,7 +54,7 @@ public class SuperBuilderBasicToBuilder { return self(); } public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { - return (((("SuperBuilderBasicToBuilder.Parent.ParentBuilder(field1=" + this.field1) + ", items=") + this.items) + ")"); + return (((((((((("SuperBuilderBasicToBuilder.Parent.ParentBuilder(field1=" + this.field1) + ", obtainViaField=") + this.obtainViaField) + ", obtainViaMethod=") + this.obtainViaMethod) + ", obtainViaStaticMethod=") + this.obtainViaStaticMethod) + ", items=") + this.items) + ")"); } } private static final @java.lang.SuppressWarnings("all") class ParentBuilderImpl extends ParentBuilder { @@ -52,10 +69,22 @@ public class SuperBuilderBasicToBuilder { } } int field1; + @lombok.Builder.ObtainVia(field = "field1") int obtainViaField; + @lombok.Builder.ObtainVia(method = "method") int obtainViaMethod; + @lombok.Builder.ObtainVia(method = "staticMethod",isStatic = true) String obtainViaStaticMethod; @lombok.Singular List items; + int method() { + return 2; + } + private static String staticMethod(Parent instance) { + return "staticMethod"; + } protected @java.lang.SuppressWarnings("all") Parent(final ParentBuilder b) { super(); this.field1 = b.field1; + this.obtainViaField = b.obtainViaField; + this.obtainViaMethod = b.obtainViaMethod; + this.obtainViaStaticMethod = b.obtainViaStaticMethod; java.util.List items; switch (((b.items == null) ? 0 : b.items.size())) { case 0 : diff --git a/test/transform/resource/before/SuperBuilderBasicToBuilder.java b/test/transform/resource/before/SuperBuilderBasicToBuilder.java index bc3578f5..4dfac613 100644 --- a/test/transform/resource/before/SuperBuilderBasicToBuilder.java +++ b/test/transform/resource/before/SuperBuilderBasicToBuilder.java @@ -4,7 +4,21 @@ public class SuperBuilderBasicToBuilder { @lombok.experimental.SuperBuilder(toBuilder=true) public static class Parent { int field1; + @lombok.Builder.ObtainVia(field="field1") + int obtainViaField; + @lombok.Builder.ObtainVia(method="method") + int obtainViaMethod; + @lombok.Builder.ObtainVia(method = "staticMethod", isStatic = true) + String obtainViaStaticMethod; @lombok.Singular List items; + + int method() { + return 2; + } + + private static String staticMethod(Parent instance) { + return "staticMethod"; + } } @lombok.experimental.SuperBuilder(toBuilder=true) -- cgit From ddd42acb599d45c432a200313a0f403a8a2a3928 Mon Sep 17 00:00:00 2001 From: Jan Rieke Date: Tue, 11 Sep 2018 21:39:10 +0200 Subject: adjusted toBuilder tests to cover private variables (impl not yet done) --- .../after-delombok/SuperBuilderBasicToBuilder.java | 26 ++++++++++++++-------- .../after-ecj/SuperBuilderBasicToBuilder.java | 24 ++++++++++++-------- .../before/SuperBuilderBasicToBuilder.java | 6 ++--- 3 files changed, 35 insertions(+), 21 deletions(-) (limited to 'test/transform/resource/before') diff --git a/test/transform/resource/after-delombok/SuperBuilderBasicToBuilder.java b/test/transform/resource/after-delombok/SuperBuilderBasicToBuilder.java index 7d34d28a..e44b3aeb 100644 --- a/test/transform/resource/after-delombok/SuperBuilderBasicToBuilder.java +++ b/test/transform/resource/after-delombok/SuperBuilderBasicToBuilder.java @@ -1,12 +1,12 @@ import java.util.List; public class SuperBuilderBasicToBuilder { public static class Parent { - int field1; + private int field1; int obtainViaField; int obtainViaMethod; String obtainViaStaticMethod; List items; - int method() { + private int method() { return 2; } private static String staticMethod(Parent instance) { @@ -26,11 +26,7 @@ public class SuperBuilderBasicToBuilder { private java.util.ArrayList items; @java.lang.SuppressWarnings("all") protected B $fillValuesFrom(final C instance) { - this.field1(instance.field1); - this.obtainViaField(instance.field1); - this.obtainViaMethod(instance.method()); - this.obtainViaStaticMethod(Parent.staticMethod(instance)); - this.items(instance.items == null ? java.util.Collections.emptyList() : instance.items); + ParentBuilderImpl.$fillValuesFromInto(instance, this); return self(); } @java.lang.SuppressWarnings("all") @@ -82,6 +78,14 @@ public class SuperBuilderBasicToBuilder { } @java.lang.SuppressWarnings("all") private static final class ParentBuilderImpl extends ParentBuilder { + @java.lang.SuppressWarnings("all") + private static void $fillValuesFromInto(Parent instance, ParentBuilder b) { + b.field1(instance.field1); + b.obtainViaField(instance.field1); + b.obtainViaMethod(instance.method()); + b.obtainViaStaticMethod(Parent.staticMethod(instance)); + b.items(instance.items == null ? java.util.Collections.emptyList() : instance.items); + } @java.lang.SuppressWarnings("all") private ParentBuilderImpl() { } @@ -125,7 +129,7 @@ public class SuperBuilderBasicToBuilder { } } public static class Child extends Parent { - double field3; + private double field3; @java.lang.SuppressWarnings("all") public static abstract class ChildBuilder> extends Parent.ParentBuilder { @java.lang.SuppressWarnings("all") @@ -134,7 +138,7 @@ public class SuperBuilderBasicToBuilder { @java.lang.SuppressWarnings("all") protected B $fillValuesFrom(final C instance) { super.$fillValuesFrom(instance); - this.field3(instance.field3); + ChildBuilderImpl.$fillValuesFromInto(instance, this); return self(); } @java.lang.Override @@ -156,6 +160,10 @@ public class SuperBuilderBasicToBuilder { } @java.lang.SuppressWarnings("all") private static final class ChildBuilderImpl extends ChildBuilder { + @java.lang.SuppressWarnings("all") + private static void $fillValuesFromInto(Parent instance, ParentBuilder b) { + b.field3(instance.field3); + } @java.lang.SuppressWarnings("all") private ChildBuilderImpl() { } diff --git a/test/transform/resource/after-ecj/SuperBuilderBasicToBuilder.java b/test/transform/resource/after-ecj/SuperBuilderBasicToBuilder.java index 974d933d..6ff2849d 100644 --- a/test/transform/resource/after-ecj/SuperBuilderBasicToBuilder.java +++ b/test/transform/resource/after-ecj/SuperBuilderBasicToBuilder.java @@ -11,11 +11,7 @@ public class SuperBuilderBasicToBuilder { super(); } protected @java.lang.SuppressWarnings("all") B $fillValuesFrom(final C instance) { - field1(instance.field1); - obtainViaField(instance.field1); - obtainViaMethod(instance.method()); - obtainViaStaticMethod(Parent.staticMethod(instance)); - items(((instance.items == null) ? java.util.Collections.emptyList() : instance.items)); + ParentBuilderImpl.$fillValuesFromInto(instance, this); return self(); } protected abstract @java.lang.SuppressWarnings("all") B self(); @@ -61,6 +57,13 @@ public class SuperBuilderBasicToBuilder { private ParentBuilderImpl() { super(); } + private static @java.lang.SuppressWarnings("all") void $fillValuesFromInto(Parent instance, ParentBuilder b) { + b.field1(instance.field1); + b.obtainViaField(instance.field1); + b.obtainViaMethod(instance.method()); + b.obtainViaStaticMethod(Parent.staticMethod(instance)); + b.items(((instance.items == null) ? java.util.Collections.emptyList() : instance.items)); + } protected @java.lang.Override @java.lang.SuppressWarnings("all") ParentBuilderImpl self() { return this; } @@ -68,12 +71,12 @@ public class SuperBuilderBasicToBuilder { return new Parent(this); } } - int field1; + private int field1; @lombok.Builder.ObtainVia(field = "field1") int obtainViaField; @lombok.Builder.ObtainVia(method = "method") int obtainViaMethod; @lombok.Builder.ObtainVia(method = "staticMethod",isStatic = true) String obtainViaStaticMethod; @lombok.Singular List items; - int method() { + private int method() { return 2; } private static String staticMethod(Parent instance) { @@ -113,7 +116,7 @@ public class SuperBuilderBasicToBuilder { } protected @java.lang.Override @java.lang.SuppressWarnings("all") B $fillValuesFrom(final C instance) { super.$fillValuesFrom(instance); - field3(instance.field3); + ChildBuilderImpl.$fillValuesFromInto(instance, this); return self(); } protected abstract @java.lang.Override @java.lang.SuppressWarnings("all") B self(); @@ -130,6 +133,9 @@ public class SuperBuilderBasicToBuilder { private ChildBuilderImpl() { super(); } + private static @java.lang.SuppressWarnings("all") void $fillValuesFromInto(Child instance, ChildBuilder b) { + b.field3(instance.field3); + } protected @java.lang.Override @java.lang.SuppressWarnings("all") ChildBuilderImpl self() { return this; } @@ -137,7 +143,7 @@ public class SuperBuilderBasicToBuilder { return new Child(this); } } - double field3; + private double field3; protected @java.lang.SuppressWarnings("all") Child(final ChildBuilder b) { super(b); this.field3 = b.field3; diff --git a/test/transform/resource/before/SuperBuilderBasicToBuilder.java b/test/transform/resource/before/SuperBuilderBasicToBuilder.java index 4dfac613..93161443 100644 --- a/test/transform/resource/before/SuperBuilderBasicToBuilder.java +++ b/test/transform/resource/before/SuperBuilderBasicToBuilder.java @@ -3,7 +3,7 @@ import java.util.List; public class SuperBuilderBasicToBuilder { @lombok.experimental.SuperBuilder(toBuilder=true) public static class Parent { - int field1; + private int field1; @lombok.Builder.ObtainVia(field="field1") int obtainViaField; @lombok.Builder.ObtainVia(method="method") @@ -12,7 +12,7 @@ public class SuperBuilderBasicToBuilder { String obtainViaStaticMethod; @lombok.Singular List items; - int method() { + private int method() { return 2; } @@ -23,7 +23,7 @@ public class SuperBuilderBasicToBuilder { @lombok.experimental.SuperBuilder(toBuilder=true) public static class Child extends Parent { - double field3; + private double field3; } public static void test() { -- cgit From 790e060380f01ea113bfeee25b3138ea267ebcb4 Mon Sep 17 00:00:00 2001 From: Jan Rieke Date: Sun, 16 Sep 2018 17:24:39 +0200 Subject: SuperBuilder toBuilder: moved static helper method to builder impl --- .../eclipse/handlers/HandleSuperBuilder.java | 20 +-- .../lombok/javac/handlers/HandleSuperBuilder.java | 46 +++--- .../SuperBuilderAbstractToBuilder.java | 168 +++++++++++++++++++++ .../after-delombok/SuperBuilderBasicToBuilder.java | 28 ++-- .../after-ecj/SuperBuilderAbstractToBuilder.java | 131 ++++++++++++++++ .../after-ecj/SuperBuilderBasicToBuilder.java | 24 +-- .../before/SuperBuilderAbstractToBuilder.java | 20 +++ 7 files changed, 374 insertions(+), 63 deletions(-) create mode 100644 test/transform/resource/after-delombok/SuperBuilderAbstractToBuilder.java create mode 100644 test/transform/resource/after-ecj/SuperBuilderAbstractToBuilder.java create mode 100644 test/transform/resource/before/SuperBuilderAbstractToBuilder.java (limited to 'test/transform/resource/before') diff --git a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java index fc532afb..640e5a71 100644 --- a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java +++ b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java @@ -298,7 +298,9 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler { if (toBuilder) { // Generate $fillValuesFrom() method in the abstract builder. - injectMethod(builderType, generateFillValuesMethod(tdParent, superclassBuilderClass != null, builderGenericName, classGenericName, builderImplClassName, typeParams)); + injectMethod(builderType, generateFillValuesMethod(tdParent, superclassBuilderClass != null, builderGenericName, classGenericName, builderClassName, typeParams)); + // Generate $fillValuesFromInstanceIntoBuilder() method in the builder implementation class. + injectMethod(builderType, generateStaticFillValuesMethod(tdParent, builderClassName, typeParams, builderFields, ast)); } // Generate abstract self() and build() methods in the abstract builder. @@ -327,9 +329,9 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler { if (addCleaning) injectMethod(builderType, generateCleanMethod(builderFields, builderType, ast)); - if ((td.modifiers & ClassFileConstants.AccAbstract) != 0 && !toBuilder) { + boolean isAbstract = (td.modifiers & ClassFileConstants.AccAbstract) != 0; + if (isAbstract) { // Only non-abstract classes get the Builder implementation. - // However, if we want to generate a toBuilder, we need a helper function in the builder implementation class. return; } @@ -343,9 +345,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler { } if (toBuilder) { - // Generate $fillValuesFromInstanceIntoBuilder() method in the builder implementation class. - injectMethod(builderImplType, generateStaticFillValuesMethod(tdParent, builderClassName, typeParams, builderFields, ast)); - + // Add the toBuilder() method to the annotated class. switch (methodExists(TO_BUILDER_METHOD_NAME_STRING, tdParent, 0)) { case EXISTS_BY_USER: annotationNode.addWarning("Not generating toBuilder() as it already exists."); @@ -355,10 +355,6 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler { default: // Should not happen. } - if ((td.modifiers & ClassFileConstants.AccAbstract) != 0) { - // The rest of the builder implementation class is not necessary for abstract classes. - return; - } } // Create the self() and build() methods in the BuilderImpl. @@ -605,7 +601,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler { * } * */ - private MethodDeclaration generateFillValuesMethod(EclipseNode tdParent, boolean inherited, String builderGenericName, String classGenericName, String builderImplClassName, TypeParameter[] typeParams) { + private MethodDeclaration generateFillValuesMethod(EclipseNode tdParent, boolean inherited, String builderGenericName, String classGenericName, String builderClassName, TypeParameter[] typeParams) { MethodDeclaration out = new MethodDeclaration(((CompilationUnitDeclaration) tdParent.top().get()).compilationResult); out.selector = FILL_VALUES_METHOD_NAME; out.bits |= ECLIPSE_DO_NOT_TOUCH_FLAG; @@ -629,7 +625,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler { // Call the builder implemention's helper method that actually fills the values from the instance. MessageSend callStaticFillValuesMethod = new MessageSend(); - callStaticFillValuesMethod.receiver = new SingleNameReference(builderImplClassName.toCharArray(), 0); + callStaticFillValuesMethod.receiver = new SingleNameReference(builderClassName.toCharArray(), 0); callStaticFillValuesMethod.selector = FILL_VALUES_STATIC_METHOD_NAME; callStaticFillValuesMethod.arguments = new Expression[] {new SingleNameReference(INSTANCE_VARIABLE_NAME, 0), new ThisReference(0, 0)}; body.add(callStaticFillValuesMethod); diff --git a/src/core/lombok/javac/handlers/HandleSuperBuilder.java b/src/core/lombok/javac/handlers/HandleSuperBuilder.java index f858cd29..f9686cba 100644 --- a/src/core/lombok/javac/handlers/HandleSuperBuilder.java +++ b/src/core/lombok/javac/handlers/HandleSuperBuilder.java @@ -242,7 +242,9 @@ public class HandleSuperBuilder extends JavacAnnotationHandler { if (toBuilder) { // Generate $fillValuesFrom() method in the abstract builder. - injectMethod(builderType, generateFillValuesMethod(tdParent, superclassBuilderClassExpression != null, builderGenericName, classGenericName, builderImplClassName)); + injectMethod(builderType, generateFillValuesMethod(tdParent, superclassBuilderClassExpression != null, builderGenericName, classGenericName, builderClassName)); + // Generate $fillValuesFromInstanceIntoBuilder() method in the builder implementation class. + injectMethod(builderType, generateStaticFillValuesMethod(tdParent, builderClassName, typeParams, builderFields)); } // Generate abstract self() and build() methods in the abstract builder. @@ -272,9 +274,8 @@ public class HandleSuperBuilder extends JavacAnnotationHandler { recursiveSetGeneratedBy(builderType.get(), ast, annotationNode.getContext()); boolean isAbstract = (td.mods.flags & Flags.ABSTRACT) != 0; - if (!isAbstract || toBuilder) { + if (!isAbstract) { // Only non-abstract classes get the Builder implementation. - // However, if we want to generate a toBuilder, we need a helper function in the builder implementation class. // Create the builder implementation class. JavacNode builderImplType = findInnerClass(tdParent, builderImplClassName); @@ -285,20 +286,13 @@ public class HandleSuperBuilder extends JavacAnnotationHandler { return; } - if (toBuilder) { - // Generate $fillValuesFromInstanceIntoBuilder() method in the builder implementation class. - injectMethod(builderImplType, generateStaticFillValuesMethod(tdParent, builderClassName, typeParams, builderFields)); - } + // Create a simple constructor for the BuilderImpl class. + JCMethodDecl cd = HandleConstructor.createConstructor(AccessLevel.PRIVATE, List.nil(), builderImplType, List.nil(), false, annotationNode); + if (cd != null) injectMethod(builderImplType, cd); - if (!isAbstract) { - // Create a simple constructor for the BuilderImpl class. - JCMethodDecl cd = HandleConstructor.createConstructor(AccessLevel.PRIVATE, List.nil(), builderImplType, List.nil(), false, annotationNode); - if (cd != null) injectMethod(builderImplType, cd); - - // Create the self() and build() methods in the BuilderImpl. - injectMethod(builderImplType, generateSelfMethod(builderImplType, typeParams)); - injectMethod(builderImplType, generateBuildMethod(buildMethodName, returnType, builderImplType, thrownExceptions)); - } + // Create the self() and build() methods in the BuilderImpl. + injectMethod(builderImplType, generateSelfMethod(builderImplType, typeParams)); + injectMethod(builderImplType, generateBuildMethod(buildMethodName, returnType, builderImplType, thrownExceptions)); recursiveSetGeneratedBy(builderImplType.get(), ast, annotationNode.getContext()); } @@ -307,18 +301,20 @@ public class HandleSuperBuilder extends JavacAnnotationHandler { generateBuilderBasedConstructor(tdParent, typeParams, builderFields, annotationNode, builderClassName, superclassBuilderClassExpression != null); - if (!isAbstract) { - // Only non-abstract classes get the builder() method. + if (isAbstract) { + // Only non-abstract classes get the builder() and toBuilder() methods. + return; + } - // Add the builder() method to the annotated class. - // Allow users to specify their own builder() methods, e.g., to provide default values. - if (methodExists(builderMethodName, tdParent, -1) == MemberExistsResult.NOT_EXISTS) { - JCMethodDecl builderMethod = generateBuilderMethod(builderMethodName, builderClassName, builderImplClassName, annotationNode, tdParent, typeParams); - recursiveSetGeneratedBy(builderMethod, ast, annotationNode.getContext()); - if (builderMethod != null) injectMethod(tdParent, builderMethod); - } + // Add the builder() method to the annotated class. + // Allow users to specify their own builder() methods, e.g., to provide default values. + if (methodExists(builderMethodName, tdParent, -1) == MemberExistsResult.NOT_EXISTS) { + JCMethodDecl builderMethod = generateBuilderMethod(builderMethodName, builderClassName, builderImplClassName, annotationNode, tdParent, typeParams); + recursiveSetGeneratedBy(builderMethod, ast, annotationNode.getContext()); + if (builderMethod != null) injectMethod(tdParent, builderMethod); } + // Add the toBuilder() method to the annotated class. if (toBuilder) { switch (methodExists(TO_BUILDER_METHOD_NAME, tdParent, 0)) { case EXISTS_BY_USER: diff --git a/test/transform/resource/after-delombok/SuperBuilderAbstractToBuilder.java b/test/transform/resource/after-delombok/SuperBuilderAbstractToBuilder.java new file mode 100644 index 00000000..096bd533 --- /dev/null +++ b/test/transform/resource/after-delombok/SuperBuilderAbstractToBuilder.java @@ -0,0 +1,168 @@ +public class SuperBuilderAbstractToBuilder { + public static class Parent { + int parentField; + @java.lang.SuppressWarnings("all") + public static abstract class ParentBuilder> { + @java.lang.SuppressWarnings("all") + private int parentField; + @java.lang.SuppressWarnings("all") + protected B $fillValuesFrom(final C instance) { + ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); + return self(); + } + @java.lang.SuppressWarnings("all") + private static void $fillValuesFromInstanceIntoBuilder(final Parent instance, final ParentBuilder b) { + b.parentField(instance.parentField); + } + @java.lang.SuppressWarnings("all") + protected abstract B self(); + @java.lang.SuppressWarnings("all") + public abstract C build(); + @java.lang.SuppressWarnings("all") + public B parentField(final int parentField) { + this.parentField = parentField; + return self(); + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + public java.lang.String toString() { + return "SuperBuilderAbstractToBuilder.Parent.ParentBuilder(parentField=" + this.parentField + ")"; + } + } + @java.lang.SuppressWarnings("all") + private static final class ParentBuilderImpl extends ParentBuilder { + @java.lang.SuppressWarnings("all") + private ParentBuilderImpl() { + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + protected ParentBuilderImpl self() { + return this; + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + public Parent build() { + return new Parent(this); + } + } + @java.lang.SuppressWarnings("all") + protected Parent(final ParentBuilder b) { + this.parentField = b.parentField; + } + @java.lang.SuppressWarnings("all") + public static ParentBuilder builder() { + return new ParentBuilderImpl(); + } + @java.lang.SuppressWarnings("all") + public ParentBuilder toBuilder() { + return new ParentBuilderImpl().$fillValuesFrom(this); + } + } + public static abstract class Child extends Parent { + double childField; + @java.lang.SuppressWarnings("all") + public static abstract class ChildBuilder> extends Parent.ParentBuilder { + @java.lang.SuppressWarnings("all") + private double childField; + @java.lang.Override + @java.lang.SuppressWarnings("all") + protected B $fillValuesFrom(final C instance) { + super.$fillValuesFrom(instance); + ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); + return self(); + } + @java.lang.SuppressWarnings("all") + private static void $fillValuesFromInstanceIntoBuilder(final Child instance, final ChildBuilder b) { + b.childField(instance.childField); + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + protected abstract B self(); + @java.lang.Override + @java.lang.SuppressWarnings("all") + public abstract C build(); + @java.lang.SuppressWarnings("all") + public B childField(final double childField) { + this.childField = childField; + return self(); + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + public java.lang.String toString() { + return "SuperBuilderAbstractToBuilder.Child.ChildBuilder(super=" + super.toString() + ", childField=" + this.childField + ")"; + } + } + @java.lang.SuppressWarnings("all") + protected Child(final ChildBuilder b) { + super(b); + this.childField = b.childField; + } + } + public static class GrandChild extends Child { + String grandChildField; + @java.lang.SuppressWarnings("all") + public static abstract class GrandChildBuilder> extends Child.ChildBuilder { + @java.lang.SuppressWarnings("all") + private String grandChildField; + @java.lang.Override + @java.lang.SuppressWarnings("all") + protected B $fillValuesFrom(final C instance) { + super.$fillValuesFrom(instance); + GrandChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); + return self(); + } + @java.lang.SuppressWarnings("all") + private static void $fillValuesFromInstanceIntoBuilder(final GrandChild instance, final GrandChildBuilder b) { + b.grandChildField(instance.grandChildField); + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + protected abstract B self(); + @java.lang.Override + @java.lang.SuppressWarnings("all") + public abstract C build(); + @java.lang.SuppressWarnings("all") + public B grandChildField(final String grandChildField) { + this.grandChildField = grandChildField; + return self(); + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + public java.lang.String toString() { + return "SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder(super=" + super.toString() + ", grandChildField=" + this.grandChildField + ")"; + } + } + @java.lang.SuppressWarnings("all") + private static final class GrandChildBuilderImpl extends GrandChildBuilder { + @java.lang.SuppressWarnings("all") + private GrandChildBuilderImpl() { + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + protected GrandChildBuilderImpl self() { + return this; + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + public GrandChild build() { + return new GrandChild(this); + } + } + @java.lang.SuppressWarnings("all") + protected GrandChild(final GrandChildBuilder b) { + super(b); + this.grandChildField = b.grandChildField; + } + @java.lang.SuppressWarnings("all") + public static GrandChildBuilder builder() { + return new GrandChildBuilderImpl(); + } + @java.lang.SuppressWarnings("all") + public GrandChildBuilder toBuilder() { + return new GrandChildBuilderImpl().$fillValuesFrom(this); + } + } + public static void test() { + GrandChild x = GrandChild.builder().grandChildField("").parentField(5).childField(2.5).build().toBuilder().build(); + } +} diff --git a/test/transform/resource/after-delombok/SuperBuilderBasicToBuilder.java b/test/transform/resource/after-delombok/SuperBuilderBasicToBuilder.java index 7a80f019..dc0b4e70 100644 --- a/test/transform/resource/after-delombok/SuperBuilderBasicToBuilder.java +++ b/test/transform/resource/after-delombok/SuperBuilderBasicToBuilder.java @@ -26,10 +26,18 @@ public class SuperBuilderBasicToBuilder { private java.util.ArrayList items; @java.lang.SuppressWarnings("all") protected B $fillValuesFrom(final C instance) { - ParentBuilderImpl.$fillValuesFromInstanceIntoBuilder(instance, this); + ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); return self(); } @java.lang.SuppressWarnings("all") + private static void $fillValuesFromInstanceIntoBuilder(final Parent instance, final ParentBuilder b) { + b.field1(instance.field1); + b.obtainViaField(instance.field1); + b.obtainViaMethod(instance.method()); + b.obtainViaStaticMethod(Parent.staticMethod(instance)); + b.items(instance.items == null ? java.util.Collections.emptyList() : instance.items); + } + @java.lang.SuppressWarnings("all") protected abstract B self(); @java.lang.SuppressWarnings("all") public abstract C build(); @@ -78,14 +86,6 @@ public class SuperBuilderBasicToBuilder { } @java.lang.SuppressWarnings("all") private static final class ParentBuilderImpl extends ParentBuilder { - @java.lang.SuppressWarnings("all") - private static void $fillValuesFromInstanceIntoBuilder(final Parent instance, final ParentBuilder b) { - b.field1(instance.field1); - b.obtainViaField(instance.field1); - b.obtainViaMethod(instance.method()); - b.obtainViaStaticMethod(Parent.staticMethod(instance)); - b.items(instance.items == null ? java.util.Collections.emptyList() : instance.items); - } @java.lang.SuppressWarnings("all") private ParentBuilderImpl() { } @@ -138,9 +138,13 @@ public class SuperBuilderBasicToBuilder { @java.lang.SuppressWarnings("all") protected B $fillValuesFrom(final C instance) { super.$fillValuesFrom(instance); - ChildBuilderImpl.$fillValuesFromInstanceIntoBuilder(instance, this); + ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); return self(); } + @java.lang.SuppressWarnings("all") + private static void $fillValuesFromInstanceIntoBuilder(final Child instance, final ChildBuilder b) { + b.field3(instance.field3); + } @java.lang.Override @java.lang.SuppressWarnings("all") protected abstract B self(); @@ -160,10 +164,6 @@ public class SuperBuilderBasicToBuilder { } @java.lang.SuppressWarnings("all") private static final class ChildBuilderImpl extends ChildBuilder { - @java.lang.SuppressWarnings("all") - private static void $fillValuesFromInstanceIntoBuilder(final Child instance, final ChildBuilder b) { - b.field3(instance.field3); - } @java.lang.SuppressWarnings("all") private ChildBuilderImpl() { } diff --git a/test/transform/resource/after-ecj/SuperBuilderAbstractToBuilder.java b/test/transform/resource/after-ecj/SuperBuilderAbstractToBuilder.java new file mode 100644 index 00000000..668f6acf --- /dev/null +++ b/test/transform/resource/after-ecj/SuperBuilderAbstractToBuilder.java @@ -0,0 +1,131 @@ +public class SuperBuilderAbstractToBuilder { + public static @lombok.experimental.SuperBuilder(toBuilder = true) class Parent { + public static abstract @java.lang.SuppressWarnings("all") class ParentBuilder> { + private @java.lang.SuppressWarnings("all") int parentField; + public ParentBuilder() { + super(); + } + protected @java.lang.SuppressWarnings("all") B $fillValuesFrom(final C instance) { + ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); + return self(); + } + private static @java.lang.SuppressWarnings("all") void $fillValuesFromInstanceIntoBuilder(final Parent instance, final ParentBuilder b) { + b.parentField(instance.parentField); + } + protected abstract @java.lang.SuppressWarnings("all") B self(); + public abstract @java.lang.SuppressWarnings("all") C build(); + public @java.lang.SuppressWarnings("all") B parentField(final int parentField) { + this.parentField = parentField; + return self(); + } + public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { + return (("SuperBuilderAbstractToBuilder.Parent.ParentBuilder(parentField=" + this.parentField) + ")"); + } + } + private static final @java.lang.SuppressWarnings("all") class ParentBuilderImpl extends ParentBuilder { + private ParentBuilderImpl() { + super(); + } + protected @java.lang.Override @java.lang.SuppressWarnings("all") ParentBuilderImpl self() { + return this; + } + public @java.lang.Override @java.lang.SuppressWarnings("all") Parent build() { + return new Parent(this); + } + } + int parentField; + protected @java.lang.SuppressWarnings("all") Parent(final ParentBuilder b) { + super(); + this.parentField = b.parentField; + } + public @java.lang.SuppressWarnings("all") ParentBuilder toBuilder() { + return new ParentBuilderImpl().$fillValuesFrom(this); + } + public static @java.lang.SuppressWarnings("all") ParentBuilder builder() { + return new ParentBuilderImpl(); + } + } + public static abstract @lombok.experimental.SuperBuilder(toBuilder = true) class Child extends Parent { + public static abstract @java.lang.SuppressWarnings("all") class ChildBuilder> extends Parent.ParentBuilder { + private @java.lang.SuppressWarnings("all") double childField; + public ChildBuilder() { + super(); + } + protected @java.lang.Override @java.lang.SuppressWarnings("all") B $fillValuesFrom(final C instance) { + super.$fillValuesFrom(instance); + ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); + return self(); + } + private static @java.lang.SuppressWarnings("all") void $fillValuesFromInstanceIntoBuilder(final Child instance, final ChildBuilder b) { + b.childField(instance.childField); + } + protected abstract @java.lang.Override @java.lang.SuppressWarnings("all") B self(); + public abstract @java.lang.Override @java.lang.SuppressWarnings("all") C build(); + public @java.lang.SuppressWarnings("all") B childField(final double childField) { + this.childField = childField; + return self(); + } + public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { + return (((("SuperBuilderAbstractToBuilder.Child.ChildBuilder(super=" + super.toString()) + ", childField=") + this.childField) + ")"); + } + } + double childField; + protected @java.lang.SuppressWarnings("all") Child(final ChildBuilder b) { + super(b); + this.childField = b.childField; + } + } + public static @lombok.experimental.SuperBuilder(toBuilder = true) class GrandChild extends Child { + public static abstract @java.lang.SuppressWarnings("all") class GrandChildBuilder> extends Child.ChildBuilder { + private @java.lang.SuppressWarnings("all") String grandChildField; + public GrandChildBuilder() { + super(); + } + protected @java.lang.Override @java.lang.SuppressWarnings("all") B $fillValuesFrom(final C instance) { + super.$fillValuesFrom(instance); + GrandChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); + return self(); + } + private static @java.lang.SuppressWarnings("all") void $fillValuesFromInstanceIntoBuilder(final GrandChild instance, final GrandChildBuilder b) { + b.grandChildField(instance.grandChildField); + } + protected abstract @java.lang.Override @java.lang.SuppressWarnings("all") B self(); + public abstract @java.lang.Override @java.lang.SuppressWarnings("all") C build(); + public @java.lang.SuppressWarnings("all") B grandChildField(final String grandChildField) { + this.grandChildField = grandChildField; + return self(); + } + public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { + return (((("SuperBuilderAbstractToBuilder.GrandChild.GrandChildBuilder(super=" + super.toString()) + ", grandChildField=") + this.grandChildField) + ")"); + } + } + private static final @java.lang.SuppressWarnings("all") class GrandChildBuilderImpl extends GrandChildBuilder { + private GrandChildBuilderImpl() { + super(); + } + protected @java.lang.Override @java.lang.SuppressWarnings("all") GrandChildBuilderImpl self() { + return this; + } + public @java.lang.Override @java.lang.SuppressWarnings("all") GrandChild build() { + return new GrandChild(this); + } + } + String grandChildField; + protected @java.lang.SuppressWarnings("all") GrandChild(final GrandChildBuilder b) { + super(b); + this.grandChildField = b.grandChildField; + } + public @java.lang.SuppressWarnings("all") GrandChildBuilder toBuilder() { + return new GrandChildBuilderImpl().$fillValuesFrom(this); + } + public static @java.lang.SuppressWarnings("all") GrandChildBuilder builder() { + return new GrandChildBuilderImpl(); + } + } + public SuperBuilderAbstractToBuilder() { + super(); + } + public static void test() { + GrandChild x = GrandChild.builder().grandChildField("").parentField(5).childField(2.5).build().toBuilder().build(); + } +} diff --git a/test/transform/resource/after-ecj/SuperBuilderBasicToBuilder.java b/test/transform/resource/after-ecj/SuperBuilderBasicToBuilder.java index be819d05..a491430a 100644 --- a/test/transform/resource/after-ecj/SuperBuilderBasicToBuilder.java +++ b/test/transform/resource/after-ecj/SuperBuilderBasicToBuilder.java @@ -11,9 +11,16 @@ public class SuperBuilderBasicToBuilder { super(); } protected @java.lang.SuppressWarnings("all") B $fillValuesFrom(final C instance) { - ParentBuilderImpl.$fillValuesFromInstanceIntoBuilder(instance, this); + ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); return self(); } + private static @java.lang.SuppressWarnings("all") void $fillValuesFromInstanceIntoBuilder(final Parent instance, final ParentBuilder b) { + b.field1(instance.field1); + b.obtainViaField(instance.field1); + b.obtainViaMethod(instance.method()); + b.obtainViaStaticMethod(Parent.staticMethod(instance)); + b.items(((instance.items == null) ? java.util.Collections.emptyList() : instance.items)); + } protected abstract @java.lang.SuppressWarnings("all") B self(); public abstract @java.lang.SuppressWarnings("all") C build(); public @java.lang.SuppressWarnings("all") B field1(final int field1) { @@ -57,13 +64,6 @@ public class SuperBuilderBasicToBuilder { private ParentBuilderImpl() { super(); } - private static @java.lang.SuppressWarnings("all") void $fillValuesFromInstanceIntoBuilder(final Parent instance, final ParentBuilder b) { - b.field1(instance.field1); - b.obtainViaField(instance.field1); - b.obtainViaMethod(instance.method()); - b.obtainViaStaticMethod(Parent.staticMethod(instance)); - b.items(((instance.items == null) ? java.util.Collections.emptyList() : instance.items)); - } protected @java.lang.Override @java.lang.SuppressWarnings("all") ParentBuilderImpl self() { return this; } @@ -116,9 +116,12 @@ public class SuperBuilderBasicToBuilder { } protected @java.lang.Override @java.lang.SuppressWarnings("all") B $fillValuesFrom(final C instance) { super.$fillValuesFrom(instance); - ChildBuilderImpl.$fillValuesFromInstanceIntoBuilder(instance, this); + ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); return self(); } + private static @java.lang.SuppressWarnings("all") void $fillValuesFromInstanceIntoBuilder(final Child instance, final ChildBuilder b) { + b.field3(instance.field3); + } protected abstract @java.lang.Override @java.lang.SuppressWarnings("all") B self(); public abstract @java.lang.Override @java.lang.SuppressWarnings("all") C build(); public @java.lang.SuppressWarnings("all") B field3(final double field3) { @@ -133,9 +136,6 @@ public class SuperBuilderBasicToBuilder { private ChildBuilderImpl() { super(); } - private static @java.lang.SuppressWarnings("all") void $fillValuesFromInstanceIntoBuilder(final Child instance, final ChildBuilder b) { - b.field3(instance.field3); - } protected @java.lang.Override @java.lang.SuppressWarnings("all") ChildBuilderImpl self() { return this; } diff --git a/test/transform/resource/before/SuperBuilderAbstractToBuilder.java b/test/transform/resource/before/SuperBuilderAbstractToBuilder.java new file mode 100644 index 00000000..3359829c --- /dev/null +++ b/test/transform/resource/before/SuperBuilderAbstractToBuilder.java @@ -0,0 +1,20 @@ +public class SuperBuilderAbstractToBuilder { + @lombok.experimental.SuperBuilder(toBuilder = true) + public static class Parent { + int parentField; + } + + @lombok.experimental.SuperBuilder(toBuilder = true) + public abstract static class Child extends Parent { + double childField; + } + + @lombok.experimental.SuperBuilder(toBuilder = true) + public static class GrandChild extends Child { + String grandChildField; + } + + public static void test() { + GrandChild x = GrandChild.builder().grandChildField("").parentField(5).childField(2.5).build().toBuilder().build(); + } +} -- cgit From 63343fced581dc9f5721d5cca81265db138254a5 Mon Sep 17 00:00:00 2001 From: Jan Rieke Date: Sun, 16 Sep 2018 21:20:58 +0200 Subject: SuperBuilder toBuilder: test with generics --- .../SuperBuilderWithGenericsAndToBuilder.java | 162 +++++++++++++++++++++ .../SuperBuilderWithGenericsAndToBuilder.java | 140 ++++++++++++++++++ .../SuperBuilderWithGenericsAndToBuilder.java | 18 +++ 3 files changed, 320 insertions(+) create mode 100644 test/transform/resource/after-delombok/SuperBuilderWithGenericsAndToBuilder.java create mode 100644 test/transform/resource/after-ecj/SuperBuilderWithGenericsAndToBuilder.java create mode 100644 test/transform/resource/before/SuperBuilderWithGenericsAndToBuilder.java (limited to 'test/transform/resource/before') diff --git a/test/transform/resource/after-delombok/SuperBuilderWithGenericsAndToBuilder.java b/test/transform/resource/after-delombok/SuperBuilderWithGenericsAndToBuilder.java new file mode 100644 index 00000000..93d0f9b5 --- /dev/null +++ b/test/transform/resource/after-delombok/SuperBuilderWithGenericsAndToBuilder.java @@ -0,0 +1,162 @@ +import java.util.List; +public class SuperBuilderWithGenericsAndToBuilder { + public static class Parent { + A field1; + List items; + @java.lang.SuppressWarnings("all") + public static abstract class ParentBuilder, B extends ParentBuilder> { + @java.lang.SuppressWarnings("all") + private A field1; + @java.lang.SuppressWarnings("all") + private java.util.ArrayList items; + @java.lang.SuppressWarnings("all") + protected B $fillValuesFrom(final C instance) { + ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); + return self(); + } + @java.lang.SuppressWarnings("all") + private static void $fillValuesFromInstanceIntoBuilder(final Parent instance, final ParentBuilder b) { + b.field1(instance.field1); + b.items(instance.items == null ? java.util.Collections.emptyList() : instance.items); + } + @java.lang.SuppressWarnings("all") + protected abstract B self(); + @java.lang.SuppressWarnings("all") + public abstract C build(); + @java.lang.SuppressWarnings("all") + public B field1(final A field1) { + this.field1 = field1; + return self(); + } + @java.lang.SuppressWarnings("all") + public B item(final String item) { + if (this.items == null) this.items = new java.util.ArrayList(); + this.items.add(item); + return self(); + } + @java.lang.SuppressWarnings("all") + public B items(final java.util.Collection items) { + if (this.items == null) this.items = new java.util.ArrayList(); + this.items.addAll(items); + return self(); + } + @java.lang.SuppressWarnings("all") + public B clearItems() { + if (this.items != null) this.items.clear(); + return self(); + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + public java.lang.String toString() { + return "SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder(field1=" + this.field1 + ", items=" + this.items + ")"; + } + } + @java.lang.SuppressWarnings("all") + private static final class ParentBuilderImpl extends ParentBuilder, ParentBuilderImpl> { + @java.lang.SuppressWarnings("all") + private ParentBuilderImpl() { + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + protected ParentBuilderImpl self() { + return this; + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + public Parent build() { + return new Parent(this); + } + } + @java.lang.SuppressWarnings("all") + protected Parent(final ParentBuilder b) { + this.field1 = b.field1; + java.util.List items; + switch (b.items == null ? 0 : b.items.size()) { + case 0: + items = java.util.Collections.emptyList(); + break; + case 1: + items = java.util.Collections.singletonList(b.items.get(0)); + break; + default: + items = java.util.Collections.unmodifiableList(new java.util.ArrayList(b.items)); + } + this.items = items; + } + @java.lang.SuppressWarnings("all") + public static ParentBuilder builder() { + return new ParentBuilderImpl(); + } + @java.lang.SuppressWarnings("all") + public ParentBuilder toBuilder() { + return new ParentBuilderImpl().$fillValuesFrom(this); + } + } + public static class Child extends Parent { + double field3; + @java.lang.SuppressWarnings("all") + public static abstract class ChildBuilder, B extends ChildBuilder> extends Parent.ParentBuilder { + @java.lang.SuppressWarnings("all") + private double field3; + @java.lang.Override + @java.lang.SuppressWarnings("all") + protected B $fillValuesFrom(final C instance) { + super.$fillValuesFrom(instance); + ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); + return self(); + } + @java.lang.SuppressWarnings("all") + private static void $fillValuesFromInstanceIntoBuilder(final Child instance, final ChildBuilder b) { + b.field3(instance.field3); + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + protected abstract B self(); + @java.lang.Override + @java.lang.SuppressWarnings("all") + public abstract C build(); + @java.lang.SuppressWarnings("all") + public B field3(final double field3) { + this.field3 = field3; + return self(); + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + public java.lang.String toString() { + return "SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder(super=" + super.toString() + ", field3=" + this.field3 + ")"; + } + } + @java.lang.SuppressWarnings("all") + private static final class ChildBuilderImpl extends ChildBuilder, ChildBuilderImpl> { + @java.lang.SuppressWarnings("all") + private ChildBuilderImpl() { + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + protected ChildBuilderImpl self() { + return this; + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + public Child build() { + return new Child(this); + } + } + @java.lang.SuppressWarnings("all") + protected Child(final ChildBuilder b) { + super(b); + this.field3 = b.field3; + } + @java.lang.SuppressWarnings("all") + public static ChildBuilder builder() { + return new ChildBuilderImpl(); + } + @java.lang.SuppressWarnings("all") + public ChildBuilder toBuilder() { + return new ChildBuilderImpl().$fillValuesFrom(this); + } + } + public static void test() { + Child x = Child.builder().field3(0.0).field1(5).item("").build().toBuilder().build(); + } +} diff --git a/test/transform/resource/after-ecj/SuperBuilderWithGenericsAndToBuilder.java b/test/transform/resource/after-ecj/SuperBuilderWithGenericsAndToBuilder.java new file mode 100644 index 00000000..fcdadb3b --- /dev/null +++ b/test/transform/resource/after-ecj/SuperBuilderWithGenericsAndToBuilder.java @@ -0,0 +1,140 @@ +import java.util.List; + +import SuperBuilderBasicToBuilder.Child; +import SuperBuilderBasicToBuilder.Parent; +import SuperBuilderBasicToBuilder.Child.ChildBuilder; +import SuperBuilderBasicToBuilder.Child.ChildBuilderImpl; +import SuperBuilderBasicToBuilder.Parent.ParentBuilder; +public class SuperBuilderWithGenericsAndToBuilder { + public static @lombok.experimental.SuperBuilder class Parent { + public static abstract @java.lang.SuppressWarnings("all") class ParentBuilder, B extends ParentBuilder> { + private @java.lang.SuppressWarnings("all") A field1; + private @java.lang.SuppressWarnings("all") java.util.ArrayList items; + public ParentBuilder() { + super(); + } + protected @java.lang.SuppressWarnings("all") B $fillValuesFrom(final C instance) { + ParentBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); + return self(); + } + private static @java.lang.SuppressWarnings("all") void $fillValuesFromInstanceIntoBuilder(final Parent instance, final ParentBuilder b) { + b.field1(instance.field1); + b.items(((instance.items == null) ? java.util.Collections.emptyList() : instance.items)); + } + protected abstract @java.lang.SuppressWarnings("all") B self(); + public abstract @java.lang.SuppressWarnings("all") C build(); + public @java.lang.SuppressWarnings("all") B field1(final A field1) { + this.field1 = field1; + return self(); + } + public @java.lang.SuppressWarnings("all") B item(String item) { + if ((this.items == null)) + this.items = new java.util.ArrayList(); + this.items.add(item); + return self(); + } + public @java.lang.SuppressWarnings("all") B items(java.util.Collection items) { + if ((this.items == null)) + this.items = new java.util.ArrayList(); + this.items.addAll(items); + return self(); + } + public @java.lang.SuppressWarnings("all") B clearItems() { + if ((this.items != null)) + this.items.clear(); + return self(); + } + public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { + return (((("SuperBuilderWithGenericsAndToBuilder.Parent.ParentBuilder(field1=" + this.field1) + ", items=") + this.items) + ")"); + } + } + private static final @java.lang.SuppressWarnings("all") class ParentBuilderImpl extends ParentBuilder, ParentBuilderImpl> { + private ParentBuilderImpl() { + super(); + } + protected @java.lang.Override @java.lang.SuppressWarnings("all") ParentBuilderImpl self() { + return this; + } + public @java.lang.Override @java.lang.SuppressWarnings("all") Parent build() { + return new Parent(this); + } + } + A field1; + @lombok.Singular List items; + protected @java.lang.SuppressWarnings("all") Parent(final ParentBuilder b) { + super(); + this.field1 = b.field1; + java.util.List items; + switch (((b.items == null) ? 0 : b.items.size())) { + case 0 : + items = java.util.Collections.emptyList(); + break; + case 1 : + items = java.util.Collections.singletonList(b.items.get(0)); + break; + default : + items = java.util.Collections.unmodifiableList(new java.util.ArrayList(b.items)); + } + this.items = items; + } + public @java.lang.SuppressWarnings("all") ParentBuilder toBuilder() { + return new ParentBuilderImpl().$fillValuesFrom(this); + } + public static @java.lang.SuppressWarnings("all") ParentBuilder builder() { + return new ParentBuilderImpl(); + } + } + public static @lombok.experimental.SuperBuilder class Child extends Parent { + public static abstract @java.lang.SuppressWarnings("all") class ChildBuilder, B extends ChildBuilder> extends Parent.ParentBuilder { + private @java.lang.SuppressWarnings("all") double field3; + public ChildBuilder() { + super(); + } + protected @java.lang.Override @java.lang.SuppressWarnings("all") B $fillValuesFrom(final C instance) { + super.$fillValuesFrom(instance); + ChildBuilder.$fillValuesFromInstanceIntoBuilder(instance, this); + return self(); + } + private static @java.lang.SuppressWarnings("all") void $fillValuesFromInstanceIntoBuilder(final Child instance, final ChildBuilder b) { + b.field3(instance.field3); + } + protected abstract @java.lang.Override @java.lang.SuppressWarnings("all") B self(); + public abstract @java.lang.Override @java.lang.SuppressWarnings("all") C build(); + public @java.lang.SuppressWarnings("all") B field3(final double field3) { + this.field3 = field3; + return self(); + } + public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { + return (((("SuperBuilderWithGenericsAndToBuilder.Child.ChildBuilder(super=" + super.toString()) + ", field3=") + this.field3) + ")"); + } + } + private static final @java.lang.SuppressWarnings("all") class ChildBuilderImpl extends ChildBuilder, ChildBuilderImpl> { + private ChildBuilderImpl() { + super(); + } + protected @java.lang.Override @java.lang.SuppressWarnings("all") ChildBuilderImpl self() { + return this; + } + public @java.lang.Override @java.lang.SuppressWarnings("all") Child build() { + return new Child(this); + } + } + double field3; + protected @java.lang.SuppressWarnings("all") Child(final ChildBuilder b) { + super(b); + this.field3 = b.field3; + } + public @java.lang.SuppressWarnings("all") ChildBuilder toBuilder() { + return new ChildBuilderImpl().$fillValuesFrom(this); + } + public static @java.lang.SuppressWarnings("all") ChildBuilder builder() { + return new ChildBuilderImpl(); + } + } + public SuperBuilderWithGenerics() { + super(); + } + public static void test() { + Child x = Child.builder().field3(0.0).field1(5).item("").build().toBuilder().build(); + } +} diff --git a/test/transform/resource/before/SuperBuilderWithGenericsAndToBuilder.java b/test/transform/resource/before/SuperBuilderWithGenericsAndToBuilder.java new file mode 100644 index 00000000..dae68034 --- /dev/null +++ b/test/transform/resource/before/SuperBuilderWithGenericsAndToBuilder.java @@ -0,0 +1,18 @@ +import java.util.List; + +public class SuperBuilderWithGenericsAndToBuilder { + @lombok.experimental.SuperBuilder(toBuilder = true) + public static class Parent { + A field1; + @lombok.Singular List items; + } + + @lombok.experimental.SuperBuilder(toBuilder = true) + public static class Child extends Parent { + double field3; + } + + public static void test() { + Child x = Child.builder().field3(0.0).field1(5).item("").build().toBuilder().build(); + } +} -- cgit