From 6531d995b0126b44cba04fc817dca8984b59d9c5 Mon Sep 17 00:00:00 2001 From: sjaakd Date: Sat, 15 Feb 2014 17:15:56 +0100 Subject: [PATCH] #120 reintroducing lost generics selection check and making sure MapperCreationProcessor state is cleared. --- .../ap/conversion/methods/BuildInMethod.java | 5 +++++ .../ap/conversion/methods/BuildInMethods.java | 21 +++++++++++-------- .../conversion/methods/JaxbElemToValue.java | 8 +++++++ .../ap/processor/MapperCreationProcessor.java | 7 +++++-- 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/processor/src/main/java/org/mapstruct/ap/conversion/methods/BuildInMethod.java b/processor/src/main/java/org/mapstruct/ap/conversion/methods/BuildInMethod.java index bd0822fd7..51ac532c4 100644 --- a/processor/src/main/java/org/mapstruct/ap/conversion/methods/BuildInMethod.java +++ b/processor/src/main/java/org/mapstruct/ap/conversion/methods/BuildInMethod.java @@ -21,6 +21,7 @@ package org.mapstruct.ap.conversion.methods; import org.mapstruct.ap.conversion.ConversionProvider; import org.mapstruct.ap.model.MethodReference; import org.mapstruct.ap.model.common.ModelElement; +import org.mapstruct.ap.model.common.Type; /** * Implementations create: @@ -74,5 +75,9 @@ public abstract class BuildInMethod extends ModelElement { return ( getClass() == obj.getClass() ); } + boolean doGenericsMatch( Type sourceType, Type targetType ) { + return true; + } + } diff --git a/processor/src/main/java/org/mapstruct/ap/conversion/methods/BuildInMethods.java b/processor/src/main/java/org/mapstruct/ap/conversion/methods/BuildInMethods.java index 21e354d7d..174a334b7 100644 --- a/processor/src/main/java/org/mapstruct/ap/conversion/methods/BuildInMethods.java +++ b/processor/src/main/java/org/mapstruct/ap/conversion/methods/BuildInMethods.java @@ -61,15 +61,18 @@ public class BuildInMethods { int bestMatchingTargetTypeDistance = Integer.MAX_VALUE; for ( Map.Entry entry : conversionMethods.entrySet() ) { - if ( targetType.isAssignableTo( entry.getKey().targetType ) - && sourceType.erasure().equals( entry.getKey().sourceType.erasure() ) ) { - int sourceTypeDistance = targetType.distanceTo( entry.getKey().targetType ); - bestMatchingTargetTypeDistance - = addToCandidateListIfMinimal( - candidateKeys, - bestMatchingTargetTypeDistance, - entry.getKey(), - sourceTypeDistance ); + if ( targetType.erasure().isAssignableTo( entry.getKey().targetType.erasure() ) + && sourceType.erasure().isAssignableTo( entry.getKey().sourceType.erasure() ) ) { + + if ( entry.getValue().doGenericsMatch( sourceType, targetType ) ) { + int sourceTypeDistance = targetType.distanceTo( entry.getKey().targetType ); + bestMatchingTargetTypeDistance + = addToCandidateListIfMinimal( + candidateKeys, + bestMatchingTargetTypeDistance, + entry.getKey(), + sourceTypeDistance); + } } } diff --git a/processor/src/main/java/org/mapstruct/ap/conversion/methods/JaxbElemToValue.java b/processor/src/main/java/org/mapstruct/ap/conversion/methods/JaxbElemToValue.java index fb1984202..0dad19f73 100644 --- a/processor/src/main/java/org/mapstruct/ap/conversion/methods/JaxbElemToValue.java +++ b/processor/src/main/java/org/mapstruct/ap/conversion/methods/JaxbElemToValue.java @@ -61,4 +61,12 @@ public class JaxbElemToValue extends BuildInMethod { return asSet( typeFactory.getType( JAXB_TYPE ) ); } + @Override + public boolean doGenericsMatch(Type sourceType, Type targetType) { + boolean match = false; + if (sourceType.getTypeParameters().size() == 1) { + match = sourceType.getTypeParameters().get( 0 ).equals( targetType ); + } + return match; + } } diff --git a/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java b/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java index 51e7e22c6..d54257616 100644 --- a/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java +++ b/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java @@ -113,15 +113,18 @@ public class MapperCreationProcessor implements ModelElementProcessor mapperReferences = getReferencedMappers( element ); List mappingMethods = getMappingMethods( mapperReferences, methods, unmappedTargetPolicy ); - return new Mapper.Builder() + Mapper mapper = new Mapper.Builder() .element( element ) .mappingMethods( mappingMethods ) .mapperReferences( mapperReferences ) .suppressGeneratorTimestamp( options.isSuppressGeneratorTimestamp() ) .typeFactory( typeFactory ) .elementUtils( elementUtils ) - .buildInMethods( usedBuildInMethods ) + .buildInMethods( new HashSet( usedBuildInMethods ) ) .build(); + + usedBuildInMethods.clear(); + return mapper; } /**