From b73fe1adf0d540e4b265fdf523b16a6f5bfa9dbd Mon Sep 17 00:00:00 2001 From: Rawi01 Date: Mon, 31 Jan 2022 22:17:10 +0100 Subject: [PATCH] [fixes #3053] Delay default annotation removal --- .../handlers/HandleBuilderDefaultRemove.java | 1 + .../javac/handlers/HandleSuperBuilder.java | 4 +- .../ConstructorsWithSuperBuilderDefaults.java | 94 +++++++++++++++++++ ...perBuilderWithDefaultsAndTargetTyping.java | 1 - .../ConstructorsWithSuperBuilderDefaults.java | 70 ++++++++++++++ .../ConstructorsWithSuperBuilderDefaults.java | 12 +++ 6 files changed, 180 insertions(+), 2 deletions(-) create mode 100644 test/transform/resource/after-delombok/ConstructorsWithSuperBuilderDefaults.java create mode 100644 test/transform/resource/after-ecj/ConstructorsWithSuperBuilderDefaults.java create mode 100644 test/transform/resource/before/ConstructorsWithSuperBuilderDefaults.java diff --git a/src/core/lombok/javac/handlers/HandleBuilderDefaultRemove.java b/src/core/lombok/javac/handlers/HandleBuilderDefaultRemove.java index d7bc28cb2f..64360eb260 100644 --- a/src/core/lombok/javac/handlers/HandleBuilderDefaultRemove.java +++ b/src/core/lombok/javac/handlers/HandleBuilderDefaultRemove.java @@ -40,5 +40,6 @@ public class HandleBuilderDefaultRemove extends JavacAnnotationHandler { @Override public void handle(AnnotationValues annotation, JCAnnotation ast, JavacNode annotationNode) { deleteAnnotationIfNeccessary(annotationNode, Builder.Default.class); + deleteImportFromCompilationUnit(annotationNode, Builder.class.getName()); } } diff --git a/src/core/lombok/javac/handlers/HandleSuperBuilder.java b/src/core/lombok/javac/handlers/HandleSuperBuilder.java index adf3f5843f..7418ac87e3 100644 --- a/src/core/lombok/javac/handlers/HandleSuperBuilder.java +++ b/src/core/lombok/javac/handlers/HandleSuperBuilder.java @@ -177,7 +177,7 @@ public void handle(AnnotationValues annotation, JCAnnotation ast, boolean valuePresent = (hasAnnotation(lombok.Value.class, parent) || hasAnnotation("lombok.experimental.Value", parent)); for (JavacNode fieldNode : HandleConstructor.findAllFields(parent, true)) { JCVariableDecl fd = (JCVariableDecl) fieldNode.get(); - JavacNode isDefault = findAnnotation(Builder.Default.class, fieldNode, true); + JavacNode isDefault = findAnnotation(Builder.Default.class, fieldNode, false); boolean isFinal = (fd.mods.flags & Flags.FINAL) != 0 || (valuePresent && !hasAnnotation(NonFinal.class, fieldNode)); BuilderFieldData bfd = new BuilderFieldData(); bfd.rawName = fd.name; @@ -190,11 +190,13 @@ public void handle(AnnotationValues annotation, JCAnnotation ast, if (bfd.singularData != null && isDefault != null) { isDefault.addError("@Builder.Default and @Singular cannot be mixed."); + findAnnotation(Builder.Default.class, fieldNode, true); isDefault = null; } if (fd.init == null && isDefault != null) { isDefault.addWarning("@Builder.Default requires an initializing expression (' = something;')."); + findAnnotation(Builder.Default.class, fieldNode, true); isDefault = null; } diff --git a/test/transform/resource/after-delombok/ConstructorsWithSuperBuilderDefaults.java b/test/transform/resource/after-delombok/ConstructorsWithSuperBuilderDefaults.java new file mode 100644 index 0000000000..e7811dd5db --- /dev/null +++ b/test/transform/resource/after-delombok/ConstructorsWithSuperBuilderDefaults.java @@ -0,0 +1,94 @@ +class ConstructorsWithSuperBuilderDefaults { + int x; + int y; + + @java.lang.SuppressWarnings("all") + private static int $default$x() { + return 5; + } + + + @java.lang.SuppressWarnings("all") + public static abstract class ConstructorsWithSuperBuilderDefaultsBuilder> { + @java.lang.SuppressWarnings("all") + private boolean x$set; + @java.lang.SuppressWarnings("all") + private int x$value; + @java.lang.SuppressWarnings("all") + private int y; + + @java.lang.SuppressWarnings("all") + protected abstract B self(); + + @java.lang.SuppressWarnings("all") + public abstract C build(); + + /** + * @return {@code this}. + */ + @java.lang.SuppressWarnings("all") + public B x(final int x) { + this.x$value = x; + x$set = true; + return self(); + } + + /** + * @return {@code this}. + */ + @java.lang.SuppressWarnings("all") + public B y(final int y) { + this.y = y; + return self(); + } + + @java.lang.Override + @java.lang.SuppressWarnings("all") + public java.lang.String toString() { + return "ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder(x$value=" + this.x$value + ", y=" + this.y + ")"; + } + } + + + @java.lang.SuppressWarnings("all") + private static final class ConstructorsWithSuperBuilderDefaultsBuilderImpl extends ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder { + @java.lang.SuppressWarnings("all") + private ConstructorsWithSuperBuilderDefaultsBuilderImpl() { + } + + @java.lang.Override + @java.lang.SuppressWarnings("all") + protected ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilderImpl self() { + return this; + } + + @java.lang.Override + @java.lang.SuppressWarnings("all") + public ConstructorsWithSuperBuilderDefaults build() { + return new ConstructorsWithSuperBuilderDefaults(this); + } + } + + @java.lang.SuppressWarnings("all") + protected ConstructorsWithSuperBuilderDefaults(final ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder b) { + if (b.x$set) this.x = b.x$value; + else this.x = ConstructorsWithSuperBuilderDefaults.$default$x(); + this.y = b.y; + } + + @java.lang.SuppressWarnings("all") + public static ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder builder() { + return new ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilderImpl(); + } + + @java.lang.SuppressWarnings("all") + public ConstructorsWithSuperBuilderDefaults() { + this.x = ConstructorsWithSuperBuilderDefaults.$default$x(); + } + + @java.lang.SuppressWarnings("all") + public ConstructorsWithSuperBuilderDefaults(final int x, final int y) { + this.x = x; + this.y = y; + } +} \ No newline at end of file diff --git a/test/transform/resource/after-delombok/SuperBuilderWithDefaultsAndTargetTyping.java b/test/transform/resource/after-delombok/SuperBuilderWithDefaultsAndTargetTyping.java index c3fc4ce842..bc7b309951 100644 --- a/test/transform/resource/after-delombok/SuperBuilderWithDefaultsAndTargetTyping.java +++ b/test/transform/resource/after-delombok/SuperBuilderWithDefaultsAndTargetTyping.java @@ -1,5 +1,4 @@ import java.util.Arrays; -import lombok.Builder; public class SuperBuilderWithDefaultsAndTargetTyping { diff --git a/test/transform/resource/after-ecj/ConstructorsWithSuperBuilderDefaults.java b/test/transform/resource/after-ecj/ConstructorsWithSuperBuilderDefaults.java new file mode 100644 index 0000000000..a6c97d3b62 --- /dev/null +++ b/test/transform/resource/after-ecj/ConstructorsWithSuperBuilderDefaults.java @@ -0,0 +1,70 @@ +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import lombok.Builder; +@NoArgsConstructor @AllArgsConstructor @SuperBuilder class ConstructorsWithSuperBuilderDefaults { + public static abstract @java.lang.SuppressWarnings("all") class ConstructorsWithSuperBuilderDefaultsBuilder> { + private @java.lang.SuppressWarnings("all") int x$value; + private @java.lang.SuppressWarnings("all") boolean x$set; + private @java.lang.SuppressWarnings("all") int y; + public ConstructorsWithSuperBuilderDefaultsBuilder() { + super(); + } + protected abstract @java.lang.SuppressWarnings("all") B self(); + public abstract @java.lang.SuppressWarnings("all") C build(); + /** + * @return {@code this}. + */ + public @java.lang.SuppressWarnings("all") B x(final int x) { + this.x$value = x; + x$set = true; + return self(); + } + /** + * @return {@code this}. + */ + public @java.lang.SuppressWarnings("all") B y(final int y) { + this.y = y; + return self(); + } + public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { + return (((("ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder(x$value=" + this.x$value) + ", y=") + this.y) + ")"); + } + } + private static final @java.lang.SuppressWarnings("all") class ConstructorsWithSuperBuilderDefaultsBuilderImpl extends ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder { + private ConstructorsWithSuperBuilderDefaultsBuilderImpl() { + super(); + } + protected @java.lang.Override @java.lang.SuppressWarnings("all") ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilderImpl self() { + return this; + } + public @java.lang.Override @java.lang.SuppressWarnings("all") ConstructorsWithSuperBuilderDefaults build() { + return new ConstructorsWithSuperBuilderDefaults(this); + } + } + @Builder.Default int x; + int y; + private static @java.lang.SuppressWarnings("all") int $default$x() { + return 5; + } + protected @java.lang.SuppressWarnings("all") ConstructorsWithSuperBuilderDefaults(final ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder b) { + super(); + if (b.x$set) + this.x = b.x$value; + else + this.x = ConstructorsWithSuperBuilderDefaults.$default$x(); + this.y = b.y; + } + public static @java.lang.SuppressWarnings("all") ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilder builder() { + return new ConstructorsWithSuperBuilderDefaults.ConstructorsWithSuperBuilderDefaultsBuilderImpl(); + } + public @java.lang.SuppressWarnings("all") ConstructorsWithSuperBuilderDefaults() { + super(); + this.x = ConstructorsWithSuperBuilderDefaults.$default$x(); + } + public @java.lang.SuppressWarnings("all") ConstructorsWithSuperBuilderDefaults(final int x, final int y) { + super(); + this.x = x; + this.y = y; + } +} \ No newline at end of file diff --git a/test/transform/resource/before/ConstructorsWithSuperBuilderDefaults.java b/test/transform/resource/before/ConstructorsWithSuperBuilderDefaults.java new file mode 100644 index 0000000000..a214132a05 --- /dev/null +++ b/test/transform/resource/before/ConstructorsWithSuperBuilderDefaults.java @@ -0,0 +1,12 @@ +import lombok.AllArgsConstructor; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; +import lombok.Builder; + +@NoArgsConstructor +@AllArgsConstructor +@SuperBuilder +class ConstructorsWithSuperBuilderDefaults { + @Builder.Default int x = 5; + int y; +}