From 33281d857891b24cb1c40233807620769a158bbf Mon Sep 17 00:00:00 2001 From: Reinier Zwitserloot Date: Mon, 25 Mar 2019 23:40:29 +0100 Subject: [#2046] Extend suppress builder feature to `@SuperBuilder` --- .../eclipse/handlers/HandleSuperBuilder.java | 27 +++++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'src/core/lombok/eclipse/handlers/HandleSuperBuilder.java') diff --git a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java index 7b6a3c28..6f34eb30 100755 --- a/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java +++ b/src/core/lombok/eclipse/handlers/HandleSuperBuilder.java @@ -129,7 +129,14 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler { if (builderMethodName == null) builderMethodName = "builder"; if (buildMethodName == null) buildMethodName = "build"; - if (!checkName("builderMethodName", builderMethodName, annotationNode)) return; + boolean generateBuilderMethod; + if (builderMethodName.isEmpty()) { + generateBuilderMethod = false; + } else if (!checkName("builderMethodName", builderMethodName, annotationNode)) { + return; + } else { + generateBuilderMethod = true; + } if (!checkName("buildMethodName", buildMethodName, annotationNode)) return; boolean toBuilder = superbuilderAnnotation.toBuilder(); @@ -150,6 +157,8 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler { // Gather all fields of the class that should be set by the builder. List allFields = new ArrayList(); + List nonFinalNonDefaultedFields = null; + boolean valuePresent = (hasAnnotation(lombok.Value.class, tdParent) || hasAnnotation("lombok.experimental.Value", tdParent)); for (EclipseNode fieldNode : HandleConstructor.findAllFields(tdParent, true)) { FieldDeclaration fd = (FieldDeclaration) fieldNode.get(); @@ -177,10 +186,9 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler { } if (fd.initialization != null && isDefault == null) { - if (isFinal) { - continue; - } - fieldNode.addWarning("@Builder will ignore the initializing expression entirely. If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final."); + if (isFinal) continue; + if (nonFinalNonDefaultedFields == null) nonFinalNonDefaultedFields = new ArrayList(); + nonFinalNonDefaultedFields.add(fieldNode); } if (isDefault != null) { @@ -386,10 +394,17 @@ public class HandleSuperBuilder extends EclipseAnnotationHandler { } // Add the builder() method to the annotated class. - if (methodExists(builderMethodName, tdParent, -1) == MemberExistsResult.NOT_EXISTS) { + if (generateBuilderMethod && methodExists(builderMethodName, tdParent, -1) != MemberExistsResult.NOT_EXISTS) generateBuilderMethod = false; + if (generateBuilderMethod) { MethodDeclaration md = generateBuilderMethod(builderMethodName, builderClassName, builderImplClassName, tdParent, typeParams, ast); if (md != null) injectMethod(tdParent, md); } + + if (nonFinalNonDefaultedFields != null && generateBuilderMethod) { + for (EclipseNode fieldNode : nonFinalNonDefaultedFields) { + fieldNode.addWarning("@SuperBuilder will ignore the initializing expression entirely. If you want the initializing expression to serve as default, add @Builder.Default. If it is not supposed to be settable during building, make the field final."); + } + } } private EclipseNode generateBuilderAbstractClass(EclipseNode tdParent, String builderClass, -- cgit