aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Rieke <rieke@subshell.com>2018-05-30 11:52:42 +0200
committerJan Rieke <rieke@subshell.com>2018-05-30 11:52:42 +0200
commit61f0689f6bfb8de28c90eb786cd9e9e06a776287 (patch)
tree03f27d45eb634fb034a2d9f8b4365fff45c8b3b8
parent9ee2491427f1522a7689d1c28a816294bcff315b (diff)
downloadlombok-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.java33
-rw-r--r--test/transform/resource/after-ecj/SuperBuilderWithGenerics.java261
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();
+ }
}