From 865c6344e714d75945ca1bc28747a03476441aad Mon Sep 17 00:00:00 2001 From: sadv1r Date: Thu, 20 May 2021 22:15:45 +0300 Subject: [PATCH] #2596 Builder's setter prefix configurable from lombok.config --- AUTHORS | 1 + src/core/lombok/ConfigurationKeys.java | 7 ++++ .../lombok/core/handlers/HandlerUtil.java | 12 ++++++ .../eclipse/handlers/HandleBuilder.java | 8 ++-- .../lombok/javac/handlers/HandleBuilder.java | 8 ++-- ...erSimpleWithSetterPrefixConfiguration.java | 37 +++++++++++++++++++ ...erSimpleWithSetterPrefixConfiguration.java | 30 +++++++++++++++ ...erSimpleWithSetterPrefixConfiguration.java | 8 ++++ website/templates/features/Builder.html | 4 ++ 9 files changed, 107 insertions(+), 8 deletions(-) create mode 100644 test/transform/resource/after-delombok/BuilderSimpleWithSetterPrefixConfiguration.java create mode 100644 test/transform/resource/after-ecj/BuilderSimpleWithSetterPrefixConfiguration.java create mode 100644 test/transform/resource/before/BuilderSimpleWithSetterPrefixConfiguration.java diff --git a/AUTHORS b/AUTHORS index 547246d989..c2fa6340cf 100755 --- a/AUTHORS +++ b/AUTHORS @@ -13,6 +13,7 @@ DaveLaw Dave Brosius Dawid Rusin Denis Stepanov +Dmitry Ivanov Emil Lundberg Enrique da Costa Cambio Jacob Middag diff --git a/src/core/lombok/ConfigurationKeys.java b/src/core/lombok/ConfigurationKeys.java index b8cd442ace..72dd72b0ef 100644 --- a/src/core/lombok/ConfigurationKeys.java +++ b/src/core/lombok/ConfigurationKeys.java @@ -299,6 +299,13 @@ private ConfigurationKeys() {} */ public static final ConfigurationKey BUILDER_CLASS_NAME = new ConfigurationKey("lombok.builder.className", "Default name of the generated builder class. A * is replaced with the name of the relevant type (default = *Builder).") {}; + /** + * lombok configuration: {@code lombok.builder.setterPrefix} = <String: prefix>. + * + * For any usage of the {@code @Builder} annotation without an explicit {@code setterPrefix} parameter, this prefix is used. + */ + public static final ConfigurationKey BUILDER_SETTER_PREFIX = new ConfigurationKey("lombok.builder.setterPrefix", "The prefix to prepend to generated @Builder setter method names") {}; + /** * lombok configuration: {@code lombok.builder.flagUsage} = {@code WARNING} | {@code ERROR}. * diff --git a/src/core/lombok/core/handlers/HandlerUtil.java b/src/core/lombok/core/handlers/HandlerUtil.java index 19cc5a9e2a..100bc0500c 100644 --- a/src/core/lombok/core/handlers/HandlerUtil.java +++ b/src/core/lombok/core/handlers/HandlerUtil.java @@ -845,4 +845,16 @@ public static String getParamJavadoc(String methodComment, String param) { } return null; } + + public static String getBuilderSetterPrefix(LombokNode node, String setterPrefix) { + boolean explicitPrefix = setterPrefix != null && !setterPrefix.isEmpty(); + if (explicitPrefix) { + return setterPrefix; + } + + String configurationPrefix = node.getAst().readConfiguration(ConfigurationKeys.BUILDER_SETTER_PREFIX); + if (configurationPrefix != null && !configurationPrefix.isEmpty()) return configurationPrefix; + + return setterPrefix; + } } diff --git a/src/core/lombok/eclipse/handlers/HandleBuilder.java b/src/core/lombok/eclipse/handlers/HandleBuilder.java index dab774f30b..c536666cdf 100755 --- a/src/core/lombok/eclipse/handlers/HandleBuilder.java +++ b/src/core/lombok/eclipse/handlers/HandleBuilder.java @@ -315,7 +315,7 @@ private static final char[] prefixWith(char[] prefix, char[] name) { bfd.builderFieldName = bfd.name; bfd.annotations = copyAnnotations(fd, findCopyableAnnotations(fieldNode)); bfd.type = fd.type; - bfd.singularData = getSingularData(fieldNode, ast, annInstance.setterPrefix()); + bfd.singularData = getSingularData(fieldNode, ast, getBuilderSetterPrefix(annotationNode, annInstance.setterPrefix())); bfd.originalFieldNode = fieldNode; if (bfd.singularData != null && isDefault != null) { @@ -478,7 +478,7 @@ private static final char[] prefixWith(char[] prefix, char[] name) { bfd.builderFieldName = bfd.name; bfd.annotations = copyAnnotations(arg, copyableAnnotations); bfd.type = arg.type; - bfd.singularData = getSingularData(param, ast, annInstance.setterPrefix()); + bfd.singularData = getSingularData(param, ast, getBuilderSetterPrefix(annotationNode, annInstance.setterPrefix())); bfd.originalFieldNode = param; addObtainVia(bfd, param); job.builderFields.add(bfd); @@ -547,7 +547,7 @@ private static final char[] prefixWith(char[] prefix, char[] name) { } for (BuilderFieldData bfd : job.builderFields) { - makePrefixedSetterMethodsForBuilder(job, bfd, annInstance.setterPrefix()); + makePrefixedSetterMethodsForBuilder(job, bfd, getBuilderSetterPrefix(annotationNode, annInstance.setterPrefix())); } { @@ -594,7 +594,7 @@ private static final char[] prefixWith(char[] prefix, char[] name) { tps[i].name = typeArgsForToBuilder.get(i); } } - MethodDeclaration md = generateToBuilderMethod(job, tps, annInstance.setterPrefix()); + MethodDeclaration md = generateToBuilderMethod(job, tps, getBuilderSetterPrefix(annotationNode, annInstance.setterPrefix())); if (md != null) injectMethod(job.parentType, md); } diff --git a/src/core/lombok/javac/handlers/HandleBuilder.java b/src/core/lombok/javac/handlers/HandleBuilder.java index c23dc14c34..bb486e4d89 100644 --- a/src/core/lombok/javac/handlers/HandleBuilder.java +++ b/src/core/lombok/javac/handlers/HandleBuilder.java @@ -256,7 +256,7 @@ static class BuilderFieldData { bfd.builderFieldName = bfd.name; bfd.annotations = findCopyableAnnotations(fieldNode); bfd.type = fd.vartype; - bfd.singularData = getSingularData(fieldNode, annInstance.setterPrefix()); + bfd.singularData = getSingularData(fieldNode, getBuilderSetterPrefix(annotationNode, annInstance.setterPrefix())); bfd.originalFieldNode = fieldNode; if (bfd.singularData != null && isDefault != null) { @@ -417,7 +417,7 @@ static class BuilderFieldData { bfd.rawName = raw.name; bfd.annotations = findCopyableAnnotations(param); bfd.type = raw.vartype; - bfd.singularData = getSingularData(param, annInstance.setterPrefix()); + bfd.singularData = getSingularData(param, getBuilderSetterPrefix(annotationNode, annInstance.setterPrefix())); bfd.originalFieldNode = param; addObtainVia(bfd, param); job.builderFields.add(bfd); @@ -484,7 +484,7 @@ static class BuilderFieldData { } for (BuilderFieldData bfd : job.builderFields) { - makePrefixedSetterMethodsForBuilder(job, bfd, annInstance.setterPrefix()); + makePrefixedSetterMethodsForBuilder(job, bfd, getBuilderSetterPrefix(annotationNode, annInstance.setterPrefix())); } { @@ -535,7 +535,7 @@ static class BuilderFieldData { } tps = lb.toList(); } - JCMethodDecl md = generateToBuilderMethod(job, tps, annInstance.setterPrefix()); + JCMethodDecl md = generateToBuilderMethod(job, tps, getBuilderSetterPrefix(annotationNode, annInstance.setterPrefix())); if (md != null) { recursiveSetGeneratedBy(md, annotationNode); injectMethod(job.parentType, md); diff --git a/test/transform/resource/after-delombok/BuilderSimpleWithSetterPrefixConfiguration.java b/test/transform/resource/after-delombok/BuilderSimpleWithSetterPrefixConfiguration.java new file mode 100644 index 0000000000..3038fe3949 --- /dev/null +++ b/test/transform/resource/after-delombok/BuilderSimpleWithSetterPrefixConfiguration.java @@ -0,0 +1,37 @@ +import java.util.List; +class BuilderSimpleWithSetterPrefix { + private int unprefixed; + @java.lang.SuppressWarnings("all") + BuilderSimpleWithSetterPrefix(final int unprefixed) { + this.unprefixed = unprefixed; + } + @java.lang.SuppressWarnings("all") + protected static class BuilderSimpleWithSetterPrefixBuilder { + @java.lang.SuppressWarnings("all") + private int unprefixed; + @java.lang.SuppressWarnings("all") + BuilderSimpleWithSetterPrefixBuilder() { + } + /** + * @return {@code this}. + */ + @java.lang.SuppressWarnings("all") + public BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder withUnprefixed(final int unprefixed) { + this.unprefixed = unprefixed; + return this; + } + @java.lang.SuppressWarnings("all") + public BuilderSimpleWithSetterPrefix build() { + return new BuilderSimpleWithSetterPrefix(this.unprefixed); + } + @java.lang.Override + @java.lang.SuppressWarnings("all") + public java.lang.String toString() { + return "BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder(unprefixed=" + this.unprefixed + ")"; + } + } + @java.lang.SuppressWarnings("all") + protected static BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder builder() { + return new BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder(); + } +} diff --git a/test/transform/resource/after-ecj/BuilderSimpleWithSetterPrefixConfiguration.java b/test/transform/resource/after-ecj/BuilderSimpleWithSetterPrefixConfiguration.java new file mode 100644 index 0000000000..2956b7b514 --- /dev/null +++ b/test/transform/resource/after-ecj/BuilderSimpleWithSetterPrefixConfiguration.java @@ -0,0 +1,30 @@ +import java.util.List; +@lombok.Builder(access = lombok.AccessLevel.PROTECTED) class BuilderSimpleWithSetterPrefix { + protected static @java.lang.SuppressWarnings("all") class BuilderSimpleWithSetterPrefixBuilder { + private @java.lang.SuppressWarnings("all") int unprefixed; + @java.lang.SuppressWarnings("all") BuilderSimpleWithSetterPrefixBuilder() { + super(); + } + /** + * @return {@code this}. + */ + public @java.lang.SuppressWarnings("all") BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder withUnprefixed(final int unprefixed) { + this.unprefixed = unprefixed; + return this; + } + public @java.lang.SuppressWarnings("all") BuilderSimpleWithSetterPrefix build() { + return new BuilderSimpleWithSetterPrefix(this.unprefixed); + } + public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() { + return (("BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder(unprefixed=" + this.unprefixed) + ")"); + } + } + private int unprefixed; + @java.lang.SuppressWarnings("all") BuilderSimpleWithSetterPrefix(final int unprefixed) { + super(); + this.unprefixed = unprefixed; + } + protected static @java.lang.SuppressWarnings("all") BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder builder() { + return new BuilderSimpleWithSetterPrefix.BuilderSimpleWithSetterPrefixBuilder(); + } +} diff --git a/test/transform/resource/before/BuilderSimpleWithSetterPrefixConfiguration.java b/test/transform/resource/before/BuilderSimpleWithSetterPrefixConfiguration.java new file mode 100644 index 0000000000..76ab3fd15f --- /dev/null +++ b/test/transform/resource/before/BuilderSimpleWithSetterPrefixConfiguration.java @@ -0,0 +1,8 @@ +//CONF: lombok.builder.setterPrefix = with + +import java.util.List; + +@lombok.Builder(access = lombok.AccessLevel.PROTECTED) +class BuilderSimpleWithSetterPrefix { + private int unprefixed; +} diff --git a/website/templates/features/Builder.html b/website/templates/features/Builder.html index 1b6c6e62ef..68c84a1291 100644 --- a/website/templates/features/Builder.html +++ b/website/templates/features/Builder.html @@ -171,6 +171,10 @@

With Jackson

lombok.builder.className = [a java identifier with an optional star to indicate where the return type name goes] (default: *Builder)
Unless you explicitly pick the builder's class name with the builderClassName parameter, this name is chosen; any star in the name is replaced with the relevant return type. +
+ lombok.builder.setterPrefix = [the prefix to prepend to generated @Builder setter method names] (default: not set) +
+ Unless you explicitly pick the builder's setter prefix with the setterPrefix parameter, this prefix is chosen.
lombok.builder.flagUsage = [warning | error] (default: not set)