mirror of
https://github.com/tiennm99/lombok.git
synced 2026-10-16 10:15:22 +00:00
Fixing issue #1298: @Builder with recursive generics didn’t work in javac/delombok.
This commit is contained in:
1 parent
fe3490328a
commit
74603cd9d3
6 files changed
+212
-24
No files matched your search
@@ -297,7 +297,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
|
||||
JavacNode builderType = findInnerClass(tdParent, builderClassName);
|
||||
if (builderType == null) {
|
||||
builderType = makeBuilderClass(isStatic, tdParent, builderClassName, typeParams, ast);
|
||||
builderType = makeBuilderClass(isStatic, annotationNode, tdParent, builderClassName, typeParams, ast);
|
||||
} else {
|
||||
JCClassDecl builderTypeDeclaration = (JCClassDecl) builderType.get();
|
||||
if (isStatic && !builderTypeDeclaration.getModifiers().getFlags().contains(Modifier.STATIC)) {
|
||||
@@ -319,7 +319,6 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
for (BuilderFieldData bfd : builderFields) {
|
||||
@@ -374,7 +373,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
if (addCleaning) injectMethod(builderType, generateCleanMethod(builderFields, builderType, ast));
|
||||
|
||||
if (methodExists(builderMethodName, tdParent, -1) == MemberExistsResult.NOT_EXISTS) {
|
||||
JCMethodDecl md = generateBuilderMethod(isStatic, builderMethodName, builderClassName, tdParent, typeParams);
|
||||
JCMethodDecl md = generateBuilderMethod(isStatic, builderMethodName, builderClassName, annotationNode, tdParent, typeParams);
|
||||
recursiveSetGeneratedBy(md, ast, annotationNode.getContext());
|
||||
if (md != null) injectMethod(tdParent, md);
|
||||
}
|
||||
@@ -549,7 +548,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
return maker.MethodDef(maker.Modifiers(Flags.PUBLIC), type.toName(buildName), returnType, List.<JCTypeParameter>nil(), List.<JCVariableDecl>nil(), thrownExceptions, body, null);
|
||||
}
|
||||
|
||||
public JCMethodDecl generateBuilderMethod(boolean isStatic, String builderMethodName, String builderClassName, JavacNode type, List<JCTypeParameter> typeParams) {
|
||||
public JCMethodDecl generateBuilderMethod(boolean isStatic, String builderMethodName, String builderClassName, JavacNode source, JavacNode type, List<JCTypeParameter> typeParams) {
|
||||
JavacTreeMaker maker = type.getTreeMaker();
|
||||
|
||||
ListBuffer<JCExpression> typeArgs = new ListBuffer<JCExpression>();
|
||||
@@ -563,7 +562,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
JCBlock body = maker.Block(0, List.<JCStatement>of(statement));
|
||||
int modifiers = Flags.PUBLIC;
|
||||
if (isStatic) modifiers |= Flags.STATIC;
|
||||
return maker.MethodDef(maker.Modifiers(modifiers), type.toName(builderMethodName), namePlusTypeParamsToTypeReference(maker, type.toName(builderClassName), typeParams), copyTypeParams(maker, typeParams), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);
|
||||
return maker.MethodDef(maker.Modifiers(modifiers), type.toName(builderMethodName), namePlusTypeParamsToTypeReference(maker, type.toName(builderClassName), typeParams), copyTypeParams(source, typeParams), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null);
|
||||
}
|
||||
|
||||
public void generateBuilderFields(JavacNode builderType, java.util.List<BuilderFieldData> builderFields, JCTree source) {
|
||||
@@ -628,12 +627,12 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
return null;
|
||||
}
|
||||
|
||||
public JavacNode makeBuilderClass(boolean isStatic, JavacNode tdParent, String builderClassName, List<JCTypeParameter> typeParams, JCAnnotation ast) {
|
||||
public JavacNode makeBuilderClass(boolean isStatic, JavacNode source, JavacNode tdParent, String builderClassName, List<JCTypeParameter> typeParams, JCAnnotation ast) {
|
||||
JavacTreeMaker maker = tdParent.getTreeMaker();
|
||||
int modifiers = Flags.PUBLIC;
|
||||
if (isStatic) modifiers |= Flags.STATIC;
|
||||
JCModifiers mods = maker.Modifiers(modifiers);
|
||||
JCClassDecl builder = maker.ClassDef(mods, tdParent.toName(builderClassName), copyTypeParams(maker, typeParams), null, List.<JCExpression>nil(), List.<JCTree>nil());
|
||||
JCClassDecl builder = maker.ClassDef(mods, tdParent.toName(builderClassName), copyTypeParams(source, typeParams), null, List.<JCExpression>nil(), List.<JCTree>nil());
|
||||
return injectType(tdParent, builder);
|
||||
}
|
||||
|
||||
|
||||
@@ -92,6 +92,7 @@ import com.sun.tools.javac.tree.JCTree.JCTypeParameter;
|
||||
import com.sun.tools.javac.tree.JCTree.JCVariableDecl;
|
||||
import com.sun.tools.javac.tree.JCTree.JCWildcard;
|
||||
import com.sun.tools.javac.tree.JCTree.TypeBoundKind;
|
||||
import com.sun.tools.javac.tree.TreeMaker;
|
||||
import com.sun.tools.javac.tree.TreeScanner;
|
||||
import com.sun.tools.javac.util.Context;
|
||||
import com.sun.tools.javac.util.JCDiagnostic.DiagnosticPosition;
|
||||
@@ -1317,10 +1318,22 @@ public class JavacHandlerUtil {
|
||||
return result.toList();
|
||||
}
|
||||
|
||||
public static List<JCTypeParameter> copyTypeParams(JavacTreeMaker maker, List<JCTypeParameter> params) {
|
||||
public static List<JCTypeParameter> copyTypeParams(JavacNode source, List<JCTypeParameter> params) {
|
||||
if (params == null || params.isEmpty()) return params;
|
||||
ListBuffer<JCTypeParameter> out = new ListBuffer<JCTypeParameter>();
|
||||
for (JCTypeParameter tp : params) out.append(maker.TypeParameter(tp.name, tp.bounds));
|
||||
JavacTreeMaker maker = source.getTreeMaker();
|
||||
Context context = source.getContext();
|
||||
for (JCTypeParameter tp : params) {
|
||||
List<JCExpression> bounds = tp.bounds;
|
||||
if (bounds != null && !bounds.isEmpty()) {
|
||||
ListBuffer<JCExpression> boundsCopy = new ListBuffer<JCExpression>();
|
||||
for (JCExpression expr : tp.bounds) {
|
||||
boundsCopy.append(cloneType(maker, expr, source.get(), context));
|
||||
}
|
||||
bounds = boundsCopy.toList();
|
||||
}
|
||||
out.append(maker.TypeParameter(tp.name, bounds));
|
||||
}
|
||||
return out.toList();
|
||||
}
|
||||
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
import java.util.Set;
|
||||
import lombok.Builder;
|
||||
import lombok.Value;
|
||||
|
||||
public class I1298BuilderWithGenerics {
|
||||
interface Inter<T, U extends Inter<T, U>> {}
|
||||
|
||||
@Builder @Value public static class Test<
|
||||
Foo,
|
||||
Bar extends Set<Foo>,
|
||||
Quz extends Inter<Bar, Quz>> {
|
||||
Foo foo;
|
||||
Bar bar;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,100 @@
|
||||
import java.util.Set;
|
||||
public class BuilderWithRecursiveGenerics {
|
||||
interface Inter<T, U extends Inter<T, U>> {
|
||||
}
|
||||
public static final class Test<Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> {
|
||||
private final Foo foo;
|
||||
private final Bar bar;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
Test(final Foo foo, final Bar bar) {
|
||||
this.foo = foo;
|
||||
this.bar = bar;
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
public static class TestBuilder<Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> {
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
private Foo foo;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
private Bar bar;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
TestBuilder() {
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
public TestBuilder<Foo, Bar, Quz> foo(final Foo foo) {
|
||||
this.foo = foo;
|
||||
return this;
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
public TestBuilder<Foo, Bar, Quz> bar(final Bar bar) {
|
||||
this.bar = bar;
|
||||
return this;
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
public Test<Foo, Bar, Quz> build() {
|
||||
return new Test<Foo, Bar, Quz>(foo, bar);
|
||||
}
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
public java.lang.String toString() {
|
||||
return "BuilderWithRecursiveGenerics.Test.TestBuilder(foo=" + this.foo + ", bar=" + this.bar + ")";
|
||||
}
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
public static <Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> TestBuilder<Foo, Bar, Quz> builder() {
|
||||
return new TestBuilder<Foo, Bar, Quz>();
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
public Foo getFoo() {
|
||||
return this.foo;
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
public Bar getBar() {
|
||||
return this.bar;
|
||||
}
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
public boolean equals(final java.lang.Object o) {
|
||||
if (o == this) return true;
|
||||
if (!(o instanceof BuilderWithRecursiveGenerics.Test)) return false;
|
||||
final BuilderWithRecursiveGenerics.Test<?, ?, ?> other = (BuilderWithRecursiveGenerics.Test<?, ?, ?>) o;
|
||||
final java.lang.Object this$foo = this.getFoo();
|
||||
final java.lang.Object other$foo = other.getFoo();
|
||||
if (this$foo == null ? other$foo != null : !this$foo.equals(other$foo)) return false;
|
||||
final java.lang.Object this$bar = this.getBar();
|
||||
final java.lang.Object other$bar = other.getBar();
|
||||
if (this$bar == null ? other$bar != null : !this$bar.equals(other$bar)) return false;
|
||||
return true;
|
||||
}
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
public int hashCode() {
|
||||
final int PRIME = 59;
|
||||
int result = 1;
|
||||
final java.lang.Object $foo = this.getFoo();
|
||||
result = result * PRIME + ($foo == null ? 43 : $foo.hashCode());
|
||||
final java.lang.Object $bar = this.getBar();
|
||||
result = result * PRIME + ($bar == null ? 43 : $bar.hashCode());
|
||||
return result;
|
||||
}
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@javax.annotation.Generated("lombok")
|
||||
public java.lang.String toString() {
|
||||
return "BuilderWithRecursiveGenerics.Test(foo=" + this.getFoo() + ", bar=" + this.getBar() + ")";
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
import java.util.Set;
|
||||
import lombok.Builder;
|
||||
import lombok.Value;
|
||||
public class BuilderWithRecursiveGenerics {
|
||||
interface Inter<T, U extends Inter<T, U>> {
|
||||
}
|
||||
public static final @Builder @Value class Test<Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> {
|
||||
public static @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") class TestBuilder<Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> {
|
||||
private @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") Foo foo;
|
||||
private @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") Bar bar;
|
||||
@java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") TestBuilder() {
|
||||
super();
|
||||
}
|
||||
public @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") TestBuilder<Foo, Bar, Quz> foo(final Foo foo) {
|
||||
this.foo = foo;
|
||||
return this;
|
||||
}
|
||||
public @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") TestBuilder<Foo, Bar, Quz> bar(final Bar bar) {
|
||||
this.bar = bar;
|
||||
return this;
|
||||
}
|
||||
public @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") Test<Foo, Bar, Quz> build() {
|
||||
return new Test<Foo, Bar, Quz>(foo, bar);
|
||||
}
|
||||
public @java.lang.Override @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") java.lang.String toString() {
|
||||
return (((("BuilderWithRecursiveGenerics.Test.TestBuilder(foo=" + this.foo) + ", bar=") + this.bar) + ")");
|
||||
}
|
||||
}
|
||||
private final Foo foo;
|
||||
private final Bar bar;
|
||||
@java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") Test(final Foo foo, final Bar bar) {
|
||||
super();
|
||||
this.foo = foo;
|
||||
this.bar = bar;
|
||||
}
|
||||
public static @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") <Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>>TestBuilder<Foo, Bar, Quz> builder() {
|
||||
return new TestBuilder<Foo, Bar, Quz>();
|
||||
}
|
||||
public @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") Foo getFoo() {
|
||||
return this.foo;
|
||||
}
|
||||
public @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") Bar getBar() {
|
||||
return this.bar;
|
||||
}
|
||||
public @java.lang.Override @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") boolean equals(final java.lang.Object o) {
|
||||
if ((o == this))
|
||||
return true;
|
||||
if ((! (o instanceof BuilderWithRecursiveGenerics.Test)))
|
||||
return false;
|
||||
final BuilderWithRecursiveGenerics.Test<?, ?, ?> other = (BuilderWithRecursiveGenerics.Test<?, ?, ?>) o;
|
||||
final java.lang.Object this$foo = this.getFoo();
|
||||
final java.lang.Object other$foo = other.getFoo();
|
||||
if (((this$foo == null) ? (other$foo != null) : (! this$foo.equals(other$foo))))
|
||||
return false;
|
||||
final java.lang.Object this$bar = this.getBar();
|
||||
final java.lang.Object other$bar = other.getBar();
|
||||
if (((this$bar == null) ? (other$bar != null) : (! this$bar.equals(other$bar))))
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
public @java.lang.Override @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") int hashCode() {
|
||||
final int PRIME = 59;
|
||||
int result = 1;
|
||||
final java.lang.Object $foo = this.getFoo();
|
||||
result = ((result * PRIME) + (($foo == null) ? 43 : $foo.hashCode()));
|
||||
final java.lang.Object $bar = this.getBar();
|
||||
result = ((result * PRIME) + (($bar == null) ? 43 : $bar.hashCode()));
|
||||
return result;
|
||||
}
|
||||
public @java.lang.Override @java.lang.SuppressWarnings("all") @javax.annotation.Generated("lombok") java.lang.String toString() {
|
||||
return (((("BuilderWithRecursiveGenerics.Test(foo=" + this.getFoo()) + ", bar=") + this.getBar()) + ")");
|
||||
}
|
||||
}
|
||||
public BuilderWithRecursiveGenerics() {
|
||||
super();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
//issue #1298
|
||||
import java.util.Set;
|
||||
import lombok.Builder;
|
||||
import lombok.Value;
|
||||
|
||||
public class BuilderWithRecursiveGenerics {
|
||||
interface Inter<T, U extends Inter<T, U>> {}
|
||||
|
||||
@Builder @Value public static class Test<Foo, Bar extends Set<Foo>, Quz extends Inter<Bar, Quz>> {
|
||||
Foo foo;
|
||||
Bar bar;
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user