2929import javax .lang .model .element .ExecutableElement ;
3030import javax .lang .model .element .TypeElement ;
3131import javax .lang .model .element .VariableElement ;
32+ import javax .lang .model .type .DeclaredType ;
3233import javax .lang .model .type .TypeKind ;
34+ import javax .lang .model .type .TypeMirror ;
3335import javax .lang .model .util .ElementKindVisitor6 ;
3436import javax .lang .model .util .Elements ;
3537import javax .lang .model .util .Types ;
@@ -91,18 +93,34 @@ private void writeModelToSourceFile(String fileName, Mapper model) {
9193 }
9294
9395 private Mapper retrieveModel (TypeElement element ) {
94- List <Method > methods = retrieveMethods ( element );
95- Set <Method > processedMethods = new HashSet <Method >();
96- List <BeanMapping > mappings = new ArrayList <BeanMapping >();
96+ List <Method > methods = retrieveMethods ( null , element );
97+ List <BeanMapping > mappings = getMappings ( methods );
98+ List <Type > usedMapperTypes = getUsedMapperTypes ( element );
99+
100+ Mapper mapper = new Mapper (
101+ elementUtils .getPackageOf ( element ).getQualifiedName ().toString (),
102+ element .getSimpleName ().toString (),
103+ element .getSimpleName () + IMPLEMENTATION_SUFFIX ,
104+ mappings ,
105+ usedMapperTypes
106+ );
97107
108+ return mapper ;
109+ }
110+
111+ private List <BeanMapping > getMappings (List <Method > methods ) {
98112 Conversions conversions = new Conversions ( elementUtils , typeUtils , typeUtil );
99113
114+ List <BeanMapping > mappings = new ArrayList <BeanMapping >();
115+ Set <Method > processedMethods = new HashSet <Method >();
116+
100117 for ( Method method : methods ) {
101118 if ( processedMethods .contains ( method ) ) {
102119 continue ;
103120 }
104121
105122 MappingMethod mappingMethod = new MappingMethod (
123+ method .getDeclaringMapper (),
106124 method .getName (),
107125 method .getParameterName (),
108126 getElementMappingMethod ( methods , method )
@@ -114,6 +132,7 @@ private Mapper retrieveModel(TypeElement element) {
114132 processedMethods .add ( rawReverseMappingMethod );
115133
116134 reverseMappingMethod = new MappingMethod (
135+ rawReverseMappingMethod .getDeclaringMapper (),
117136 rawReverseMappingMethod .getName (),
118137 rawReverseMappingMethod .getParameterName (),
119138 getElementMappingMethod ( methods , rawReverseMappingMethod )
@@ -134,12 +153,13 @@ private Mapper retrieveModel(TypeElement element) {
134153 property .getSourceType (),
135154 property .getTargetName (),
136155 property .getTargetType (),
137- property .getConverterType (),
138156 propertyMappingMethod != null ? new MappingMethod (
157+ propertyMappingMethod .getDeclaringMapper (),
139158 propertyMappingMethod .getName (),
140159 propertyMappingMethod .getParameterName ()
141160 ) : null ,
142161 reversePropertyMappingMethod != null ? new MappingMethod (
162+ reversePropertyMappingMethod .getDeclaringMapper (),
143163 reversePropertyMappingMethod .getName (),
144164 reversePropertyMappingMethod .getParameterName ()
145165 ) : null ,
@@ -168,15 +188,16 @@ private Mapper retrieveModel(TypeElement element) {
168188
169189 mappings .add ( mapping );
170190 }
191+ return mappings ;
192+ }
171193
172- Mapper mapper = new Mapper (
173- elementUtils .getPackageOf ( element ).getQualifiedName ().toString (),
174- element .getSimpleName ().toString (),
175- element .getSimpleName () + IMPLEMENTATION_SUFFIX ,
176- mappings
177- );
178-
179- return mapper ;
194+ private List <Type > getUsedMapperTypes (TypeElement element ) {
195+ List <Type > usedMapperTypes = new LinkedList <Type >();
196+ MapperPrism mapperPrism = MapperPrism .getInstanceOn ( element );
197+ for ( TypeMirror usedMapper : mapperPrism .uses () ) {
198+ usedMapperTypes .add ( typeUtil .retrieveType ( usedMapper ) );
199+ }
200+ return usedMapperTypes ;
180201 }
181202
182203 private String getAccessor (String name ) {
@@ -196,6 +217,7 @@ private MappingMethod getElementMappingMethod(Iterable<Method> methods, Method m
196217 }
197218 }
198219 return elementMappingMethod == null ? null : new MappingMethod (
220+ elementMappingMethod .getDeclaringMapper (),
199221 elementMappingMethod .getName (),
200222 elementMappingMethod .getParameterName ()
201223 );
@@ -231,7 +253,7 @@ private Method getReverseMappingMethod(List<Method> rawMethods,
231253 return null ;
232254 }
233255
234- private List <Method > retrieveMethods (TypeElement element ) {
256+ private List <Method > retrieveMethods (Type declaringMapper , Element element ) {
235257 List <Method > methods = new ArrayList <Method >();
236258
237259 for ( ExecutableElement method : methodsIn ( element .getEnclosedElements () ) ) {
@@ -241,6 +263,7 @@ private List<Method> retrieveMethods(TypeElement element) {
241263
242264 methods .add (
243265 new Method (
266+ declaringMapper ,
244267 method .getSimpleName ().toString (),
245268 parameter .getName (),
246269 parameter .getType (),
@@ -250,6 +273,21 @@ private List<Method> retrieveMethods(TypeElement element) {
250273 );
251274 }
252275
276+ List <Type > usedMapperTypes = new LinkedList <Type >();
277+ MapperPrism mapperPrism = MapperPrism .getInstanceOn ( element );
278+
279+ if ( mapperPrism != null ) {
280+ for ( TypeMirror usedMapper : mapperPrism .uses () ) {
281+ methods .addAll (
282+ retrieveMethods (
283+ typeUtil .retrieveType ( usedMapper ),
284+ ( (DeclaredType ) usedMapper ).asElement ()
285+ )
286+ );
287+ }
288+ }
289+
290+
253291 return methods ;
254292 }
255293
@@ -291,8 +329,7 @@ private List<MappedProperty> getMappedProperties(ExecutableElement method, Map<S
291329 sourcePropertyName ,
292330 retrieveReturnType ( getterMethod ),
293331 mapping != null ? mapping .getTargetName () : targetPropertyName ,
294- retrieveParameter ( setterMethod ).getType (),
295- mapping != null ? mapping .getConverterType () : null
332+ retrieveParameter ( setterMethod ).getType ()
296333 )
297334 );
298335 }
@@ -320,12 +357,7 @@ private Map<String, Mapping> getMappings(MappingsPrism mappingsAnnotation) {
320357 }
321358
322359 private Mapping getMapping (MappingPrism mapping ) {
323- Type converterType = typeUtil .retrieveType ( mapping .converter () );
324- return new Mapping (
325- mapping .source (),
326- mapping .target (),
327- converterType .getName ().equals ( "NoOpConverter" ) ? null : converterType
328- );
360+ return new Mapping ( mapping .source (), mapping .target () );
329361 }
330362
331363 private Parameter retrieveParameter (ExecutableElement method ) {
0 commit comments