Skip to content

Commit

Permalink
Merge pull request #2687 from janrieke/superBuilderConfigBuilderClass…
Browse files Browse the repository at this point in the history
…Name

SuperBuilder: consider lombok.builder.className for builder extends clause
  • Loading branch information
rzwitserloot committed Mar 24, 2021
2 parents 52a31bc + a6257f2 commit 30a2921
Show file tree
Hide file tree
Showing 7 changed files with 180 additions and 17 deletions.
12 changes: 8 additions & 4 deletions src/core/lombok/eclipse/handlers/HandleBuilder.java
Expand Up @@ -183,14 +183,14 @@ void init(AnnotationValues<Builder> annValues, Builder ann, EclipseNode node) {

builderMethodName = ann.builderMethodName();
buildMethodName = ann.buildMethodName();
setBuilderClassName(fixBuilderClassName(node, ann.builderClassName()));
setBuilderClassName(getBuilderClassNameTemplate(node, ann.builderClassName()));
toBuilder = ann.toBuilder();

if (builderMethodName == null) builderMethodName = "builder";
if (buildMethodName == null) buildMethodName = "build";
}

static String fixBuilderClassName(EclipseNode node, String override) {
static String getBuilderClassNameTemplate(EclipseNode node, String override) {
if (override != null && !override.isEmpty()) return override;
override = node.getAst().readConfiguration(ConfigurationKeys.BUILDER_CLASS_NAME);
if (override != null && !override.isEmpty()) return override;
Expand All @@ -202,8 +202,12 @@ MethodDeclaration createNewMethodDeclaration() {
}

String replaceBuilderClassName(char[] name) {
if (builderClassName.indexOf('*') == -1) return builderClassName;
return builderClassName.replace("*", new String(name));
return replaceBuilderClassName(name, builderClassName);
}

String replaceBuilderClassName(char[] name, String template) {
if (template.indexOf('*') == -1) return template;
return template.replace("*", new String(name));
}

String replaceBuilderClassName(String name) {
Expand Down
14 changes: 8 additions & 6 deletions src/core/lombok/eclipse/handlers/HandleSuperBuilder.java
Expand Up @@ -124,7 +124,7 @@ void init(AnnotationValues<SuperBuilder> annValues, SuperBuilder ann, EclipseNod

if (builderMethodName == null) builderMethodName = "builder";
if (buildMethodName == null) buildMethodName = "build";
builderClassName = fixBuilderClassName(node, "");
builderClassName = getBuilderClassNameTemplate(node, null);
}

EclipseNode builderAbstractType;
Expand Down Expand Up @@ -274,8 +274,9 @@ void setBuilderToAbstract() {
};
if (extendsClause instanceof QualifiedTypeReference) {
QualifiedTypeReference qualifiedTypeReference = (QualifiedTypeReference)extendsClause;
String superclassClassName = String.valueOf(qualifiedTypeReference.getLastToken());
String superclassBuilderClassName = job.replaceBuilderClassName(superclassClassName);
char[] superclassClassName = qualifiedTypeReference.getLastToken();
String builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null);
String superclassBuilderClassName = job.replaceBuilderClassName(superclassClassName, builderClassNameTemplate);

char[][] tokens = Arrays.copyOf(qualifiedTypeReference.tokens, qualifiedTypeReference.tokens.length + 1);
tokens[tokens.length-1] = superclassBuilderClassName.toCharArray();
Expand All @@ -291,10 +292,11 @@ void setBuilderToAbstract() {

superclassBuilderClass = new ParameterizedQualifiedTypeReference(tokens, typeArgsForTokens, 0, poss);
} else if (extendsClause != null) {
String superClass = String.valueOf(extendsClause.getTypeName()[0]);
String superclassBuilderClassName = superClass + "Builder";
char[] superclassClassName = extendsClause.getTypeName()[0];
String builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null);
String superclassBuilderClassName = job.replaceBuilderClassName(superclassClassName, builderClassNameTemplate);

char[][] tokens = new char[][] {superClass.toCharArray(), superclassBuilderClassName.toCharArray()};
char[][] tokens = new char[][] {superclassClassName, superclassBuilderClassName.toCharArray()};
long[] poss = new long[tokens.length];
Arrays.fill(poss, job.getPos());

Expand Down
12 changes: 8 additions & 4 deletions src/core/lombok/javac/handlers/HandleBuilder.java
Expand Up @@ -130,24 +130,28 @@ void init(AnnotationValues<Builder> annValues, Builder ann, JavacNode node) {

builderMethodName = ann.builderMethodName();
buildMethodName = ann.buildMethodName();
builderClassName = fixBuilderClassName(node, ann.builderClassName());
builderClassName = getBuilderClassNameTemplate(node, ann.builderClassName());
toBuilder = ann.toBuilder();

if (builderMethodName == null) builderMethodName = "builder";
if (buildMethodName == null) buildMethodName = "build";
if (builderClassName == null) builderClassName = "";
}

static String fixBuilderClassName(JavacNode node, String override) {
static String getBuilderClassNameTemplate(JavacNode node, String override) {
if (override != null && !override.isEmpty()) return override;
override = node.getAst().readConfiguration(ConfigurationKeys.BUILDER_CLASS_NAME);
if (override != null && !override.isEmpty()) return override;
return "*Builder";
}

String replaceBuilderClassName(Name name) {
if (builderClassName.indexOf('*') == -1) return builderClassName;
return builderClassName.replace("*", name.toString());
return replaceBuilderClassName(name.toString(), builderClassName);
}

String replaceBuilderClassName(String name, String template) {
if (template.indexOf('*') == -1) return template;
return template.replace("*", name);
}

JCExpression createBuilderParentTypeReference() {
Expand Down
8 changes: 5 additions & 3 deletions src/core/lombok/javac/handlers/HandleSuperBuilder.java
Expand Up @@ -111,7 +111,7 @@ void init(AnnotationValues<SuperBuilder> annValues, SuperBuilder ann, JavacNode

if (builderMethodName == null) builderMethodName = "builder";
if (buildMethodName == null) buildMethodName = "build";
builderClassName = fixBuilderClassName(node, "");
builderClassName = getBuilderClassNameTemplate(node, null);
}

void setBuilderToImpl() {
Expand Down Expand Up @@ -253,10 +253,12 @@ public void handle(AnnotationValues<SuperBuilder> annotation, JCAnnotation ast,
}
if (extendsClause instanceof JCFieldAccess) {
Name superclassName = ((JCFieldAccess) extendsClause).getIdentifier();
String superclassBuilderClassName = superclassName.toString() + "Builder";
String builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null);
String superclassBuilderClassName = job.replaceBuilderClassName(superclassName.toString(), builderClassNameTemplate);
superclassBuilderClass = parent.getTreeMaker().Select((JCFieldAccess) extendsClause, parent.toName(superclassBuilderClassName));
} else if (extendsClause != null) {
String superclassBuilderClassName = extendsClause.toString() + "Builder";
String builderClassNameTemplate = BuilderJob.getBuilderClassNameTemplate(annotationNode, null);
String superclassBuilderClassName = job.replaceBuilderClassName(extendsClause.toString(), builderClassNameTemplate);
superclassBuilderClass = chainDots(parent, extendsClause.toString(), superclassBuilderClassName);
}

Expand Down
@@ -0,0 +1,79 @@
class SuperBuilderWithCustomBuilderClassName {
static class SuperClass {
@java.lang.SuppressWarnings("all")
public static abstract class Builder<C extends SuperBuilderWithCustomBuilderClassName.SuperClass, B extends SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<C, B>> {
@java.lang.SuppressWarnings("all")
protected abstract B self();
@java.lang.SuppressWarnings("all")
public abstract C build();
@java.lang.Override
@java.lang.SuppressWarnings("all")
public java.lang.String toString() {
return "SuperBuilderWithCustomBuilderClassName.SuperClass.Builder()";
}
}
@java.lang.SuppressWarnings("all")
private static final class BuilderImpl extends SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<SuperBuilderWithCustomBuilderClassName.SuperClass, SuperBuilderWithCustomBuilderClassName.SuperClass.BuilderImpl> {
@java.lang.SuppressWarnings("all")
private BuilderImpl() {
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
protected SuperBuilderWithCustomBuilderClassName.SuperClass.BuilderImpl self() {
return this;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
public SuperBuilderWithCustomBuilderClassName.SuperClass build() {
return new SuperBuilderWithCustomBuilderClassName.SuperClass(this);
}
}
@java.lang.SuppressWarnings("all")
protected SuperClass(final SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<?, ?> b) {
}
@java.lang.SuppressWarnings("all")
public static SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<?, ?> builder() {
return new SuperBuilderWithCustomBuilderClassName.SuperClass.BuilderImpl();
}
}
static class SubClass extends SuperClass {
@java.lang.SuppressWarnings("all")
public static abstract class Builder<C extends SuperBuilderWithCustomBuilderClassName.SubClass, B extends SuperBuilderWithCustomBuilderClassName.SubClass.Builder<C, B>> extends SuperClass.Builder<C, B> {
@java.lang.Override
@java.lang.SuppressWarnings("all")
protected abstract B self();
@java.lang.Override
@java.lang.SuppressWarnings("all")
public abstract C build();
@java.lang.Override
@java.lang.SuppressWarnings("all")
public java.lang.String toString() {
return "SuperBuilderWithCustomBuilderClassName.SubClass.Builder(super=" + super.toString() + ")";
}
}
@java.lang.SuppressWarnings("all")
private static final class BuilderImpl extends SuperBuilderWithCustomBuilderClassName.SubClass.Builder<SuperBuilderWithCustomBuilderClassName.SubClass, SuperBuilderWithCustomBuilderClassName.SubClass.BuilderImpl> {
@java.lang.SuppressWarnings("all")
private BuilderImpl() {
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
protected SuperBuilderWithCustomBuilderClassName.SubClass.BuilderImpl self() {
return this;
}
@java.lang.Override
@java.lang.SuppressWarnings("all")
public SuperBuilderWithCustomBuilderClassName.SubClass build() {
return new SuperBuilderWithCustomBuilderClassName.SubClass(this);
}
}
@java.lang.SuppressWarnings("all")
protected SubClass(final SuperBuilderWithCustomBuilderClassName.SubClass.Builder<?, ?> b) {
super(b);
}
@java.lang.SuppressWarnings("all")
public static SuperBuilderWithCustomBuilderClassName.SubClass.Builder<?, ?> builder() {
return new SuperBuilderWithCustomBuilderClassName.SubClass.BuilderImpl();
}
}
}
@@ -0,0 +1,63 @@
class SuperBuilderWithCustomBuilderClassName {
static @lombok.experimental.SuperBuilder class SuperClass {
public static abstract @java.lang.SuppressWarnings("all") class Builder<C extends SuperBuilderWithCustomBuilderClassName.SuperClass, B extends SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<C, B>> {
public Builder() {
super();
}
protected abstract @java.lang.SuppressWarnings("all") B self();
public abstract @java.lang.SuppressWarnings("all") C build();
public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() {
return "SuperBuilderWithCustomBuilderClassName.SuperClass.Builder()";
}
}
private static final @java.lang.SuppressWarnings("all") class BuilderImpl extends SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<SuperBuilderWithCustomBuilderClassName.SuperClass, SuperBuilderWithCustomBuilderClassName.SuperClass.BuilderImpl> {
private BuilderImpl() {
super();
}
protected @java.lang.Override @java.lang.SuppressWarnings("all") SuperBuilderWithCustomBuilderClassName.SuperClass.BuilderImpl self() {
return this;
}
public @java.lang.Override @java.lang.SuppressWarnings("all") SuperBuilderWithCustomBuilderClassName.SuperClass build() {
return new SuperBuilderWithCustomBuilderClassName.SuperClass(this);
}
}
protected @java.lang.SuppressWarnings("all") SuperClass(final SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<?, ?> b) {
super();
}
public static @java.lang.SuppressWarnings("all") SuperBuilderWithCustomBuilderClassName.SuperClass.Builder<?, ?> builder() {
return new SuperBuilderWithCustomBuilderClassName.SuperClass.BuilderImpl();
}
}
static @lombok.experimental.SuperBuilder class SubClass extends SuperClass {
public static abstract @java.lang.SuppressWarnings("all") class Builder<C extends SuperBuilderWithCustomBuilderClassName.SubClass, B extends SuperBuilderWithCustomBuilderClassName.SubClass.Builder<C, B>> extends SuperClass.Builder<C, B> {
public Builder() {
super();
}
protected abstract @java.lang.Override @java.lang.SuppressWarnings("all") B self();
public abstract @java.lang.Override @java.lang.SuppressWarnings("all") C build();
public @java.lang.Override @java.lang.SuppressWarnings("all") java.lang.String toString() {
return (("SuperBuilderWithCustomBuilderClassName.SubClass.Builder(super=" + super.toString()) + ")");
}
}
private static final @java.lang.SuppressWarnings("all") class BuilderImpl extends SuperBuilderWithCustomBuilderClassName.SubClass.Builder<SuperBuilderWithCustomBuilderClassName.SubClass, SuperBuilderWithCustomBuilderClassName.SubClass.BuilderImpl> {
private BuilderImpl() {
super();
}
protected @java.lang.Override @java.lang.SuppressWarnings("all") SuperBuilderWithCustomBuilderClassName.SubClass.BuilderImpl self() {
return this;
}
public @java.lang.Override @java.lang.SuppressWarnings("all") SuperBuilderWithCustomBuilderClassName.SubClass build() {
return new SuperBuilderWithCustomBuilderClassName.SubClass(this);
}
}
protected @java.lang.SuppressWarnings("all") SubClass(final SuperBuilderWithCustomBuilderClassName.SubClass.Builder<?, ?> b) {
super(b);
}
public static @java.lang.SuppressWarnings("all") SuperBuilderWithCustomBuilderClassName.SubClass.Builder<?, ?> builder() {
return new SuperBuilderWithCustomBuilderClassName.SubClass.BuilderImpl();
}
}
SuperBuilderWithCustomBuilderClassName() {
super();
}
}
@@ -0,0 +1,9 @@
//CONF: lombok.builder.className=Builder
class SuperBuilderWithCustomBuilderClassName {
@lombok.experimental.SuperBuilder
static class SuperClass {
}
@lombok.experimental.SuperBuilder
static class SubClass extends SuperClass {
}
}

0 comments on commit 30a2921

Please sign in to comment.