diff --git a/processor/src/main/java/org/mapstruct/ap/model/PropertyMapping.java b/processor/src/main/java/org/mapstruct/ap/model/PropertyMapping.java index adb8c4a83..10c151b55 100644 --- a/processor/src/main/java/org/mapstruct/ap/model/PropertyMapping.java +++ b/processor/src/main/java/org/mapstruct/ap/model/PropertyMapping.java @@ -18,13 +18,11 @@ */ package org.mapstruct.ap.model; -import java.util.HashSet; import java.util.Set; import org.mapstruct.ap.model.common.ModelElement; import org.mapstruct.ap.model.common.Type; -import static org.mapstruct.ap.model.Assignment.AssignmentType.DIRECT; /** * Represents the mapping between a source and target property, e.g. from @@ -76,16 +74,7 @@ public class PropertyMapping extends ModelElement { @Override public Set getImportTypes() { - Set importTypes = new HashSet(); - if ( assignment.getType() == DIRECT ) { - if ( targetType.isCollectionOrMapType() ) { - importTypes.addAll( targetType.getImportTypes() ); - } - } - else { - importTypes.addAll( assignment.getImportTypes() ); - } - return importTypes; + return assignment.getImportTypes(); } @Override diff --git a/processor/src/main/java/org/mapstruct/ap/model/assignment/NewCollectionOrMapWrapper.java b/processor/src/main/java/org/mapstruct/ap/model/assignment/NewCollectionOrMapWrapper.java index 030db25d9..6aa149473 100644 --- a/processor/src/main/java/org/mapstruct/ap/model/assignment/NewCollectionOrMapWrapper.java +++ b/processor/src/main/java/org/mapstruct/ap/model/assignment/NewCollectionOrMapWrapper.java @@ -18,7 +18,10 @@ */ package org.mapstruct.ap.model.assignment; +import java.util.HashSet; +import java.util.Set; import org.mapstruct.ap.model.Assignment; +import org.mapstruct.ap.model.common.Type; /** * Decorates the assignment as a Map or Collection constructor @@ -27,7 +30,18 @@ import org.mapstruct.ap.model.Assignment; */ public class NewCollectionOrMapWrapper extends AssignmentWrapper { - public NewCollectionOrMapWrapper( Assignment decoratedAssignment ) { + private final Set implementationTypes; + + public NewCollectionOrMapWrapper( Assignment decoratedAssignment, Set implementationTypes ) { super( decoratedAssignment ); + this.implementationTypes = implementationTypes; + } + + @Override + public Set getImportTypes() { + Set imported = new HashSet(); + imported.addAll( getAssignment().getImportTypes() ); + imported.addAll( implementationTypes ); + return imported; } } diff --git a/processor/src/main/java/org/mapstruct/ap/model/assignment/SetterCollectionOrMapWrapper.java b/processor/src/main/java/org/mapstruct/ap/model/assignment/SetterCollectionOrMapWrapper.java index facf42fc4..f3f23d571 100644 --- a/processor/src/main/java/org/mapstruct/ap/model/assignment/SetterCollectionOrMapWrapper.java +++ b/processor/src/main/java/org/mapstruct/ap/model/assignment/SetterCollectionOrMapWrapper.java @@ -18,7 +18,10 @@ */ package org.mapstruct.ap.model.assignment; +import java.util.HashSet; +import java.util.Set; import org.mapstruct.ap.model.Assignment; +import org.mapstruct.ap.model.common.Type; /** * This wrapper handles the situation were an assignment is done via the setter. @@ -35,14 +38,31 @@ import org.mapstruct.ap.model.Assignment; public class SetterCollectionOrMapWrapper extends AssignmentWrapper { private final String targetGetterName; + private final Assignment newCollectionOrMapAssignment; - public SetterCollectionOrMapWrapper( Assignment decoratedAssignment, String targetSetterName ) { + public SetterCollectionOrMapWrapper( Assignment decoratedAssignment, + String targetSetterName, + Assignment newCollectionOrMapAssignment ) { super( decoratedAssignment ); this.targetGetterName = "get" + targetSetterName.substring( 3 ); + this.newCollectionOrMapAssignment = newCollectionOrMapAssignment; } public String getTargetGetterName() { return targetGetterName; } + public Assignment getNewCollectionOrMapAssignment() { + return newCollectionOrMapAssignment; + } + + @Override + public Set getImportTypes() { + Set imported = new HashSet(); + imported.addAll( getAssignment().getImportTypes() ); + if ( newCollectionOrMapAssignment != null ) { + imported.addAll( newCollectionOrMapAssignment.getImportTypes() ); + } + return imported; + } } 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 7a558128a..a007391cd 100644 --- a/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java +++ b/processor/src/main/java/org/mapstruct/ap/processor/MapperCreationProcessor.java @@ -759,26 +759,32 @@ public class MapperCreationProcessor implements ModelElementProcessor } else { - <@includeModel object=assignment - targetBeanName=ext.targetBeanName - raw=ext.raw - existingInstanceMapping=ext.existingInstanceMapping - targetAccessorName=ext.targetAccessorName - targetType=ext.targetType/> + <#if newCollectionOrMapAssignment??> + <@_newCollectionOrMapAssignment/> + <#else> + <@_assignment/> + } <#else> + <#if newCollectionOrMapAssignment??> + <@_newCollectionOrMapAssignment/> + <#else> + <@_assignment/> + + +<#macro _assignment> <@includeModel object=assignment targetBeanName=ext.targetBeanName raw=ext.raw existingInstanceMapping=ext.existingInstanceMapping targetAccessorName=ext.targetAccessorName targetType=ext.targetType/> - \ No newline at end of file + +<#macro _newCollectionOrMapAssignment> + <@includeModel object=newCollectionOrMapAssignment + targetBeanName=ext.targetBeanName + raw=ext.raw + existingInstanceMapping=ext.existingInstanceMapping + targetAccessorName=ext.targetAccessorName + targetType=ext.targetType/> + \ No newline at end of file