diff options
author | Rawi01 <Rawi01@users.noreply.github.com> | 2021-12-01 09:42:41 +0100 |
---|---|---|
committer | Roel Spilker <r.spilker@gmail.com> | 2021-12-12 02:31:59 +0100 |
commit | 16fcff1b44911b80c0a29a18e0066f5ca936df80 (patch) | |
tree | 7dc5ae73431cb1935fc72ab06caf12a73800afbf /src/core | |
parent | ff7b1fbb438dbb378f9e0f725ed5f80fa7b82f55 (diff) | |
download | lombok-16fcff1b44911b80c0a29a18e0066f5ca936df80.tar.gz lombok-16fcff1b44911b80c0a29a18e0066f5ca936df80.tar.bz2 lombok-16fcff1b44911b80c0a29a18e0066f5ca936df80.zip |
[fixes #3036] Keep builder default initializer position
Diffstat (limited to 'src/core')
-rw-r--r-- | src/core/lombok/javac/handlers/HandleBuilder.java | 18 | ||||
-rw-r--r-- | src/core/lombok/javac/handlers/HandleSuperBuilder.java | 3 |
2 files changed, 14 insertions, 7 deletions
diff --git a/src/core/lombok/javac/handlers/HandleBuilder.java b/src/core/lombok/javac/handlers/HandleBuilder.java index d8fdfb1b..7f32001b 100644 --- a/src/core/lombok/javac/handlers/HandleBuilder.java +++ b/src/core/lombok/javac/handlers/HandleBuilder.java @@ -47,6 +47,7 @@ import com.sun.tools.javac.tree.JCTree.JCMethodInvocation; import com.sun.tools.javac.tree.JCTree.JCModifiers; import com.sun.tools.javac.tree.JCTree.JCNewClass; import com.sun.tools.javac.tree.JCTree.JCPrimitiveTypeTree; +import com.sun.tools.javac.tree.JCTree.JCReturn; import com.sun.tools.javac.tree.JCTree.JCStatement; import com.sun.tools.javac.tree.JCTree.JCTypeApply; import com.sun.tools.javac.tree.JCTree.JCTypeParameter; @@ -286,8 +287,7 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> { bfd.nameOfDefaultProvider = parent.toName(DEFAULT_PREFIX + bfd.name); bfd.nameOfSetFlag = parent.toName(bfd.name + SET_PREFIX); bfd.builderFieldName = parent.toName(bfd.name + VALUE_PREFIX); - JCMethodDecl md = generateDefaultProvider(bfd.nameOfDefaultProvider, fieldNode, td.typarams); - recursiveSetGeneratedBy(md, annotationNode); + JCMethodDecl md = generateDefaultProvider(bfd.nameOfDefaultProvider, fieldNode, td.typarams, job); if (md != null) injectMethod(parent, md); } addObtainVia(bfd, fieldNode); @@ -804,16 +804,24 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> { return methodDef; } - public static JCMethodDecl generateDefaultProvider(Name methodName, JavacNode fieldNode, List<JCTypeParameter> params) { + public static JCMethodDecl generateDefaultProvider(Name methodName, JavacNode fieldNode, List<JCTypeParameter> params, BuilderJob job) { JavacTreeMaker maker = fieldNode.getTreeMaker(); JCVariableDecl field = (JCVariableDecl) fieldNode.get(); - JCStatement statement = maker.Return(field.init); + // Lombok tries to keep the position of the original initializer. First we save the expression ... + JCExpression init = field.init; field.init = null; + // ... then we generate an empty return statement ... + JCReturn statement = maker.Return(null); JCBlock body = maker.Block(0, List.<JCStatement>of(statement)); int modifiers = Flags.PRIVATE | Flags.STATIC; - return maker.MethodDef(maker.Modifiers(modifiers), methodName, cloneType(maker, field.vartype, fieldNode), copyTypeParams(fieldNode, params), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null); + JCMethodDecl defaultProvider = maker.MethodDef(maker.Modifiers(modifiers), methodName, cloneType(maker, field.vartype, fieldNode), copyTypeParams(fieldNode, params), List.<JCVariableDecl>nil(), List.<JCExpression>nil(), body, null); + // ... then we set positions for everything else ... + recursiveSetGeneratedBy(defaultProvider, job.sourceNode); + // ... and finally add back the original expression + statement.expr = init; + return defaultProvider; } public JCMethodDecl generateBuilderMethod(BuilderJob job) { diff --git a/src/core/lombok/javac/handlers/HandleSuperBuilder.java b/src/core/lombok/javac/handlers/HandleSuperBuilder.java index b5bc73fb..de8163dd 100644 --- a/src/core/lombok/javac/handlers/HandleSuperBuilder.java +++ b/src/core/lombok/javac/handlers/HandleSuperBuilder.java @@ -208,8 +208,7 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> { bfd.nameOfDefaultProvider = parent.toName(DEFAULT_PREFIX + bfd.name); bfd.nameOfSetFlag = parent.toName(bfd.name + SET_PREFIX); bfd.builderFieldName = parent.toName(bfd.name + VALUE_PREFIX); - JCMethodDecl md = HandleBuilder.generateDefaultProvider(bfd.nameOfDefaultProvider, fieldNode, td.typarams); - recursiveSetGeneratedBy(md, annotationNode); + JCMethodDecl md = HandleBuilder.generateDefaultProvider(bfd.nameOfDefaultProvider, fieldNode, td.typarams, job); if (md != null) injectMethod(parent, md); } addObtainVia(bfd, fieldNode); |