22
33import com .github .junkfactory .innerbuilder .ui .JavaInnerBuilderOption ;
44import com .intellij .openapi .util .text .StringUtil ;
5+ import com .intellij .psi .PsiClass ;
56import com .intellij .psi .PsiElement ;
67import com .intellij .psi .PsiField ;
78import com .intellij .psi .PsiMethod ;
@@ -15,6 +16,9 @@ class BuilderMethodsGenerator extends AbstractGenerator implements MethodsGenera
1516
1617 private final BuilderClassParams builderClassParams ;
1718 private final FieldsGenerator fieldsGenerator ;
19+ private final GenerationResult generationResult ;
20+
21+ private boolean isPublic ;
1822
1923 BuilderMethodsGenerator (GeneratorFactory generatorFactory ,
2024 GeneratorParams generatorParams ,
@@ -23,11 +27,15 @@ class BuilderMethodsGenerator extends AbstractGenerator implements MethodsGenera
2327 super (generatorFactory , generatorParams );
2428 this .builderClassParams = builderClassParams ;
2529 this .fieldsGenerator = fieldsGenerator ;
30+ this .generationResult = new GenerationResult ();
2631 }
2732
2833 @ Override
29- public void run () {
34+ public GenerationResult generate () {
3035 var builderClass = builderClassParams .builderClass ();
36+ var targetClass = builderClassParams .targetClass ();
37+ var targetModifierList = Objects .requireNonNull (targetClass .getModifierList ());
38+ isPublic = targetModifierList .hasModifierProperty (PsiModifier .PUBLIC );
3139 PsiElement lastAddedElement = null ;
3240 for (var field : fieldsGenerator .getFields ()) {
3341 var setterMethod = generateFieldMethod (field );
@@ -41,8 +49,9 @@ public void run() {
4149 addMethod (builderClass , lastAddedElement , validateMethod , false );
4250 }
4351
44- var buildMethod = generateBuildMethod ();
52+ var buildMethod = generateBuildMethod (targetClass );
4553 addMethod (builderClass , null , buildMethod , builderClassParams .targetClass ().isRecord ());
54+ return generationResult ;
4655 }
4756
4857 private PsiMethod generateValidateMethod () {
@@ -71,58 +80,108 @@ private PsiMethod generatePutToMap(PsiField field, PsiMethod fieldPutMethod) {
7180 //resolve the generic type of the map via the parameter type of the put method
7281 var param1 = Objects .requireNonNull (fieldPutMethod .getParameterList ().getParameter (0 ));
7382 var param1Type = Utils .resolveGenericParameterType (field .getType (), param1 );
83+ var importAdded = addImport (param1Type );
84+
7485 var param2 = Objects .requireNonNull (fieldPutMethod .getParameterList ().getParameter (1 ));
7586 var param2Type = Utils .resolveGenericParameterType (field .getType (), param2 );
87+ importAdded = addImport (param2Type ) || importAdded ;
88+ if (importAdded ) {
89+ generationResult .set (GenerationResult .Code .IMPORTS_ADDED );
90+ }
7691
77- //now build the put method
7892 var methodName = "putTo" + StringUtil .capitalize (field .getName ());
79- var methodText = """
80- public %s %s(%s key, %s value) {
81- this.%s.put(key, value);
82- return this;
83- }""" .formatted (BUILDER_CLASS_NAME , methodName , param1Type .getPresentableText (),
84- param2Type .getPresentableText (), field .getName ());
93+ var methodText = new StringBuilder ();
94+ if (isPublic ) {
95+ methodText .append (PsiModifier .PUBLIC ).append (' ' );
96+ }
97+ methodText .append (BUILDER_CLASS_NAME )
98+ .append (' ' )
99+ .append (methodName )
100+ .append ('(' )
101+ .append (param1Type .getPresentableText ())
102+ .append (' ' )
103+ .append (param1 .getName ().toLowerCase ())
104+ .append (", " )
105+ .append (param2Type .getPresentableText ())
106+ .append (' ' )
107+ .append (param2 .getName ().toLowerCase ())
108+ .append (") {" )
109+ .append (THIS_DOT )
110+ .append (field .getName ())
111+ .append (".put(" )
112+ .append (param1 .getName ().toLowerCase ())
113+ .append (", " )
114+ .append (param2 .getName ().toLowerCase ())
115+ .append (");" )
116+ .append (RETURN_THIS )
117+ .append ('}' );
85118 var psiElementFactory = generatorParams .psi ().factory ();
86- return psiElementFactory .createMethodFromText (methodText , field );
119+ return psiElementFactory .createMethodFromText (methodText . toString () , field );
87120 }
88121
89122 private PsiMethod generateAddToCollection (PsiField field , PsiMethod fieldAddMethod ) {
90123 //resolve the generic type of the collection via the parameter type of the add method
91124 var param = Objects .requireNonNull (fieldAddMethod .getParameterList ().getParameter (0 ));
92125 var paramType = Utils .resolveGenericParameterType (field .getType (), param );
126+ if (addImport (paramType )) {
127+ generationResult .set (GenerationResult .Code .IMPORTS_ADDED );
128+ }
93129
94- //now build the add method
95130 var methodName = "addTo" + StringUtil .capitalize (field .getName ());
96- var methodText = """
97- public %s %s(%s %s) {
98- this.%s.add(%s);
99- return this;
100- }""" .formatted (BUILDER_CLASS_NAME , methodName , paramType .getPresentableText (),
101- param .getName ().toLowerCase (), field .getName (), param .getName ());
131+ var methodText = new StringBuilder ();
132+ if (isPublic ) {
133+ methodText .append (PsiModifier .PUBLIC ).append (' ' );
134+ }
135+ methodText .append (BUILDER_CLASS_NAME )
136+ .append (' ' )
137+ .append (methodName )
138+ .append ('(' )
139+ .append (paramType .getPresentableText ())
140+ .append (' ' )
141+ .append (param .getName ().toLowerCase ())
142+ .append (") {" )
143+ .append (THIS_DOT )
144+ .append (field .getName ())
145+ .append (".add(" )
146+ .append (param .getName ())
147+ .append (");" )
148+ .append (RETURN_THIS )
149+ .append ('}' );
150+
102151 var psiElementFactory = generatorParams .psi ().factory ();
103- return psiElementFactory .createMethodFromText (methodText , field );
152+ return psiElementFactory .createMethodFromText (methodText . toString () , field );
104153 }
105154
106155 private PsiMethod generateBuilderSetter (PsiField field ) {
107156 var fieldType = field .getType ();
108157 var fieldName = Utils .hasOneLetterPrefix (field .getName ()) ?
109158 Character .toLowerCase (field .getName ().charAt (1 )) + field .getName ().substring (2 ) : field .getName ();
110159
111- var methodText = """
112- public %s %s(%s %s) {
113- this.%s = %s;
114- return this;
115- }""" .formatted (BUILDER_CLASS_NAME , fieldName , fieldType .getPresentableText (),
116- fieldName , field .getName (), fieldName );
160+ var methodText = new StringBuilder ();
161+ if (isPublic ) {
162+ methodText .append (PsiModifier .PUBLIC ).append (' ' );
163+ }
164+ methodText .append (BUILDER_CLASS_NAME )
165+ .append (' ' )
166+ .append (fieldName )
167+ .append ('(' )
168+ .append (fieldType .getPresentableText ())
169+ .append (' ' )
170+ .append (fieldName )
171+ .append (") {" )
172+ .append (THIS_DOT )
173+ .append (field .getName ())
174+ .append (" = " )
175+ .append (fieldName )
176+ .append (";" )
177+ .append (RETURN_THIS )
178+ .append ('}' );
179+
117180 var psiElementFactory = generatorParams .psi ().factory ();
118- return psiElementFactory .createMethodFromText (methodText , field );
181+ return psiElementFactory .createMethodFromText (methodText . toString () , field );
119182 }
120183
121- private PsiMethod generateBuildMethod () {
122- var targetClass = builderClassParams .targetClass ();
123- var targetModifierList = Objects .requireNonNull (targetClass .getModifierList ());
124- boolean isPublic = targetModifierList .hasModifierProperty (PsiModifier .PUBLIC );
125-
184+ private PsiMethod generateBuildMethod (PsiClass targetClass ) {
126185 var buildMethod = new StringBuilder ()
127186 .append (isPublic ? PsiModifier .PUBLIC : EMPTY )
128187 .append (isPublic ? SPACE : EMPTY )
@@ -149,4 +208,5 @@ private PsiMethod generateBuildMethod() {
149208
150209 return generatorParams .psi ().factory ().createMethodFromText (buildMethod .toString (), targetClass );
151210 }
211+
152212}
0 commit comments