11package com .github .junkfactory .innerbuilder ;
22
3+ import com .github .junkfactory .innerbuilder .ui .JavaInnerBuilderOption ;
34import com .intellij .codeInsight .generation .PsiFieldMember ;
45import com .intellij .psi .PsiClass ;
56import com .intellij .psi .PsiElement ;
1112import org .jetbrains .annotations .Nullable ;
1213
1314import java .util .ArrayList ;
14- import java .util .List ;
1515import java .util .Objects ;
1616import java .util .stream .Collectors ;
1717import java .util .stream .Stream ;
@@ -34,31 +34,47 @@ class BuilderClassGenerator extends AbstractGenerator {
3434
3535 @ Override
3636 public void run () {
37- var selectedFields = generatorParams .selectedFields ();
37+ //builder constructor
38+ var builderConstructor = generateBuilderConstructor ();
39+ addMethod (builderClass , null , builderConstructor , false );
40+
41+ //build setters
42+ var selectedFields = generatorParams .psi ().selectedFields ();
3843 var fieldMembers = new ArrayList <PsiFieldMember >();
3944 PsiElement lastAddedField = null ;
4045 for (var fieldMember : selectedFields ) {
4146 lastAddedField = findOrCreateField (builderClass , fieldMember , lastAddedField );
4247 fieldMembers .add (fieldMember );
4348 }
44- //builder constructor
45- var builderConstructor = generateBuilderConstructor ();
46- addMethod (builderClass , null , builderConstructor , false );
4749
48- // builder methods
4950 PsiElement lastAddedElement = null ;
5051 for (var member : fieldMembers ) {
5152 var setterMethod = generateBuilderSetter (builderType , member );
5253 lastAddedElement = addMethod (builderClass , lastAddedElement , setterMethod , false );
5354 }
5455
56+ //build validate method
57+ var options = generatorParams .options ();
58+ if (options .contains (JavaInnerBuilderOption .WITH_VALIDATE_METHOD )) {
59+ var validateMethod = generateValidateMethod ();
60+ addMethod (builderClass , lastAddedElement , validateMethod , false );
61+ }
62+
5563 // builder.build() method
56- var buildMethod = generateBuildMethod (targetClass , selectedFields );
57- addMethod (builderClass , lastAddedElement , buildMethod , targetClass .isRecord ());
64+ var buildMethod = generateBuildMethod ();
65+ addMethod (builderClass , null , buildMethod , targetClass .isRecord ());
66+ }
67+
68+ private PsiMethod generateValidateMethod () {
69+ var psiElementFactory = generatorParams .psi ().factory ();
70+ var voidType = psiElementFactory .createPrimitiveType ("void" );
71+ var validateMethod = psiElementFactory .createMethod ("validate" , voidType );
72+ PsiUtil .setModifierProperty (validateMethod , PsiModifier .PRIVATE , true );
73+ return validateMethod ;
5874 }
5975
6076 private PsiMethod generateBuilderConstructor () {
61- var builderConstructor = generatorParams .psiElementFactory ().createConstructor (BUILDER_CLASS_NAME );
77+ var builderConstructor = generatorParams .psi (). factory ().createConstructor (BUILDER_CLASS_NAME );
6278 PsiUtil .setModifierProperty (builderConstructor , PsiModifier .PRIVATE , true );
6379 return builderConstructor ;
6480 }
@@ -70,7 +86,7 @@ private PsiMethod generateBuilderSetter(final PsiType builderType, final PsiFiel
7086 var fieldName = Utils .hasOneLetterPrefix (field .getName ()) ?
7187 Character .toLowerCase (field .getName ().charAt (1 )) + field .getName ().substring (2 ) : field .getName ();
7288
73- var psiElementFactory = generatorParams .psiElementFactory ();
89+ var psiElementFactory = generatorParams .psi (). factory ();
7490 var setterMethod = psiElementFactory .createMethod (fieldName , builderType );
7591
7692 setterMethod .getModifierList ().setModifierProperty (PsiModifier .PUBLIC , true );
@@ -86,8 +102,8 @@ private PsiMethod generateBuilderSetter(final PsiType builderType, final PsiFiel
86102 return setterMethod ;
87103 }
88104
89- private PsiMethod generateBuildMethod (final PsiClass targetClass , final List < PsiFieldMember > selectedFields ) {
90- var psiElementFactory = generatorParams .psiElementFactory ();
105+ private PsiMethod generateBuildMethod () {
106+ var psiElementFactory = generatorParams .psi (). factory ();
91107 var targetClassType = psiElementFactory .createType (targetClass );
92108 var buildMethod = psiElementFactory .createMethod ("build" , targetClassType );
93109
@@ -98,9 +114,14 @@ private PsiMethod generateBuildMethod(final PsiClass targetClass, final List<Psi
98114 .ifPresent (modifier -> PsiUtil .setModifierProperty (buildMethod , modifier , true ));
99115
100116 var buildMethodBody = Objects .requireNonNull (buildMethod .getBody ());
117+ if (generatorParams .options ().contains (JavaInnerBuilderOption .WITH_VALIDATE_METHOD )) {
118+ var validateCall = psiElementFactory .createStatementFromText ("validate();" , buildMethod );
119+ buildMethodBody .add (validateCall );
120+ }
121+
101122 final PsiStatement returnStatement ;
102123 if (targetClass .isRecord ()) {
103- var recordParameters = selectedFields .stream ()
124+ var recordParameters = generatorParams . psi (). selectedFields () .stream ()
104125 .map (m -> m .getElement ().getName ())
105126 .collect (Collectors .joining (", " ));
106127 returnStatement = psiElementFactory .createStatementFromText (String .format (
@@ -109,6 +130,7 @@ private PsiMethod generateBuildMethod(final PsiClass targetClass, final List<Psi
109130 returnStatement = psiElementFactory .createStatementFromText (String .format (
110131 "return new %s(this);" , targetClass .getName ()), buildMethod );
111132 }
133+
112134 buildMethodBody .add (returnStatement );
113135 return buildMethod ;
114136 }
@@ -119,12 +141,11 @@ private PsiElement findOrCreateField(final PsiClass builderClass, final PsiField
119141 var fieldName = field .getName ();
120142 var fieldType = field .getType ();
121143 var existingField = builderClass .findFieldByName (fieldName , false );
122- if (existingField == null ||
123- Utils .areTypesPresentableNotEqual (existingField .getType (), fieldType )) {
144+ if (existingField == null || Utils .areTypesPresentableNotEqual (existingField .getType (), fieldType )) {
124145 if (existingField != null ) {
125146 existingField .delete ();
126147 }
127- var newField = generatorParams .psiElementFactory ().createField (fieldName , fieldType );
148+ var newField = generatorParams .psi (). factory ().createField (fieldName , fieldType );
128149 if (last != null ) {
129150 return builderClass .addAfter (newField , last );
130151 } else {
0 commit comments