[lombok] IDEA-341962 IDEA-301474 improve delombok of SuperBuilder with Builder.Defaults

GitOrigin-RevId: dd3c7ae0bd7ee5168b669228e106c9741218ee24
This commit is contained in:
Michail Plushnikov
2023-12-29 19:54:30 +01:00
committed by intellij-monorepo-bot
parent 01d336719b
commit 4cf257adaa
9 changed files with 94 additions and 6 deletions

View File

@@ -83,6 +83,9 @@ public final class SuperBuilderProcessor extends AbstractClassProcessor {
builderHandler.createBuilderBasedConstructor(psiClass, builderBaseClass, psiAnnotation, psiTypeBaseWithGenerics)
.ifPresent(target::add);
target.addAll(
builderHandler.createBuilderDefaultProviderMethodsIfNecessary(psiClass, null, builderBaseClass, psiAnnotation));
// skip generation of builder methods, if class is abstract
if (!psiClass.hasModifierProperty(PsiModifier.ABSTRACT)) {
final String builderImplClassName = builderHandler.getBuilderImplClassName(psiClass);

View File

@@ -277,7 +277,7 @@ public class BuilderInfo {
}
public String renderSuperBuilderConstruction() {
return builderElementHandler.renderSuperBuilderConstruction(variableInClass, fieldInBuilderName);
return builderElementHandler.renderSuperBuilderConstruction(this);
}
public String renderFieldName() {

View File

@@ -120,7 +120,7 @@ public class SuperBuilderHandler extends BuilderHandler {
.withParameter(BUILDER_VARIABLE_NAME, psiTypeBaseWithGenerics);
final List<BuilderInfo> builderInfos = createBuilderInfos(psiClass, psiAnnotation, builderClass);
//dont need initBuilderInfosBuilderClassType here
//don't need initBuilderInfosBuilderClassType here
final String buildMethodPrepare = builderInfos.stream()
.map(BuilderInfo::renderSuperBuilderConstruction)

View File

@@ -7,6 +7,7 @@ import de.plushnikov.intellij.plugin.thirdparty.LombokUtils;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -23,8 +24,19 @@ public interface BuilderElementHandler {
return "this." + info.renderFieldName();
}
default String renderSuperBuilderConstruction(@NotNull PsiVariable psiVariable, @NotNull String fieldName) {
return "this." + psiVariable.getName() + "=b." + fieldName + ";\n";
default String renderSuperBuilderConstruction(@NotNull BuilderInfo info) {
if (info.hasBuilderDefaultAnnotation()) {
final String block = """
if (b.{0}) '{'
this.{1} = b.{2};
'}' else '{'
this.{1} = {3}();
'}'
""";
return MessageFormat.format(block, info.renderFieldDefaultSetName(), info.getVariable().getName(), info.renderFieldName(),
info.renderFieldDefaultProviderName());
}
return "this." + info.getVariable().getName() + "=b." + info.renderFieldName() + ";\n";
}
default String renderToBuilderCall(@NotNull BuilderInfo info) {

View File

@@ -103,7 +103,9 @@ class SingularCollectionHandler extends AbstractSingularHandler {
}
@Override
public String renderSuperBuilderConstruction(@NotNull PsiVariable psiVariable, @NotNull String fieldName) {
public String renderSuperBuilderConstruction(@NotNull BuilderInfo info) {
final PsiVariable psiVariable = info.getVariable();
final String fieldName = info.renderFieldName();
return renderBuildCode(psiVariable, fieldName, "b") + "this." + psiVariable.getName() + "=" + fieldName + ";\n";
}

View File

@@ -202,7 +202,9 @@ class SingularMapHandler extends AbstractSingularHandler {
}
@Override
public String renderSuperBuilderConstruction(@NotNull PsiVariable psiVariable, @NotNull String fieldName) {
public String renderSuperBuilderConstruction(@NotNull BuilderInfo info) {
final PsiVariable psiVariable = info.getVariable();
final String fieldName = info.renderFieldName();
final String basicCode = renderBuildCode(psiVariable, fieldName, "b");
final String assignment = "this." + psiVariable.getName() + "=" + fieldName + ";\n";
return basicCode + assignment;

View File

@@ -18,4 +18,8 @@ public class DelombokSuperBuilderActionTest extends LombokLightActionTestCase {
public void testSuperBuilderJacksonized() throws Exception {
doTest();
}
public void testSuperBuilderWithBuilderDefault() throws Exception {
doTest();
}
}

View File

@@ -0,0 +1,55 @@
import java.util.ArrayList;
import java.util.List;
public class SuperBuilderWithBuilderDefault {
private List<String> listItems = new ArrayList<>();
protected SuperBuilderWithBuilderDefault(SuperBuilderWithBuilderDefault.SuperBuilderWithBuilderDefaultBuilder<?, ?> b) {
if (b.listItems$set) {
this.listItems = b.listItems$value;
} else {
this.listItems = $default$listItems();
}
}
private static List<String> $default$listItems() {
return new ArrayList<>();
}
public static SuperBuilderWithBuilderDefaultBuilder<?, ?> builder() {
return new SuperBuilderWithBuilderDefaultBuilderImpl();
}
public static abstract class SuperBuilderWithBuilderDefaultBuilder<C extends SuperBuilderWithBuilderDefault, B extends SuperBuilderWithBuilderDefaultBuilder<C, B>> {
private List<String> listItems$value;
private boolean listItems$set;
public B listItems(List<String> listItems) {
this.listItems$value = listItems;
this.listItems$set = true;
return self();
}
protected abstract B self();
public abstract C build();
public String toString() {
return "SuperBuilderWithBuilderDefault.SuperBuilderWithBuilderDefaultBuilder(listItems$value=" + this.listItems$value + ")";
}
}
private static final class SuperBuilderWithBuilderDefaultBuilderImpl extends SuperBuilderWithBuilderDefaultBuilder<SuperBuilderWithBuilderDefault, SuperBuilderWithBuilderDefaultBuilderImpl> {
private SuperBuilderWithBuilderDefaultBuilderImpl() {
}
protected SuperBuilderWithBuilderDefaultBuilderImpl self() {
return this;
}
public SuperBuilderWithBuilderDefault build() {
return new SuperBuilderWithBuilderDefault(this);
}
}
}

View File

@@ -0,0 +1,10 @@
import java.util.ArrayList;
import java.util.List;
@lombok.experimental.SuperBuilder
public class SuperBuilderWithBuilderDefault {
<caret>
@lombok.Builder.Default
private List<String> listItems = new ArrayList<>();
}