diff --git a/AUTHORS b/AUTHORS index 9281c9a9b1..2177c77dfb 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 05550a06b0..9ac9a4621a 100644 --- a/src/core/lombok/ConfigurationKeys.java +++ b/src/core/lombok/ConfigurationKeys.java @@ -300,6 +300,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 c00b5dca5b..c661d94f86 100644 --- a/src/core/lombok/core/handlers/HandlerUtil.java +++ b/src/core/lombok/core/handlers/HandlerUtil.java @@ -863,4 +863,15 @@ public static String getParamJavadoc(String methodComment, String param) { } return null; } + + public static String getBuilderSetterPrefix(LombokNode node, String setterPrefix) { + if (setterPrefix != null && !setterPrefix.isEmpty()) { + 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 2bfe1e8b96..1214b282e5 100755 --- a/src/core/lombok/eclipse/handlers/HandleBuilder.java +++ b/src/core/lombok/eclipse/handlers/HandleBuilder.java @@ -320,7 +320,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) { @@ -483,7 +483,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); @@ -552,7 +552,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())); } { @@ -599,7 +599,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 d8fdfb1bff..f2fce84fcf 100644 --- a/src/core/lombok/javac/handlers/HandleBuilder.java +++ b/src/core/lombok/javac/handlers/HandleBuilder.java @@ -261,7 +261,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) { @@ -422,7 +422,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); @@ -489,7 +489,7 @@ static class BuilderFieldData { } for (BuilderFieldData bfd : job.builderFields) { - makePrefixedSetterMethodsForBuilder(job, bfd, annInstance.setterPrefix()); + makePrefixedSetterMethodsForBuilder(job, bfd, getBuilderSetterPrefix(annotationNode, annInstance.setterPrefix())); } { @@ -540,7 +540,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 1461161fb2..c273f7af94 100644 --- a/website/templates/features/Builder.html +++ b/website/templates/features/Builder.html @@ -187,6 +187,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)