From 07a0cf7cdd1bbef7031f1da9344514a54286ca96 Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Fri, 17 May 2024 02:33:36 +0200 Subject: [PATCH] [bugfix] mixing `@Delegate` and `@Getter(lazy)` causes positions to be lost. 15 years and nobody found this bug - not worth an issue or a changelog. --- .../lombok/javac/handlers/HandleGetter.java | 2 +- .../lombok/javac/handlers/JavacHandlerUtil.java | 17 ++++++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/core/lombok/javac/handlers/HandleGetter.java b/src/core/lombok/javac/handlers/HandleGetter.java index dac524dd..5c7b5b0f 100644 --- a/src/core/lombok/javac/handlers/HandleGetter.java +++ b/src/core/lombok/javac/handlers/HandleGetter.java @@ -215,7 +215,7 @@ public class HandleGetter extends JavacAnnotationHandler { long access = toJavacModifier(level) | (fieldDecl.mods.flags & Flags.STATIC); - injectMethod(fieldNode.up(), createGetter(access, fieldNode, fieldNode.getTreeMaker(), source, lazy, onMethod)); + injectMethod(fieldNode.up(), source, createGetter(access, fieldNode, fieldNode.getTreeMaker(), source, lazy, onMethod)); } public JCMethodDecl createGetter(long access, JavacNode field, JavacTreeMaker treeMaker, JavacNode source, boolean lazy, List onMethod) { diff --git a/src/core/lombok/javac/handlers/JavacHandlerUtil.java b/src/core/lombok/javac/handlers/JavacHandlerUtil.java index 8b563824..660ebcc8 100644 --- a/src/core/lombok/javac/handlers/JavacHandlerUtil.java +++ b/src/core/lombok/javac/handlers/JavacHandlerUtil.java @@ -1369,6 +1369,21 @@ public class JavacHandlerUtil { * Also takes care of updating the JavacAST. */ public static void injectMethod(JavacNode typeNode, JCMethodDecl method) { + JavacNode source = typeNode.getNodeFor(getGeneratedBy(method)); + injectMethod(typeNode, source, method); + } + + /** + * Adds the given new method declaration to the provided type AST Node. + * Can also inject constructors. + * + * Also takes care of updating the JavacAST. + * + * Ordinarily the 'source' is determined automatically. In rare cases generally involving combinations between + * annotations, some of which require re-attribution such as {@code @Delegate}, that doesn't work. This method + * exists if you explicitly have the source. + */ + public static void injectMethod(JavacNode typeNode, JavacNode source, JCMethodDecl method) { JCClassDecl type = (JCClassDecl) typeNode.get(); if (method.getName().contentEquals("")) { @@ -1389,7 +1404,7 @@ public class JavacHandlerUtil { } addSuppressWarningsAll(method.mods, typeNode, typeNode.getNodeFor(getGeneratedBy(method)), typeNode.getContext()); - addGenerated(method.mods, typeNode, typeNode.getNodeFor(getGeneratedBy(method)), typeNode.getContext()); + addGenerated(method.mods, typeNode, source, typeNode.getContext()); type.defs = type.defs.append(method); EnterReflect.memberEnter(method, typeNode);