|
2 | 2 |
|
3 | 3 | import com.github.junkfactory.innerbuilder.ui.JavaInnerBuilderOption;
|
4 | 4 | import com.intellij.openapi.util.text.StringUtil;
|
5 |
| -import com.intellij.psi.PsiClass; |
6 | 5 | import com.intellij.psi.PsiElement;
|
7 | 6 | import com.intellij.psi.PsiField;
|
8 | 7 | import com.intellij.psi.PsiMethod;
|
9 | 8 | import com.intellij.psi.PsiModifier;
|
10 | 9 | import com.intellij.psi.util.PsiUtil;
|
11 | 10 |
|
12 | 11 | import java.util.Objects;
|
13 |
| -import java.util.Optional; |
14 | 12 | import java.util.stream.Collectors;
|
15 | 13 |
|
16 | 14 | class BuilderMethodsGenerator extends AbstractGenerator implements MethodsGenerator {
|
@@ -56,32 +54,42 @@ private PsiMethod generateValidateMethod() {
|
56 | 54 | }
|
57 | 55 |
|
58 | 56 | private PsiMethod generateFieldMethod(PsiField field) {
|
59 |
| - var addMethod = field.hasInitializer() ? findAddMethod(field) : null; |
| 57 | + var addMethod = field.hasInitializer() ? Utils.findAddMethod(field) : null; |
60 | 58 | if (null != addMethod) {
|
61 | 59 | return generateAddToCollection(field, addMethod);
|
62 | 60 | }
|
| 61 | + |
| 62 | + var putMethod = field.hasInitializer() ? Utils.findPutMethod(field) : null; |
| 63 | + if (null != putMethod) { |
| 64 | + return generatePutToMap(field, putMethod); |
| 65 | + } |
| 66 | + |
63 | 67 | return generateBuilderSetter(field);
|
64 | 68 | }
|
65 | 69 |
|
66 |
| - private PsiMethod findAddMethod(PsiField field) { |
67 |
| - var fieldClass = PsiUtil.resolveClassInClassTypeOnly(field.getType()); |
68 |
| - var methods = Optional.ofNullable(fieldClass) |
69 |
| - .map(PsiClass::getAllMethods) |
70 |
| - .orElseGet(() -> new PsiMethod[0]); |
71 |
| - for (var method : methods) { |
72 |
| - if (method.getName().equals("add") && method.getParameterList().getParametersCount() == 1) { |
73 |
| - return method; |
74 |
| - } |
75 |
| - } |
76 |
| - return null; |
| 70 | + private PsiMethod generatePutToMap(PsiField field, PsiMethod fieldPutMethod) { |
| 71 | + //resolve the generic type of the map via the parameter type of the put method |
| 72 | + var param1 = Objects.requireNonNull(fieldPutMethod.getParameterList().getParameter(0)); |
| 73 | + var param1Type = Utils.resolveGenericParameterType(field.getType(), param1); |
| 74 | + var param2 = Objects.requireNonNull(fieldPutMethod.getParameterList().getParameter(1)); |
| 75 | + var param2Type = Utils.resolveGenericParameterType(field.getType(), param2); |
| 76 | + |
| 77 | + //now build the put method |
| 78 | + 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()); |
| 85 | + var psiElementFactory = generatorParams.psi().factory(); |
| 86 | + return psiElementFactory.createMethodFromText(methodText, field); |
77 | 87 | }
|
78 | 88 |
|
79 | 89 | private PsiMethod generateAddToCollection(PsiField field, PsiMethod fieldAddMethod) {
|
80 | 90 | //resolve the generic type of the collection via the parameter type of the add method
|
81 | 91 | var param = Objects.requireNonNull(fieldAddMethod.getParameterList().getParameter(0));
|
82 |
| - var paramType = PsiUtil.resolveGenericsClassInType(field.getType()) |
83 |
| - .getSubstitutor() |
84 |
| - .substitute(param.getType()); |
| 92 | + var paramType = Utils.resolveGenericParameterType(field.getType(), param); |
85 | 93 |
|
86 | 94 | //now build the add method
|
87 | 95 | var methodName = "addTo" + StringUtil.capitalize(field.getName());
|
|
0 commit comments