11package com .github .junkfactory .innerbuilder .generators ;
22
3+ import com .github .junkfactory .innerbuilder .generators .BuilderMethodsGenerator .BuilderClassName ;
34import com .github .junkfactory .innerbuilder .ui .JavaInnerBuilderOption ;
45import com .intellij .codeInsight .generation .PsiFieldMember ;
56import com .intellij .psi .PsiClass ;
2223
2324class InnerBuilderGenerator extends AbstractGenerator implements Generator {
2425
26+ public record BuilderClass (PsiClass psiClass ,
27+ PsiType builderType ,
28+ BuilderClassName builderClassName ,
29+ boolean genericType ) {
30+ }
31+
2532 InnerBuilderGenerator (GeneratorFactory generatorFactory , GeneratorParams generatorParams ) {
2633 super (generatorFactory , generatorParams );
2734 }
@@ -33,54 +40,51 @@ public GenerationResult generate() {
3340 if (targetClass == null || BUILDER_CLASS_NAME .equals (targetClass .getName ())) {
3441 return NO_RESULT ;
3542 }
36- var psiElementFactory = generatorParams .psi ().factory ();
3743 var builderClass = findOrCreateBuilderClass (targetClass );
38- var builderType = psiElementFactory .createTypeFromText (BUILDER_CLASS_NAME , targetClass );
3944
4045 if (!targetClass .isRecord ()) {
41- var constructor = generateTargetConstructor (targetClass , builderType );
46+ var constructor = generateTargetConstructor (targetClass , builderClass );
4247 addMethod (targetClass , null , constructor , true );
4348 }
4449
45- var newBuilderMethod = generateStaticBuilderMethod (targetClass , builderType );
50+ var newBuilderMethod = generateStaticBuilderMethod (targetClass , builderClass );
4651 addMethod (targetClass , null , newBuilderMethod , false );
4752
4853 // toBuilder method
4954 var options = generatorParams .options ();
5055 if (options .contains (JavaInnerBuilderOption .WITH_TO_BUILDER_METHOD )) {
51- var toBuilderMethod = generateToBuilderMethod (targetClass , builderType ,
56+ var toBuilderMethod = generateToBuilderMethod (targetClass , builderClass ,
5257 generatorParams .psi ().selectedFields ());
5358 addMethod (targetClass , null , toBuilderMethod , true );
5459 }
5560
5661 var params = BuilderClassParams .builder ()
5762 .targetClass (targetClass )
5863 .builderClass (builderClass )
59- .builderType (builderType )
6064 .build ();
6165 var result = generatorFactory .createBuilderClassGenerator (generatorParams , params ).generate ();
6266 generationResult .merge (result );
6367 var codeStyleManager = generatorParams .psi ().codeStyleManager ();
6468 generationResult .when (ANNOTATIONS_ADDED , () -> codeStyleManager .shortenClassReferences (targetClass ));
6569 generationResult .when (IMPORTS_ADDED , () -> codeStyleManager .removeRedundantImports ((PsiJavaFile ) file ));
66- CodeStyleManager .getInstance (generatorParams .project ()).reformat (builderClass );
70+ CodeStyleManager .getInstance (generatorParams .project ()).reformat (builderClass . psiClass () );
6771 return generationResult ;
6872 }
6973
7074 private PsiMethod generateToBuilderMethod (PsiClass targetClass ,
71- PsiType builderType ,
75+ BuilderClass builderClass ,
7276 Collection <PsiFieldMember > fields ) {
7377 var targetModifierList = Objects .requireNonNull (targetClass .getModifierList ());
7478 boolean isPublic = targetModifierList .hasModifierProperty (PsiModifier .PUBLIC );
7579 var toBuilderMethod = new StringBuilder ()
7680 .append (isPublic ? PsiModifier .PUBLIC : EMPTY )
7781 .append (isPublic ? SPACE : EMPTY )
78- .append (builderType .getPresentableText ())
82+ .append (builderClass . builderType () .getPresentableText ())
7983 .append (SPACE )
8084 .append (TO_BUILDER_NAME )
8185 .append ("() {" )
8286 .append ("var builder = new " )
83- .append (builderType .getPresentableText ())
87+ .append (builderClass . builderType () .getPresentableText ())
8488 .append ("();" );
8589 for (var member : fields ) {
8690 var field = member .getElement ();
@@ -97,9 +101,10 @@ private PsiMethod generateToBuilderMethod(PsiClass targetClass,
97101 return psiElementFactory .createMethodFromText (toBuilderMethod .toString (), targetClass );
98102 }
99103
100- private PsiMethod generateStaticBuilderMethod (PsiClass targetClass , PsiType builderType ) {
104+ private PsiMethod generateStaticBuilderMethod (PsiClass targetClass , BuilderClass builderClass ) {
101105 var psiElementFactory = generatorParams .psi ().factory ();
102- var newBuilderMethod = psiElementFactory .createMethod (BUILDER_METHOD_NAME , builderType );
106+ var methodName = Utils .buildBuilderMethodName (builderClass .builderType ());
107+ var newBuilderMethod = psiElementFactory .createMethodFromText (methodName , targetClass );
103108 PsiUtil .setModifierProperty (newBuilderMethod , PsiModifier .STATIC , true );
104109 PsiUtil .setModifierProperty (newBuilderMethod , PsiModifier .PUBLIC , true );
105110
@@ -108,18 +113,18 @@ private PsiMethod generateStaticBuilderMethod(PsiClass targetClass, PsiType buil
108113 existingMethod = newBuilderMethod ;
109114 var newBuilderMethodBody = Objects .requireNonNull (existingMethod .getBody ());
110115 var newStatement = psiElementFactory .createStatementFromText (String .format (
111- "return new %s();" , builderType . getPresentableText ()), newBuilderMethod );
116+ "return new %s();" , builderClass . builderClassName (). instanceClassName ()), newBuilderMethod );
112117 newBuilderMethodBody .add (newStatement );
113118 }
114119 return existingMethod ;
115120 }
116121
117- private PsiMethod generateTargetConstructor (final PsiClass targetClass , final PsiType builderType ) {
122+ private PsiMethod generateTargetConstructor (final PsiClass targetClass , BuilderClass builderClass ) {
118123 var constructor = new StringBuilder ()
119124 .append ("private " )
120125 .append (targetClass .getName ())
121126 .append ("(" )
122- .append (builderType .getPresentableText ())
127+ .append (builderClass . builderType () .getPresentableText ())
123128 .append (" builder) {" );
124129
125130 for (var member : generatorParams .psi ().selectedFields ()) {
@@ -151,19 +156,22 @@ private PsiMethod generateTargetConstructor(final PsiClass targetClass, final Ps
151156 }
152157
153158 @ NotNull
154- private PsiClass findOrCreateBuilderClass (final PsiClass targetClass ) {
155- var builderClass = targetClass .findInnerClassByName (BUILDER_CLASS_NAME , false );
159+ private BuilderClass findOrCreateBuilderClass (final PsiClass targetClass ) {
160+ var builderClassName = Utils .buildClassName (BUILDER_CLASS_NAME , targetClass );
161+ var builderClass = targetClass .findInnerClassByName (builderClassName .className (), false );
156162 if (builderClass == null ) {
157- return (PsiClass ) targetClass .add (createBuilderClass (targetClass ));
163+ builderClass = (PsiClass ) targetClass .add (createBuilderClass (targetClass , builderClassName . className () ));
158164 }
159165
160- return builderClass ;
166+ var psiElementFactory = generatorParams .psi ().factory ();
167+ var builderType = psiElementFactory .createTypeFromText (builderClassName .className (), targetClass );
168+ return new BuilderClass (builderClass , builderType , builderClassName , Utils .isGenericType (builderType ));
161169 }
162170
163171 @ NotNull
164- private PsiClass createBuilderClass (final PsiClass targetClass ) {
172+ private PsiClass createBuilderClass (final PsiClass targetClass , String builderClassName ) {
165173 String classDef = "public static final class " +
166- BUILDER_CLASS_NAME +
174+ builderClassName +
167175 " {}" +
168176 System .lineSeparator ();
169177 return generatorParams .psi ().factory ().createClassFromText (classDef , targetClass )
0 commit comments