diff options
author | Jan Rieke <rieke@subshell.com> | 2018-05-30 11:52:42 +0200 |
---|---|---|
committer | Jan Rieke <rieke@subshell.com> | 2018-05-30 11:52:42 +0200 |
commit | 61f0689f6bfb8de28c90eb786cd9e9e06a776287 (patch) | |
tree | 03f27d45eb634fb034a2d9f8b4365fff45c8b3b8 | |
parent | 9ee2491427f1522a7689d1c28a816294bcff315b (diff) | |
download | lombok-61f0689f6bfb8de28c90eb786cd9e9e06a776287.tar.gz lombok-61f0689f6bfb8de28c90eb786cd9e9e06a776287.tar.bz2 lombok-61f0689f6bfb8de28c90eb786cd9e9e06a776287.zip |
ecj: copy type parameters to builder class
-rw-r--r-- | src/core/lombok/eclipse/handlers/HandleSuperBuilder.java | 33 | ||||
-rw-r--r-- | test/transform/resource/after-ecj/SuperBuilderWithGenerics.java | 261 |
2 files changed, 125 insertions, 169 deletions
diff --git a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java index 5586bc6b..40c84a3e 100644 --- a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java +++ b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java @@ -681,6 +681,16 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> { } return null; } + + private TypeReference[] appendBuilderTypeReferences(TypeParameter[] typeParams, String classGenericName, String builderGenericName) { + TypeReference[] typerefs = new TypeReference[typeParams.length + 2]; + for (int i = 0; i < typeParams.length; i++) { + typerefs[i] = new SingleTypeReference(typeParams[i].name, 0); + } + typerefs[typerefs.length - 2] = new SingleTypeReference(classGenericName.toCharArray(), 0); + typerefs[typerefs.length - 1] = new SingleTypeReference(builderGenericName.toCharArray(), 0); + return typerefs; + } private EclipseNode makeBuilderAbstractClass(EclipseNode tdParent, String builderClass, TypeReference superclassBuilderClass, TypeParameter[] typeParams, @@ -703,10 +713,7 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> { // 2. The return type for all setter methods, named "B", which extends this builder class. o = new TypeParameter(); o.name = builderGenericName.toCharArray(); - TypeReference[] typerefs = new TypeReference[] { - new SingleTypeReference(classGenericName.toCharArray(), 0), - new SingleTypeReference(builderGenericName.toCharArray(), 0) - }; + TypeReference[] typerefs = appendBuilderTypeReferences(typeParams, classGenericName, builderGenericName); o.type = new ParameterizedSingleTypeReference(builderClass.toCharArray(), typerefs, 0, 0); builder.typeParameters[builder.typeParameters.length - 1] = o; @@ -722,12 +729,26 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> { builder.bits |= Eclipse.ECLIPSE_DO_NOT_TOUCH_FLAG; builder.modifiers |= ClassFileConstants.AccPrivate | ClassFileConstants.AccStatic | ClassFileConstants.AccFinal; builder.name = builderImplClass.toCharArray(); + builder.typeParameters = copyTypeParams(typeParams, source); if (builderAbstractClass != null) { // Extend the abstract builder. - // TODO: 1. Add any type params of the annotated class. + // 1. Add any type params of the annotated class. + TypeReference[] typeArgs = new TypeReference[typeParams.length + 2]; + for (int i = 0; i < typeParams.length; i++) { + typeArgs[i] = new SingleTypeReference(typeParams[i].name, 0); + } // 2. The return type for the build() method (named "C" in the abstract builder), which is the annotated class. // 3. The return type for all setter methods (named "B" in the abstract builder), which is this builder class. - TypeReference[] typeArgs = new TypeReference[] {cloneSelfType(tdParent, source), new SingleTypeReference(builderImplClass.toCharArray(), 0)}; + typeArgs[typeArgs.length - 2] = cloneSelfType(tdParent, source); + if (typeParams.length > 0) { + TypeReference[] typerefs = new TypeReference[typeParams.length]; + for (int i = 0; i < typeParams.length; i++) { + typerefs[i] = new SingleTypeReference(typeParams[i].name, 0); + } + typeArgs[typeArgs.length - 1] = new ParameterizedSingleTypeReference(builderImplClass.toCharArray(), typerefs, 0, 0); + } else { + typeArgs[typeArgs.length - 1] = new SingleTypeReference(builderImplClass.toCharArray(), 0); + } builder.superclass = new ParameterizedSingleTypeReference(builderAbstractClass.toCharArray(), typeArgs, 0, 0); } builder.traverse(new SetGeneratedByVisitor(source), (ClassScope) null); diff --git a/test/transform/resource/after-ecj/SuperBuilderWithGenerics.java b/test/transform/resource/after-ecj/SuperBuilderWithGenerics.java index 9f71be5a..0ec8efe5 100644 --- a/test/transform/resource/after-ecj/SuperBuilderWithGenerics.java +++ b/test/transform/resource/after-ecj/SuperBuilderWithGenerics.java @@ -1,166 +1,101 @@ import java.util.List;
-
public class SuperBuilderWithGenerics {
- public static @lombok.experimental.SuperBuilder class Parent<A> {
- A field1;
- List<String> items;
-
- @java.lang.SuppressWarnings("all")
- protected Parent(final ParentBuilder<A, ?, ?> b) {
- this.field1 = b.field1;
- java.util.List<String> 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<String>(b.items));
- }
- this.items = items;
- }
-
-
- @java.lang.SuppressWarnings("all")
- public static abstract class ParentBuilder<A, C extends Parent<A>, B extends ParentBuilder<A, C, B>> {
- @java.lang.SuppressWarnings("all")
- private A field1;
- @java.lang.SuppressWarnings("all")
- private java.util.ArrayList<String> 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<String>();
- this.items.add(item);
- return self();
- }
-
- @java.lang.SuppressWarnings("all")
- public B items(final java.util.Collection<? extends String> items) {
- if (this.items == null) this.items = new java.util.ArrayList<String>();
- 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 "SuperBuilderWithGenerics.Parent.ParentBuilder(field1=" + this.field1 + ", items=" + this.items + ")";
- }
- }
-
-
- @java.lang.SuppressWarnings("all")
- private static final class ParentBuilderImpl<A> extends ParentBuilder<A, Parent<A>, ParentBuilderImpl<A>> {
- @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<A> build() {
- return new Parent<A>(this);
- }
- }
-
- @java.lang.SuppressWarnings("all")
- public static <A> ParentBuilder<A, ?, ?> builder() {
- return new ParentBuilderImpl<A>();
- }
- }
-
- @lombok.experimental.SuperBuilder
- public static class Child<A> extends Parent<A> {
- double field3;
-
- @java.lang.SuppressWarnings("all")
- protected Child(final ChildBuilder<A, ?, ?> b) {
- super(b);
- this.field3 = b.field3;
- }
-
-
- @java.lang.SuppressWarnings("all")
- public static abstract class ChildBuilder<A, C extends Child<A>, B extends ChildBuilder<A, C, B>> extends Parent.ParentBuilder<A, C, B> {
- @java.lang.SuppressWarnings("all")
- private double 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 "SuperBuilderWithGenerics.Child.ChildBuilder(super=" + super.toString() + ", field3=" + this.field3 + ")";
- }
- }
-
-
- @java.lang.SuppressWarnings("all")
- private static final class ChildBuilderImpl<A> extends ChildBuilder<A, Child<A>, ChildBuilderImpl<A>> {
- @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<A> build() {
- return new Child<A>(this);
- }
- }
-
- @java.lang.SuppressWarnings("all")
- public static <A> ChildBuilder<A, ?, ?> builder() {
- return new ChildBuilderImpl<A>();
- }
- }
-
- public static void test() {
- Child<Integer> x = Child.<Integer>builder().field3(0.0).field1(5).item("").build();
- }
+ public static @lombok.experimental.SuperBuilder class Parent<A> {
+ public static abstract @java.lang.SuppressWarnings("all") class ParentBuilder<A, C extends Parent<A>, B extends ParentBuilder<A, C, B>> {
+ private @java.lang.SuppressWarnings("all") A field1;
+ private @java.lang.SuppressWarnings("all") java.util.ArrayList<String> 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<String>();
+ this.items.add(item);
+ return self();
+ }
+ public @java.lang.SuppressWarnings("all") B items(java.util.Collection<? extends String> items) {
+ if ((this.items == null))
+ this.items = new java.util.ArrayList<String>();
+ 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 (((("SuperBuilderWithGenerics.Parent.ParentBuilder(field1=" + this.field1) + ", items=") + this.items) + ")");
+ }
+ }
+ private static final @java.lang.SuppressWarnings("all") class ParentBuilderImpl<A> extends ParentBuilder<A, Parent<A>, ParentBuilderImpl<A>> {
+ private @java.lang.SuppressWarnings("all") ParentBuilderImpl() {
+ }
+ protected @java.lang.Override @java.lang.SuppressWarnings("all") ParentBuilderImpl self() {
+ return this;
+ }
+ public @java.lang.Override @java.lang.SuppressWarnings("all") Parent<A> build() {
+ return new Parent<A>(this);
+ }
+ }
+ A field1;
+ @lombok.Singular List<String> items;
+ protected @java.lang.SuppressWarnings("all") Parent(final ParentBuilder<A, ?, ?> b) {
+ this.field1 = b.field1;
+ java.util.List<String> 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<String>(b.items));
+ }
+ this.items = items;
+ }
+ public static @java.lang.SuppressWarnings("all") <A> ParentBuilder<A, ?, ?> builder() {
+ return new ParentBuilderImpl<A>();
+ }
+ }
+ @lombok.experimental.SuperBuilder
+ public static class Child<A> extends Parent<A> {
+ double field3;
+ protected @java.lang.SuppressWarnings("all") Child(final ChildBuilder<A, ?, ?> b) {
+ super(b);
+ this.field3 = b.field3;
+ }
+ public static abstract class ChildBuilder<A, C extends Child<A>, B extends ChildBuilder<A, C, B>> extends Parent.ParentBuilder<A, C, B> {
+ private @java.lang.SuppressWarnings("all") double field3;
+ protected @java.lang.Override @java.lang.SuppressWarnings("all") abstract B self();
+ public @java.lang.Override @java.lang.SuppressWarnings("all") abstract 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 "SuperBuilderWithGenerics.Child.ChildBuilder(super=" + super.toString() + ", field3=" + this.field3 + ")";
+ }
+ }
+ private static final @java.lang.SuppressWarnings("all") class ChildBuilderImpl<A> extends ChildBuilder<A, Child<A>, ChildBuilderImpl<A>> {
+ private ChildBuilderImpl() {
+ }
+ protected @java.lang.Override @java.lang.SuppressWarnings("all") ChildBuilderImpl self() {
+ return this;
+ }
+ public @java.lang.Override @java.lang.SuppressWarnings("all") Child<A> build() {
+ return new Child<A>(this);
+ }
+ }
+ public static @java.lang.SuppressWarnings("all") <A> ChildBuilder<A, ?, ?> builder() {
+ return new ChildBuilderImpl<A>();
+ }
+ }
+ public static void test() {
+ Child<Integer> x = Child.<Integer>builder().field3(0.0).field1(5).item("").build();
+ }
}
|