1
1
package io .dinject .javalin .generator ;
2
2
3
3
import javax .lang .model .element .Element ;
4
+ import javax .lang .model .element .ExecutableElement ;
4
5
import javax .lang .model .element .TypeElement ;
6
+ import javax .lang .model .element .VariableElement ;
7
+ import java .util .ArrayList ;
5
8
import java .util .HashSet ;
6
9
import java .util .LinkedHashMap ;
7
10
import java .util .List ;
@@ -21,6 +24,8 @@ class BeanParamReader {
21
24
22
25
private final Map <String , FieldReader > fieldMap = new LinkedHashMap <>();
23
26
27
+ private final List <ExecutableElement > constructors = new ArrayList <>();
28
+
24
29
BeanParamReader (ProcessingContext ctx , TypeElement beanType , String beanVarName , String beanShortType , ParamType defaultParamType ) {
25
30
this .ctx = ctx ;
26
31
this .beanType = beanType ;
@@ -35,6 +40,9 @@ private void read() {
35
40
36
41
for (Element enclosedElement : beanType .getEnclosedElements ()) {
37
42
switch (enclosedElement .getKind ()) {
43
+ case CONSTRUCTOR :
44
+ constructors .add ((ExecutableElement ) enclosedElement );
45
+ break ;
38
46
case METHOD :
39
47
readMethod (enclosedElement );
40
48
break ;
@@ -60,28 +68,59 @@ private void readMethod(Element enclosedElement) {
60
68
61
69
void write (Append writer ) {
62
70
63
- writer .append (" new %s();" , beanShortType ).eol ();
71
+ writer .append (" new %s(" , beanShortType );
72
+ final Set <String > constructorParams = writeConstructorParams (writer );
73
+ writer .append (");" ).eol ();
64
74
65
75
for (String setterMethod : setterMethods ) {
66
76
String propName = Util .propertyName (setterMethod );
67
- FieldReader field = fieldMap .get (propName );
68
- if (field != null ) {
69
- field .setUseSetter (setterMethod );
77
+ if (!constructorParams .contains (propName )) {
78
+ FieldReader field = fieldMap .get (propName );
79
+ if (field != null ) {
80
+ field .setUseSetter (setterMethod );
81
+ }
70
82
}
71
83
}
72
84
73
85
for (FieldReader field : fieldMap .values ()) {
74
- field .writeSet (writer , beanVarName );
86
+ if (!field .isConstructorParam ()) {
87
+ field .writeSet (writer , beanVarName );
88
+ }
75
89
}
76
90
writer .eol ();
77
91
}
78
92
93
+ private Set <String > writeConstructorParams (Append writer ) {
94
+ Set <String > paramsUsed = new HashSet <>();
95
+ if (constructors .size () == 1 ) {
96
+ int count = 0 ;
97
+ for (VariableElement parameter : constructors .get (0 ).getParameters ()) {
98
+ final String paramName = parameter .getSimpleName ().toString ();
99
+ final FieldReader field = fieldMap .get (paramName );
100
+ if (field != null ) {
101
+ if (count ++ > 0 ) {
102
+ writer .append (", " );
103
+ }
104
+ writer .eol ().append (" " );
105
+ field .writeConstructorParam (writer );
106
+ paramsUsed .add (paramName );
107
+ }
108
+ }
109
+ if (count > 0 ) {
110
+ writer .eol ().append (" " );
111
+ }
112
+ }
113
+ return paramsUsed ;
114
+ }
115
+
79
116
static class FieldReader {
80
117
81
118
private final ElementReader element ;
82
119
83
120
private String setterMethod ;
84
121
122
+ private boolean constructorParam ;
123
+
85
124
FieldReader (ProcessingContext ctx , Element enclosedElement , ParamType defaultParamType ) {
86
125
this .element = new ElementReader (enclosedElement , ctx , defaultParamType , false );
87
126
}
@@ -95,13 +134,25 @@ public String toString() {
95
134
return element .toString ();
96
135
}
97
136
137
+ void writeConstructorParam (Append writer ) {
138
+ // populate in constructor
139
+ constructorParam = true ;
140
+ element .setValue (writer );
141
+ }
142
+
143
+ boolean isConstructorParam () {
144
+ return constructorParam ;
145
+ }
146
+
98
147
void writeSet (Append writer , String beanVarName ) {
99
148
if (setterMethod != null ) {
149
+ // populate via setter method
100
150
writer .append (" %s.%s(" , beanVarName , setterMethod );
101
151
element .setValue (writer );
102
152
writer .append (");" ).eol ();
103
153
104
154
} else {
155
+ // populate via field put
105
156
writer .append (" %s.%s = " , beanVarName , getVarName ());
106
157
element .setValue (writer );
107
158
writer .append (";" ).eol ();
@@ -113,5 +164,4 @@ void setUseSetter(String setterMethod) {
113
164
}
114
165
}
115
166
116
-
117
167
}
0 commit comments