11package io .dinject .javalin .generator ;
22
33import javax .lang .model .element .Element ;
4+ import javax .lang .model .element .ExecutableElement ;
45import javax .lang .model .element .TypeElement ;
6+ import javax .lang .model .element .VariableElement ;
7+ import java .util .ArrayList ;
58import java .util .HashSet ;
69import java .util .LinkedHashMap ;
710import java .util .List ;
@@ -21,6 +24,8 @@ class BeanParamReader {
2124
2225 private final Map <String , FieldReader > fieldMap = new LinkedHashMap <>();
2326
27+ private final List <ExecutableElement > constructors = new ArrayList <>();
28+
2429 BeanParamReader (ProcessingContext ctx , TypeElement beanType , String beanVarName , String beanShortType , ParamType defaultParamType ) {
2530 this .ctx = ctx ;
2631 this .beanType = beanType ;
@@ -35,6 +40,9 @@ private void read() {
3540
3641 for (Element enclosedElement : beanType .getEnclosedElements ()) {
3742 switch (enclosedElement .getKind ()) {
43+ case CONSTRUCTOR :
44+ constructors .add ((ExecutableElement ) enclosedElement );
45+ break ;
3846 case METHOD :
3947 readMethod (enclosedElement );
4048 break ;
@@ -60,28 +68,59 @@ private void readMethod(Element enclosedElement) {
6068
6169 void write (Append writer ) {
6270
63- writer .append (" new %s();" , beanShortType ).eol ();
71+ writer .append (" new %s(" , beanShortType );
72+ final Set <String > constructorParams = writeConstructorParams (writer );
73+ writer .append (");" ).eol ();
6474
6575 for (String setterMethod : setterMethods ) {
6676 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+ }
7082 }
7183 }
7284
7385 for (FieldReader field : fieldMap .values ()) {
74- field .writeSet (writer , beanVarName );
86+ if (!field .isConstructorParam ()) {
87+ field .writeSet (writer , beanVarName );
88+ }
7589 }
7690 writer .eol ();
7791 }
7892
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+
79116 static class FieldReader {
80117
81118 private final ElementReader element ;
82119
83120 private String setterMethod ;
84121
122+ private boolean constructorParam ;
123+
85124 FieldReader (ProcessingContext ctx , Element enclosedElement , ParamType defaultParamType ) {
86125 this .element = new ElementReader (enclosedElement , ctx , defaultParamType , false );
87126 }
@@ -95,13 +134,25 @@ public String toString() {
95134 return element .toString ();
96135 }
97136
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+
98147 void writeSet (Append writer , String beanVarName ) {
99148 if (setterMethod != null ) {
149+ // populate via setter method
100150 writer .append (" %s.%s(" , beanVarName , setterMethod );
101151 element .setValue (writer );
102152 writer .append (");" ).eol ();
103153
104154 } else {
155+ // populate via field put
105156 writer .append (" %s.%s = " , beanVarName , getVarName ());
106157 element .setValue (writer );
107158 writer .append (";" ).eol ();
@@ -113,5 +164,4 @@ void setUseSetter(String setterMethod) {
113164 }
114165 }
115166
116-
117167}
0 commit comments