22
33import com .squareup .javapoet .ClassName ;
44import com .squareup .javapoet .MethodSpec ;
5+ import com .squareup .javapoet .ParameterSpec ;
6+ import com .squareup .javapoet .TypeName ;
57import com .squareup .javapoet .TypeSpec ;
68
79import java .util .ArrayList ;
@@ -34,11 +36,13 @@ static MapperGenerator create(TypeElement element, ProcessingEnvironment env) {
3436 private final TypeElement element ;
3537 private final ProcessingEnvironment processingEnv ;
3638 private List <MappingInfo > mappings ;
39+ private List <MappingInfo > autoMappings ;
3740
3841 private MapperGenerator (TypeElement mapperElement , ProcessingEnvironment processingEnvironment ) {
3942 this .processingEnv = processingEnvironment ;
4043 this .element = mapperElement ;
4144 mappings = new ArrayList <>();
45+ autoMappings = new ArrayList <>();
4246 }
4347
4448 public TypeSpec generate () {
@@ -53,6 +57,12 @@ public TypeSpec generate() {
5357 implBuilder .addMethod (methodSpec );
5458 }
5559
60+ for (MappingInfo autoMapping : autoMappings ) {
61+ MethodSpec methodSpec = generateMappingMethod (autoMapping );
62+ implBuilder .addMethod (methodSpec );
63+ }
64+
65+
5666 return implBuilder .build ();
5767 }
5868
@@ -77,7 +87,8 @@ private MethodSpec generateMappingMethod(MappingInfo mapping) {
7787 processingEnv .getMessager ().printMessage (Diagnostic .Kind .MANDATORY_WARNING , "Target constructor have different arguments count" , mapping .getMethod ());
7888 }
7989
80- MethodSpec .Builder methodBuilder = MethodSpec .overriding (mapping .getMethod ());
90+
91+ MethodSpec .Builder methodBuilder = createMethodBuilder (mapping );
8192 StringBuilder statementBuilder = new StringBuilder ();
8293 statementBuilder
8394 .append ("return new " )
@@ -86,19 +97,7 @@ private MethodSpec generateMappingMethod(MappingInfo mapping) {
8697
8798 String separator = "" ;
8899 for (VariableElement constructorParameter : constructorParameters ) {
89- String sourceFieldName = constructorParameter .getSimpleName ().toString ().toLowerCase ();
90- com .devindi .mapper .Mapping annotation = mapping .getMethod ().getAnnotation (com .devindi .mapper .Mapping .class );
91- if (annotation != null && annotation .target ().toLowerCase ().equals (constructorParameter .getSimpleName ().toString ().toLowerCase ())) {
92- sourceFieldName = annotation .source ();
93- }
94- Mappings mappings = mapping .getMethod ().getAnnotation (Mappings .class );
95- if (mappings != null ) {
96- for (com .devindi .mapper .Mapping fieldMapping : mappings .value ()) {
97- if (fieldMapping != null && fieldMapping .target ().toLowerCase ().equals (constructorParameter .getSimpleName ().toString ().toLowerCase ())) {
98- sourceFieldName = fieldMapping .source ();
99- }
100- }
101- }
100+ String sourceFieldName = mapping .getSourceFieldName (constructorParameter .getSimpleName ().toString ().toLowerCase ());
102101 ExecutableElement getter = argumentGetters .get (sourceFieldName .toLowerCase ());
103102 if (getter == null ) {
104103 processingEnv .getMessager ().printMessage (Diagnostic .Kind .ERROR , "Failed to find getter at source for target field" , constructorParameter );
@@ -108,27 +107,26 @@ private MethodSpec generateMappingMethod(MappingInfo mapping) {
108107 //getter and constructor parameter have different types
109108 MappingInfo depMapping = findMapping (getter .getReturnType (), constructorParameter .asType ());
110109 if (depMapping == null ) {
111- // TODO: 06.09.17 generate method
112- processingEnv .getMessager ().printMessage (Diagnostic .Kind .ERROR , "Getter return type and constructor argument type are different" , mapping .getMethod ());
113- } else {
114- statementBuilder
115- .append (separator )
116- .append ('\n' )
117- .append ("this." )
118- .append (depMapping .getMethod ().getSimpleName ())
119- .append ("(" )
120- .append (mapping .getMethod ().getParameters ().get (0 ).getSimpleName ())
121- .append ("." )
122- .append (getter .getSimpleName ())
123- .append ("()" )
124- .append (")" );
125- separator = "," ;
110+ depMapping = new MappingInfo (getter .getReturnType (), constructorParameter .asType ());
111+ autoMappings .add (depMapping );
126112 }
113+ statementBuilder
114+ .append (separator )
115+ .append ('\n' )
116+ .append ("this." )
117+ .append (depMapping .getMethodName ())
118+ .append ("(" )
119+ .append (mapping .getSourceName ())
120+ .append ("." )
121+ .append (getter .getSimpleName ())
122+ .append ("()" )
123+ .append (")" );
124+ separator = "," ;
127125 } else {
128126 statementBuilder
129127 .append (separator )
130128 .append ('\n' )
131- .append (mapping .getMethod (). getParameters (). get ( 0 ). getSimpleName ())
129+ .append (mapping .getSourceName ())
132130 .append ("." )
133131 .append (getter .getSimpleName ())
134132 .append ("()" );
@@ -141,8 +139,6 @@ private MethodSpec generateMappingMethod(MappingInfo mapping) {
141139 .append (")" );
142140 methodBuilder .addStatement (statementBuilder .toString ());
143141
144-
145-
146142 return methodBuilder .build ();
147143 }
148144
@@ -175,7 +171,15 @@ private MappingInfo findMapping(TypeMirror source, TypeMirror target) {
175171 return null ;
176172 }
177173
178- private MappingInfo generateMapping (TypeMirror source , TypeMirror target ) {
179- return null ;
174+ private MethodSpec .Builder createMethodBuilder (MappingInfo info ) {
175+ ExecutableElement method = info .getMethod ();
176+ if (method == null ) {
177+ MethodSpec .Builder builder = MethodSpec .methodBuilder (info .getMethodName ().toString ());
178+ builder .addModifiers (Modifier .PRIVATE );
179+ builder .returns (TypeName .get (info .getTargetType ()));
180+ builder .addParameter (ParameterSpec .builder (TypeName .get (info .getSourceType ()), "source" ).build ());
181+ return builder ;
182+ }
183+ return MethodSpec .overriding (method );
180184 }
181185}
0 commit comments