77import com .intellij .psi .PsiField ;
88import com .intellij .psi .PsiMethod ;
99import com .intellij .psi .PsiModifier ;
10- import com .intellij .psi .PsiStatement ;
1110import com .intellij .psi .util .PsiUtil ;
1211
1312import java .util .Objects ;
1413import java .util .Optional ;
1514import java .util .stream .Collectors ;
16- import java .util .stream .Stream ;
1715
1816class BuilderMethodsGenerator extends AbstractGenerator implements MethodsGenerator {
1917
@@ -35,7 +33,7 @@ public void run() {
3533 PsiElement lastAddedElement = null ;
3634 for (var field : fieldsGenerator .getFields ()) {
3735 var setterMethod = generateFieldMethod (field );
38- field .putCopyableUserData (UserDataKey .METHOD_REF , setterMethod );
36+ field .putCopyableUserData (UserDataKey .METHOD_REF , setterMethod . getName () );
3937 lastAddedElement = addMethod (builderClass , lastAddedElement , setterMethod , false );
4038 }
4139
@@ -86,74 +84,61 @@ private PsiMethod generateAddToCollection(PsiField field, PsiMethod fieldAddMeth
8684 .substitute (param .getType ());
8785
8886 //now build the add method
89- var fieldName = "addTo" + StringUtil .capitalize (field .getName ());
87+ var methodName = "addTo" + StringUtil .capitalize (field .getName ());
88+ var methodText = """
89+ public %s %s(%s %s) {
90+ this.%s.add(%s);
91+ return this;
92+ }""" .formatted (BUILDER_CLASS_NAME , methodName , paramType .getPresentableText (),
93+ param .getName ().toLowerCase (), field .getName (), param .getName ());
9094 var psiElementFactory = generatorParams .psi ().factory ();
91- var addMethod = psiElementFactory .createMethod (fieldName , builderClassParams .builderType ());
92- PsiUtil .setModifierProperty (addMethod , PsiModifier .PUBLIC , true );
93-
94- var addParameter = psiElementFactory .createParameter (param .getName ().toLowerCase (), paramType );
95- addMethod .getParameterList ().add (addParameter );
96-
97- var addMethodBody = Objects .requireNonNull (addMethod .getBody ());
98- var addBody = psiElementFactory .createStatementFromText (String .format (
99- "this.%s.add(%s);" , field .getName (), param .getName ()), addMethod );
100- addMethodBody .add (addBody );
101- addMethodBody .add (Utils .createReturnThis (psiElementFactory , addMethod ));
102- return addMethod ;
95+ return psiElementFactory .createMethodFromText (methodText , field );
10396 }
10497
10598 private PsiMethod generateBuilderSetter (PsiField field ) {
10699 var fieldType = field .getType ();
107100 var fieldName = Utils .hasOneLetterPrefix (field .getName ()) ?
108101 Character .toLowerCase (field .getName ().charAt (1 )) + field .getName ().substring (2 ) : field .getName ();
109102
103+ var methodText = """
104+ public %s %s(%s %s) {
105+ this.%s = %s;
106+ return this;
107+ }""" .formatted (BUILDER_CLASS_NAME , fieldName , fieldType .getPresentableText (),
108+ fieldName , field .getName (), fieldName );
110109 var psiElementFactory = generatorParams .psi ().factory ();
111- var setterMethod = psiElementFactory .createMethod (fieldName , builderClassParams .builderType ());
112- setterMethod .getModifierList ().setModifierProperty (PsiModifier .PUBLIC , true );
113-
114- var setterParameter = psiElementFactory .createParameter (fieldName , fieldType );
115- setterMethod .getParameterList ().add (setterParameter );
116-
117- var setterMethodBody = Objects .requireNonNull (setterMethod .getBody ());
118- var actualFieldName = "this." + fieldName ;
119- var assignStatement = psiElementFactory .createStatementFromText (String .format (
120- "%s = %s;" , actualFieldName , fieldName ), setterMethod );
121- setterMethodBody .add (assignStatement );
122- setterMethodBody .add (Utils .createReturnThis (psiElementFactory , setterMethod ));
123- return setterMethod ;
110+ return psiElementFactory .createMethodFromText (methodText , field );
124111 }
125112
126113 private PsiMethod generateBuildMethod () {
127114 var targetClass = builderClassParams .targetClass ();
128- var psiElementFactory = generatorParams .psi ().factory ();
129- var targetClassType = psiElementFactory .createType (targetClass );
130- var buildMethod = psiElementFactory .createMethod ("build" , targetClassType );
131-
132115 var targetModifierList = Objects .requireNonNull (targetClass .getModifierList ());
133- Stream .of (PsiModifier .PUBLIC , PsiModifier .PACKAGE_LOCAL )
134- .filter (targetModifierList ::hasModifierProperty )
135- .findFirst ()
136- .ifPresent (modifier -> PsiUtil .setModifierProperty (buildMethod , modifier , true ));
116+ boolean isPublic = targetModifierList .hasModifierProperty (PsiModifier .PUBLIC );
137117
138- var buildMethodBody = Objects .requireNonNull (buildMethod .getBody ());
118+ var buildMethod = new StringBuilder ()
119+ .append (isPublic ? PsiModifier .PUBLIC : EMPTY )
120+ .append (isPublic ? SPACE : EMPTY )
121+ .append (targetClass .getName ())
122+ .append (" build() {" );
139123 if (generatorParams .options ().contains (JavaInnerBuilderOption .WITH_VALIDATE_METHOD )) {
140- var validateCall = psiElementFactory .createStatementFromText ("validate();" , buildMethod );
141- buildMethodBody .add (validateCall );
124+ buildMethod .append ("validate();" );
142125 }
143-
144- final PsiStatement returnStatement ;
145126 if (targetClass .isRecord ()) {
146- var recordParameters = generatorParams . psi (). selectedFields ().stream ()
147- .map (m -> m . getElement (). getName () )
127+ var recordParameters = fieldsGenerator . getFields ().stream ()
128+ .map (PsiField :: getName )
148129 .collect (Collectors .joining (", " ));
149- returnStatement = psiElementFactory .createStatementFromText (String .format (
150- "return new %s(%s);" , targetClass .getName (), recordParameters ), buildMethod );
130+ buildMethod .append ("return new " )
131+ .append (targetClass .getName ())
132+ .append ("(" )
133+ .append (recordParameters )
134+ .append (");" );
151135 } else {
152- returnStatement = psiElementFactory .createStatementFromText (String .format (
153- "return new %s(this);" , targetClass .getName ()), buildMethod );
136+ buildMethod .append ("return new " )
137+ .append (targetClass .getName ())
138+ .append ("(this);" );
154139 }
140+ buildMethod .append ("}" );
155141
156- buildMethodBody .add (returnStatement );
157- return buildMethod ;
142+ return generatorParams .psi ().factory ().createMethodFromText (buildMethod .toString (), targetClass );
158143 }
159144}
0 commit comments