mirror of
https://github.com/tiennm99/lombok.git
synced 2026-10-15 04:18:44 +00:00
Fix builder class name annotation collision
This commit is contained in:
1 parent
6c5295bc38
commit
ecf421849c
16 files changed
+249
-17
No files matched your search
@@ -114,14 +114,25 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
static final char[] BUILDER_TEMP_VAR = {'b', 'u', 'i', 'l', 'd', 'e', 'r'};
|
||||
static final AbstractMethodDeclaration[] EMPTY_METHODS = {};
|
||||
static final String TO_BUILDER_NOT_SUPPORTED = "@Builder(toBuilder=true) is only supported if you return your own type.";
|
||||
|
||||
static final String BUILDER_CLASS_NAME_ANNOTATION_CONFLICT = "builderClassName cannot be \"%s\" when using @%s; use @%s or choose another builder class name.";
|
||||
|
||||
private static final boolean toBoolean(Object expr, boolean defaultValue) {
|
||||
if (expr == null) return defaultValue;
|
||||
if (expr instanceof FalseLiteral) return false;
|
||||
if (expr instanceof TrueLiteral) return true;
|
||||
return ((Boolean) expr).booleanValue();
|
||||
}
|
||||
|
||||
|
||||
static boolean checkBuilderClassNameAnnotationConflict(String annotationName, String qualifiedAnnotationName, String builderClassName, Annotation ast, EclipseNode annotationNode) {
|
||||
char[][] typeName = ast.type == null ? null : ast.type.getTypeName();
|
||||
if (annotationName.equals(builderClassName) && (typeName == null || typeName.length == 1)) {
|
||||
annotationNode.addError(String.format(BUILDER_CLASS_NAME_ANNOTATION_CONFLICT, builderClassName, annotationName, qualifiedAnnotationName));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static class BuilderJob {
|
||||
CheckerFrameworkVersion checkerFramework;
|
||||
EclipseNode parentType;
|
||||
@@ -308,6 +319,9 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
|
||||
job.parentType = parent;
|
||||
TypeDeclaration td = (TypeDeclaration) parent.get();
|
||||
job.setBuilderClassName(job.replaceBuilderClassName(td.name));
|
||||
if (!checkName("builderClassName", job.builderClassName, annotationNode)) return;
|
||||
if (!checkBuilderClassNameAnnotationConflict("Builder", "lombok.Builder", job.builderClassName, ast, annotationNode)) return;
|
||||
|
||||
List<EclipseNode> allFields = new ArrayList<EclipseNode>();
|
||||
boolean valuePresent = (hasAnnotation(lombok.Value.class, parent) || hasAnnotation("lombok.experimental.Value", parent));
|
||||
@@ -365,8 +379,6 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
buildMethodReturnType = job.createBuilderParentTypeReference();
|
||||
buildMethodThrownExceptions = null;
|
||||
nameOfBuilderMethod = null;
|
||||
job.setBuilderClassName(job.replaceBuilderClassName(td.name));
|
||||
if (!checkName("builderClassName", job.builderClassName, annotationNode)) return;
|
||||
} else if (parent.get() instanceof ConstructorDeclaration) {
|
||||
job.checkReturnValue = true;
|
||||
ConstructorDeclaration cd = (ConstructorDeclaration) parent.get();
|
||||
@@ -477,7 +489,10 @@ public class HandleBuilder extends EclipseAnnotationHandler<Builder> {
|
||||
annotationNode.addError(BUILDER_NODE_NOT_SUPPORTED_ERR);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (!checkName("builderClassName", job.builderClassName, annotationNode)) return;
|
||||
if (!checkBuilderClassNameAnnotationConflict("Builder", "lombok.Builder", job.builderClassName, ast, annotationNode)) return;
|
||||
|
||||
if (fillParametersFrom != null) {
|
||||
for (EclipseNode param : fillParametersFrom.down()) {
|
||||
if (param.getKind() != Kind.ARGUMENT) continue;
|
||||
|
||||
@@ -187,6 +187,12 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
|
||||
job.parentType = parent;
|
||||
TypeDeclaration td = (TypeDeclaration) parent.get();
|
||||
job.builderAbstractClassName = job.builderClassName = job.replaceBuilderClassName(td.name);
|
||||
job.builderAbstractClassNameArr = job.builderClassNameArr = job.builderAbstractClassName.toCharArray();
|
||||
job.builderImplClassName = job.builderAbstractClassName + "Impl";
|
||||
job.builderImplClassNameArr = job.builderImplClassName.toCharArray();
|
||||
if (!checkName("builderClassName", job.builderClassName, annotationNode)) return;
|
||||
if (!checkBuilderClassNameAnnotationConflict("SuperBuilder", "lombok.SuperBuilder", job.builderClassName, ast, annotationNode)) return;
|
||||
|
||||
// Gather all fields of the class that should be set by the builder.
|
||||
List<EclipseNode> allFields = new ArrayList<EclipseNode>();
|
||||
@@ -309,11 +315,6 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler<SuperBuilder> {
|
||||
|
||||
superclassBuilderClass = new ParameterizedQualifiedTypeReference(tokens, typeArgsForTokens, 0, poss);
|
||||
}
|
||||
job.builderAbstractClassName = job.builderClassName = job.replaceBuilderClassName(td.name);
|
||||
job.builderAbstractClassNameArr = job.builderClassNameArr = job.builderAbstractClassName.toCharArray();
|
||||
job.builderImplClassName = job.builderAbstractClassName + "Impl";
|
||||
job.builderImplClassNameArr = job.builderImplClassName.toCharArray();
|
||||
|
||||
// If there is no superclass, superclassBuilderClassExpression is still == null at this point.
|
||||
// You can use it to check whether to inherit or not.
|
||||
|
||||
|
||||
@@ -96,13 +96,23 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
static final String VALUE_PREFIX = "$value";
|
||||
static final String BUILDER_TEMP_VAR = "builder";
|
||||
static final String TO_BUILDER_NOT_SUPPORTED = "@Builder(toBuilder=true) is only supported if you return your own type.";
|
||||
|
||||
static final String BUILDER_CLASS_NAME_ANNOTATION_CONFLICT = "builderClassName cannot be \"%s\" when using @%s; use @%s or choose another builder class name.";
|
||||
|
||||
private static final boolean toBoolean(Object expr, boolean defaultValue) {
|
||||
if (expr == null) return defaultValue;
|
||||
if (expr instanceof JCLiteral) return ((Integer) ((JCLiteral) expr).value) != 0;
|
||||
return ((Boolean) expr).booleanValue();
|
||||
}
|
||||
|
||||
|
||||
static boolean checkBuilderClassNameAnnotationConflict(String annotationName, String qualifiedAnnotationName, String builderClassName, JCAnnotation ast, JavacNode annotationNode) {
|
||||
if (annotationName.equals(builderClassName) && !(ast.annotationType instanceof JCFieldAccess)) {
|
||||
annotationNode.addError(String.format(BUILDER_CLASS_NAME_ANNOTATION_CONFLICT, builderClassName, annotationName, qualifiedAnnotationName));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static class BuilderJob {
|
||||
CheckerFrameworkVersion checkerFramework;
|
||||
JavacNode parentType;
|
||||
@@ -251,6 +261,9 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
job.parentType = parent;
|
||||
job.checkReturnValue = true;
|
||||
JCClassDecl td = (JCClassDecl) parent.get();
|
||||
job.builderClassName = job.replaceBuilderClassName(td.name);
|
||||
if (!checkName("builderClassName", job.builderClassName, annotationNode)) return;
|
||||
if (!checkBuilderClassNameAnnotationConflict("Builder", "lombok.Builder", job.builderClassName, ast, annotationNode)) return;
|
||||
|
||||
ListBuffer<JavacNode> allFields = new ListBuffer<JavacNode>();
|
||||
boolean valuePresent = (hasAnnotation(lombok.Value.class, parent) || hasAnnotation("lombok.experimental.Value", parent));
|
||||
@@ -308,8 +321,6 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
job.typeParams = job.builderTypeParams = td.typarams;
|
||||
buildMethodThrownExceptions = List.nil();
|
||||
nameOfBuilderMethod = null;
|
||||
job.builderClassName = job.replaceBuilderClassName(td.name);
|
||||
if (!checkName("builderClassName", job.builderClassName, annotationNode)) return;
|
||||
} else if (fillParametersFrom != null && fillParametersFrom.getName().toString().equals("<init>")) {
|
||||
JCMethodDecl jmd = (JCMethodDecl) fillParametersFrom.get();
|
||||
if (!jmd.typarams.isEmpty()) {
|
||||
@@ -419,7 +430,10 @@ public class HandleBuilder extends JavacAnnotationHandler<Builder> {
|
||||
annotationNode.addError(BUILDER_NODE_NOT_SUPPORTED_ERR);
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (!checkName("builderClassName", job.builderClassName, annotationNode)) return;
|
||||
if (!checkBuilderClassNameAnnotationConflict("Builder", "lombok.Builder", job.builderClassName, ast, annotationNode)) return;
|
||||
|
||||
if (fillParametersFrom != null) {
|
||||
for (JavacNode param : fillParametersFrom.down()) {
|
||||
if (param.getKind() != Kind.ARGUMENT) continue;
|
||||
|
||||
@@ -169,6 +169,9 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
|
||||
job.parentType = parent;
|
||||
JCClassDecl td = (JCClassDecl) parent.get();
|
||||
job.builderClassName = job.replaceBuilderClassName(td.name);
|
||||
if (!checkName("builderClassName", job.builderClassName, annotationNode)) return;
|
||||
if (!checkBuilderClassNameAnnotationConflict("SuperBuilder", "lombok.SuperBuilder", job.builderClassName, ast, annotationNode)) return;
|
||||
|
||||
// Gather all fields of the class that should be set by the builder.
|
||||
ArrayList<JavacNode> nonFinalNonDefaultedFields = null;
|
||||
@@ -217,8 +220,6 @@ public class HandleSuperBuilder extends JavacAnnotationHandler<SuperBuilder> {
|
||||
}
|
||||
|
||||
job.typeParams = job.builderTypeParams = td.typarams;
|
||||
job.builderClassName = job.replaceBuilderClassName(td.name);
|
||||
if (!checkName("builderClassName", job.builderClassName, annotationNode)) return;
|
||||
|
||||
// <C, B> are the generics for our builder.
|
||||
String classGenericName = "C";
|
||||
|
||||
@@ -0,0 +1,44 @@
|
||||
class BuilderClassNameCollisionQualified<T> {
|
||||
private java.util.function.Function<T, String> mapper;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
BuilderClassNameCollisionQualified(final java.util.function.Function<T, String> mapper) {
|
||||
this.mapper = mapper;
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
public static class Builder<T> {
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
private java.util.function.Function<T, String> mapper;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
Builder() {
|
||||
}
|
||||
/**
|
||||
* @return {@code this}.
|
||||
*/
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
public BuilderClassNameCollisionQualified.Builder<T> mapper(final java.util.function.Function<T, String> mapper) {
|
||||
this.mapper = mapper;
|
||||
return this;
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
public BuilderClassNameCollisionQualified<T> build() {
|
||||
return new BuilderClassNameCollisionQualified<T>(this.mapper);
|
||||
}
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
public java.lang.String toString() {
|
||||
return "BuilderClassNameCollisionQualified.Builder(mapper=" + this.mapper + ")";
|
||||
}
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
public static <T> BuilderClassNameCollisionQualified.Builder<T> builder() {
|
||||
return new BuilderClassNameCollisionQualified.Builder<T>();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
class SuperBuilderClassNameCollisionQualified<T> {
|
||||
T value;
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
public static abstract class SuperBuilder<T, C extends SuperBuilderClassNameCollisionQualified<T>, B extends SuperBuilderClassNameCollisionQualified.SuperBuilder<T, C, B>> {
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
private T value;
|
||||
/**
|
||||
* @return {@code this}.
|
||||
*/
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
public B value(final T value) {
|
||||
this.value = value;
|
||||
return self();
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
protected abstract B self();
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
public abstract C build();
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
public java.lang.String toString() {
|
||||
return "SuperBuilderClassNameCollisionQualified.SuperBuilder(value=" + this.value + ")";
|
||||
}
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
private static final class SuperBuilderImpl<T> extends SuperBuilderClassNameCollisionQualified.SuperBuilder<T, SuperBuilderClassNameCollisionQualified<T>, SuperBuilderClassNameCollisionQualified.SuperBuilderImpl<T>> {
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
private SuperBuilderImpl() {
|
||||
}
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
protected SuperBuilderClassNameCollisionQualified.SuperBuilderImpl<T> self() {
|
||||
return this;
|
||||
}
|
||||
@java.lang.Override
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
public SuperBuilderClassNameCollisionQualified<T> build() {
|
||||
return new SuperBuilderClassNameCollisionQualified<T>(this);
|
||||
}
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
protected SuperBuilderClassNameCollisionQualified(final SuperBuilderClassNameCollisionQualified.SuperBuilder<T, ?, ?> b) {
|
||||
this.value = b.value;
|
||||
}
|
||||
@java.lang.SuppressWarnings("all")
|
||||
@lombok.Generated
|
||||
public static <T> SuperBuilderClassNameCollisionQualified.SuperBuilder<T, ?, ?> builder() {
|
||||
return new SuperBuilderClassNameCollisionQualified.SuperBuilderImpl<T>();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
@lombok.Builder(builderClassName = "Builder") class BuilderClassNameCollisionQualified<T> {
|
||||
public static @java.lang.SuppressWarnings("all") @lombok.Generated class Builder<T> {
|
||||
private @java.lang.SuppressWarnings("all") @lombok.Generated java.util.function.Function<T, String> mapper;
|
||||
@java.lang.SuppressWarnings("all") @lombok.Generated Builder() {
|
||||
super();
|
||||
}
|
||||
/**
|
||||
* @return {@code this}.
|
||||
*/
|
||||
public @java.lang.SuppressWarnings("all") @lombok.Generated BuilderClassNameCollisionQualified.Builder<T> mapper(final java.util.function.Function<T, String> mapper) {
|
||||
this.mapper = mapper;
|
||||
return this;
|
||||
}
|
||||
public @java.lang.SuppressWarnings("all") @lombok.Generated BuilderClassNameCollisionQualified<T> build() {
|
||||
return new BuilderClassNameCollisionQualified<T>(this.mapper);
|
||||
}
|
||||
public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated java.lang.String toString() {
|
||||
return (("BuilderClassNameCollisionQualified.Builder(mapper=" + this.mapper) + ")");
|
||||
}
|
||||
}
|
||||
private java.util.function.Function<T, String> mapper;
|
||||
@java.lang.SuppressWarnings("all") @lombok.Generated BuilderClassNameCollisionQualified(final java.util.function.Function<T, String> mapper) {
|
||||
super();
|
||||
this.mapper = mapper;
|
||||
}
|
||||
public static @java.lang.SuppressWarnings("all") @lombok.Generated <T>BuilderClassNameCollisionQualified.Builder<T> builder() {
|
||||
return new BuilderClassNameCollisionQualified.Builder<T>();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
@lombok.SuperBuilder class SuperBuilderClassNameCollisionQualified<T> {
|
||||
public static abstract @java.lang.SuppressWarnings("all") @lombok.Generated class SuperBuilder<T, C extends SuperBuilderClassNameCollisionQualified<T>, B extends SuperBuilderClassNameCollisionQualified.SuperBuilder<T, C, B>> {
|
||||
private @java.lang.SuppressWarnings("all") @lombok.Generated T value;
|
||||
public SuperBuilder() {
|
||||
super();
|
||||
}
|
||||
/**
|
||||
* @return {@code this}.
|
||||
*/
|
||||
public @java.lang.SuppressWarnings("all") @lombok.Generated B value(final T value) {
|
||||
this.value = value;
|
||||
return self();
|
||||
}
|
||||
protected abstract @java.lang.SuppressWarnings("all") @lombok.Generated B self();
|
||||
public abstract @java.lang.SuppressWarnings("all") @lombok.Generated C build();
|
||||
public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated java.lang.String toString() {
|
||||
return (("SuperBuilderClassNameCollisionQualified.SuperBuilder(value=" + this.value) + ")");
|
||||
}
|
||||
}
|
||||
private static final @java.lang.SuppressWarnings("all") @lombok.Generated class SuperBuilderImpl<T> extends SuperBuilderClassNameCollisionQualified.SuperBuilder<T, SuperBuilderClassNameCollisionQualified<T>, SuperBuilderClassNameCollisionQualified.SuperBuilderImpl<T>> {
|
||||
private SuperBuilderImpl() {
|
||||
super();
|
||||
}
|
||||
protected @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderClassNameCollisionQualified.SuperBuilderImpl<T> self() {
|
||||
return this;
|
||||
}
|
||||
public @java.lang.Override @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderClassNameCollisionQualified<T> build() {
|
||||
return new SuperBuilderClassNameCollisionQualified<T>(this);
|
||||
}
|
||||
}
|
||||
T value;
|
||||
protected @java.lang.SuppressWarnings("all") @lombok.Generated SuperBuilderClassNameCollisionQualified(final SuperBuilderClassNameCollisionQualified.SuperBuilder<T, ?, ?> b) {
|
||||
super();
|
||||
this.value = b.value;
|
||||
}
|
||||
public static @java.lang.SuppressWarnings("all") @lombok.Generated <T>SuperBuilderClassNameCollisionQualified.SuperBuilder<T, ?, ?> builder() {
|
||||
return new SuperBuilderClassNameCollisionQualified.SuperBuilderImpl<T>();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
//skip compare content
|
||||
import lombok.Builder;
|
||||
|
||||
@Builder(builderClassName = "Builder")
|
||||
class BuilderClassNameCollision<T> {
|
||||
T value;
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
@lombok.Builder(builderClassName = "Builder")
|
||||
class BuilderClassNameCollisionQualified<T> {
|
||||
private java.util.function.Function<T, String> mapper;
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
//skip compare content
|
||||
//CONF: lombok.builder.className = SuperBuilder
|
||||
import lombok.SuperBuilder;
|
||||
|
||||
@SuperBuilder
|
||||
class SuperBuilderClassNameCollision {
|
||||
int value;
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
//CONF: lombok.builder.className = SuperBuilder
|
||||
@lombok.SuperBuilder
|
||||
class SuperBuilderClassNameCollisionQualified<T> {
|
||||
T value;
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
4 builderClassName cannot be "Builder" when using @Builder; use @lombok.Builder or choose another builder class name.
|
||||
@@ -0,0 +1 @@
|
||||
5 builderClassName cannot be "SuperBuilder" when using @SuperBuilder; use @lombok.SuperBuilder or choose another builder class name.
|
||||
@@ -0,0 +1 @@
|
||||
4 builderClassName cannot be "Builder" when using @Builder; use @lombok.Builder or choose another builder class name.
|
||||
@@ -0,0 +1 @@
|
||||
5 builderClassName cannot be "SuperBuilder" when using @SuperBuilder; use @lombok.SuperBuilder or choose another builder class name.
|
||||
Reference in new issue
Block a user