Skip to content
This repository was archived by the owner on Jun 11, 2023. It is now read-only.

Commit 7cd2c71

Browse files
committed
<feature/nested_field> Refactored generator
1 parent 01d59b2 commit 7cd2c71

File tree

2 files changed

+75
-40
lines changed

2 files changed

+75
-40
lines changed

processor/src/main/java/com/devindi/mapper/MapperGenerator.java

Lines changed: 22 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@
1616
import javax.lang.model.element.Modifier;
1717
import javax.lang.model.element.TypeElement;
1818
import javax.lang.model.element.VariableElement;
19-
import javax.lang.model.type.TypeKind;
2019
import javax.lang.model.type.TypeMirror;
2120
import javax.lang.model.util.ElementFilter;
2221
import javax.tools.Diagnostic;
@@ -34,7 +33,7 @@ static MapperGenerator create(TypeElement element, ProcessingEnvironment env) {
3433

3534
private final TypeElement element;
3635
private final ProcessingEnvironment processingEnv;
37-
private List<Mapping> mappings;
36+
private List<MappingInfo> mappings;
3837

3938
private MapperGenerator(TypeElement mapperElement, ProcessingEnvironment processingEnvironment) {
4039
this.processingEnv = processingEnvironment;
@@ -49,7 +48,7 @@ public TypeSpec generate() {
4948
.addModifiers(Modifier.PUBLIC)
5049
.addSuperinterface(ClassName.get(element));
5150

52-
for (Mapping mapping : mappings) {
51+
for (MappingInfo mapping : mappings) {
5352
MethodSpec methodSpec = generateMappingMethod(mapping);
5453
implBuilder.addMethod(methodSpec);
5554
}
@@ -60,39 +59,39 @@ public TypeSpec generate() {
6059
private void collectMappings() {
6160
for (ExecutableElement method : ElementFilter.methodsIn(element.getEnclosedElements())) {
6261
try {
63-
mappings.add(new Mapping(method));
62+
mappings.add(new MappingInfo(method));
6463
} catch (IllegalArgumentException exc) {
6564
processingEnv.getMessager().printMessage(Diagnostic.Kind.WARNING, exc.getMessage(), method);
6665
}
6766
}
6867
}
6968

70-
private MethodSpec generateMappingMethod(Mapping mapping) {
71-
ExecutableElement constructorElement = getConstructorElement(mapping.target.toString());
69+
private MethodSpec generateMappingMethod(MappingInfo mapping) {
70+
ExecutableElement constructorElement = getConstructorElement(mapping.getTargetType().toString());
7271
List<? extends VariableElement> constructorParameters = constructorElement.getParameters();
7372

74-
Map<String, ExecutableElement> argumentGetters = getGetters(mapping.source.toString());
73+
Map<String, ExecutableElement> argumentGetters = getGetters(mapping.getSourceType().toString());
7574

7675

7776
if (constructorParameters.size() != argumentGetters.size()) {
78-
processingEnv.getMessager().printMessage(Diagnostic.Kind.MANDATORY_WARNING, "Target constructor have different arguments count", mapping.method);
77+
processingEnv.getMessager().printMessage(Diagnostic.Kind.MANDATORY_WARNING, "Target constructor have different arguments count", mapping.getMethod());
7978
}
8079

81-
MethodSpec.Builder methodBuilder = MethodSpec.overriding(mapping.method);
80+
MethodSpec.Builder methodBuilder = MethodSpec.overriding(mapping.getMethod());
8281
StringBuilder statementBuilder = new StringBuilder();
8382
statementBuilder
8483
.append("return new ")
85-
.append(mapping.target.toString())
84+
.append(mapping.getTargetType().toString())
8685
.append("(");
8786

8887
String separator = "";
8988
for (VariableElement constructorParameter : constructorParameters) {
9089
String sourceFieldName = constructorParameter.getSimpleName().toString().toLowerCase();
91-
com.devindi.mapper.Mapping annotation = mapping.method.getAnnotation(com.devindi.mapper.Mapping.class);
90+
com.devindi.mapper.Mapping annotation = mapping.getMethod().getAnnotation(com.devindi.mapper.Mapping.class);
9291
if (annotation != null && annotation.target().toLowerCase().equals(constructorParameter.getSimpleName().toString().toLowerCase())) {
9392
sourceFieldName = annotation.source();
9493
}
95-
Mappings mappings = mapping.method.getAnnotation(Mappings.class);
94+
Mappings mappings = mapping.getMethod().getAnnotation(Mappings.class);
9695
if (mappings != null) {
9796
for (com.devindi.mapper.Mapping fieldMapping : mappings.value()) {
9897
if (fieldMapping != null && fieldMapping.target().toLowerCase().equals(constructorParameter.getSimpleName().toString().toLowerCase())) {
@@ -107,18 +106,18 @@ private MethodSpec generateMappingMethod(Mapping mapping) {
107106
}
108107
if (!constructorParameter.asType().equals(getter.getReturnType())) {
109108
//getter and constructor parameter have different types
110-
// TODO: 01.09.17 try to map/convert source field to target field
111-
Mapping depMapping = findMapping(getter.getReturnType(), constructorParameter.asType());
109+
MappingInfo depMapping = findMapping(getter.getReturnType(), constructorParameter.asType());
112110
if (depMapping == null) {
113-
processingEnv.getMessager().printMessage(Diagnostic.Kind.ERROR, "Getter return type and constructor argument type are different", mapping.method);
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());
114113
} else {
115114
statementBuilder
116115
.append(separator)
117116
.append('\n')
118117
.append("this.")
119-
.append(depMapping.method.getSimpleName())
118+
.append(depMapping.getMethod().getSimpleName())
120119
.append("(")
121-
.append(mapping.method.getParameters().get(0).getSimpleName())
120+
.append(mapping.getMethod().getParameters().get(0).getSimpleName())
122121
.append(".")
123122
.append(getter.getSimpleName())
124123
.append("()")
@@ -129,7 +128,7 @@ private MethodSpec generateMappingMethod(Mapping mapping) {
129128
statementBuilder
130129
.append(separator)
131130
.append('\n')
132-
.append(mapping.method.getParameters().get(0).getSimpleName())
131+
.append(mapping.getMethod().getParameters().get(0).getSimpleName())
133132
.append(".")
134133
.append(getter.getSimpleName())
135134
.append("()");
@@ -167,33 +166,16 @@ private Map<String, ExecutableElement> getGetters(String className) {
167166
return gettersMap;
168167
}
169168

170-
private Mapping findMapping(TypeMirror source, TypeMirror target) {
171-
for (Mapping mapping : mappings) {
172-
if (mapping.source.equals(source) && mapping.target.equals(target)) {
169+
private MappingInfo findMapping(TypeMirror source, TypeMirror target) {
170+
for (MappingInfo mapping : mappings) {
171+
if (mapping.getSourceType().equals(source) && mapping.getTargetType().equals(target)) {
173172
return mapping;
174173
}
175174
}
176175
return null;
177176
}
178177

179-
private static class Mapping {
180-
private final TypeMirror source;
181-
private final TypeMirror target;
182-
private final ExecutableElement method;
183-
184-
public Mapping(ExecutableElement method) {
185-
this.method = method;
186-
target = method.getReturnType();
187-
if (target.getKind().equals(TypeKind.VOID)) {
188-
throw new IllegalArgumentException("Mapper method should return value. Method will be ignored");
189-
}
190-
List<? extends VariableElement> parameters = method.getParameters();
191-
if (parameters.size() != 1) {
192-
throw new IllegalArgumentException("Mapper method should have only 1 parameter. Method will be ignored");
193-
}
194-
source = parameters.get(0).asType();
195-
}
178+
private MappingInfo generateMapping(TypeMirror source, TypeMirror target) {
179+
return null;
196180
}
197-
198-
199181
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package com.devindi.mapper;
2+
3+
import java.util.List;
4+
5+
import javax.lang.model.element.ExecutableElement;
6+
import javax.lang.model.element.Name;
7+
import javax.lang.model.element.VariableElement;
8+
import javax.lang.model.type.TypeKind;
9+
import javax.lang.model.type.TypeMirror;
10+
11+
public class MappingInfo {
12+
13+
private final TypeMirror sourceType;
14+
private final TypeMirror targetType;
15+
private final ExecutableElement method;
16+
private final Name sourceName;
17+
private final Name mappingName;
18+
19+
public MappingInfo(ExecutableElement method) {
20+
targetType = method.getReturnType();
21+
if (targetType.getKind().equals(TypeKind.VOID)) {
22+
throw new IllegalArgumentException("Mapper method should return value. Method will be ignored");
23+
}
24+
List<? extends VariableElement> parameters = method.getParameters();
25+
if (parameters.size() != 1) {
26+
throw new IllegalArgumentException("Mapper method should have only 1 parameter. Method will be ignored");
27+
}
28+
sourceType = parameters.get(0).asType();
29+
sourceName = parameters.get(0).getSimpleName();
30+
mappingName = method.getSimpleName();
31+
this.method = method;
32+
}
33+
34+
public TypeMirror getSourceType() {
35+
return sourceType;
36+
}
37+
38+
public TypeMirror getTargetType() {
39+
return targetType;
40+
}
41+
42+
public Name getSourceName() {
43+
return sourceName;
44+
}
45+
46+
public Name getMappingName() {
47+
return mappingName;
48+
}
49+
50+
public ExecutableElement getMethod() {
51+
return method;
52+
}
53+
}

0 commit comments

Comments
 (0)