From bf31ec72de38bd5b59f357525e40e665192723ae Mon Sep 17 00:00:00 2001 From: Filip Hrisafov Date: Fri, 4 May 2018 08:09:37 +0200 Subject: [PATCH] #1338 Using an adder with non generic source collection should work --- .../ap/internal/model/assignment/AdderWrapper.java | 11 ++++++++++- .../ap/internal/model/common/SourceRHS.java | 5 ++++- .../ap/internal/model/assignment/AdderWrapper.ftl | 2 +- .../ap/test/bugs/_1338/Issue1338Mapper.java | 2 ++ .../ap/test/bugs/_1338/Issue1338Test.java | 8 +++++++- .../org/mapstruct/ap/test/bugs/_1338/Source.java | 14 +++++++++++--- .../org/mapstruct/ap/test/bugs/_1338/Target.java | 4 ++++ 7 files changed, 39 insertions(+), 7 deletions(-) diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/AdderWrapper.java b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/AdderWrapper.java index 3c7e03505..d7e9322d4 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/AdderWrapper.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/assignment/AdderWrapper.java @@ -19,6 +19,7 @@ package org.mapstruct.ap.internal.model.assignment; import java.util.ArrayList; +import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -27,6 +28,8 @@ import org.mapstruct.ap.internal.model.common.Assignment; import org.mapstruct.ap.internal.model.common.Type; import org.mapstruct.ap.internal.util.Nouns; +import static org.mapstruct.ap.internal.util.Collections.first; + /** * Wraps the assignment in a target setter. * @@ -35,6 +38,7 @@ import org.mapstruct.ap.internal.util.Nouns; public class AdderWrapper extends AssignmentWrapper { private final List thrownTypesToExclude; + private final Type adderType; public AdderWrapper( Assignment rhs, List thrownTypesToExclude, @@ -44,6 +48,7 @@ public class AdderWrapper extends AssignmentWrapper { this.thrownTypesToExclude = thrownTypesToExclude; String desiredName = Nouns.singularize( targetPropertyName ); rhs.setSourceLocalVarName( rhs.createLocalVarName( desiredName ) ); + adderType = first( getSourceType().determineTypeArguments( Collection.class ) ); } @Override @@ -60,11 +65,15 @@ public class AdderWrapper extends AssignmentWrapper { return result; } + public Type getAdderType() { + return adderType; + } + @Override public Set getImportTypes() { Set imported = new HashSet(); imported.addAll( super.getImportTypes() ); - imported.add( getSourceType().getTypeParameters().get( 0 ).getTypeBound() ); + imported.add( adderType.getTypeBound() ); return imported; } diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/common/SourceRHS.java b/processor/src/main/java/org/mapstruct/ap/internal/model/common/SourceRHS.java index 90493453b..61de3548c 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/common/SourceRHS.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/common/SourceRHS.java @@ -18,12 +18,15 @@ */ package org.mapstruct.ap.internal.model.common; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Set; import org.mapstruct.ap.internal.util.Strings; +import static org.mapstruct.ap.internal.util.Collections.first; + /** * SourceRHS Assignment. Right Hand Side (RHS), source part of the assignment. * @@ -135,7 +138,7 @@ public class SourceRHS extends ModelElement implements Assignment { */ public Type getSourceTypeForMatching() { return useElementAsSourceTypeForMatching && sourceType.isCollectionType() ? - sourceType.getTypeParameters().get( 0 ) : sourceType; + first( sourceType.determineTypeArguments( Collection.class ) ) : sourceType; } /** diff --git a/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/AdderWrapper.ftl b/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/AdderWrapper.ftl index c039f459c..190c95fa1 100644 --- a/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/AdderWrapper.ftl +++ b/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/AdderWrapper.ftl @@ -22,7 +22,7 @@ <#import "../macro/CommonMacros.ftl" as lib> <@lib.handleExceptions> if ( ${sourceReference} != null ) { - for ( <@includeModel object=sourceType.typeParameters[0].typeBound/> ${sourceLocalVarName} : ${sourceReference} ) { + for ( <@includeModel object=adderType.typeBound/> ${sourceLocalVarName} : ${sourceReference} ) { ${ext.targetBeanName}.${ext.targetWriteAccessorName}<@lib.handleWrite><@lib.handleAssignment/>; } } diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Issue1338Mapper.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Issue1338Mapper.java index ade7b14be..b4b6b7022 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Issue1338Mapper.java +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Issue1338Mapper.java @@ -31,4 +31,6 @@ public interface Issue1338Mapper { Issue1338Mapper INSTANCE = Mappers.getMapper( Issue1338Mapper.class ); Target map(Source source); + + Source map(Target target); } diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Issue1338Test.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Issue1338Test.java index 7b8d5ce8d..08a4b3ccd 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Issue1338Test.java +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Issue1338Test.java @@ -43,11 +43,17 @@ public class Issue1338Test { @Test public void shouldCorrectlyUseAdder() { - Target target = Issue1338Mapper.INSTANCE.map( new Source( Arrays.asList( "first", "second" ) ) ); + Source source = new Source(); + source.setProperties( Arrays.asList( "first", "second" ) ); + Target target = Issue1338Mapper.INSTANCE.map( source ); assertThat( target ) .extracting( "properties" ) .contains( Arrays.asList( "first", "second" ), atIndex( 0 ) ); + Source mapped = Issue1338Mapper.INSTANCE.map( target ); + + assertThat( mapped.getProperties() ) + .containsExactly( "first", "second" ); } } diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Source.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Source.java index 5c8a6c84b..1700fd62d 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Source.java +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Source.java @@ -18,6 +18,7 @@ */ package org.mapstruct.ap.test.bugs._1338; +import java.util.ArrayList; import java.util.List; /** @@ -25,13 +26,20 @@ import java.util.List; */ public class Source { - private final List properties; + private List properties; - public Source(List properties) { - this.properties = properties; + public void addProperty(String property) { + if ( properties == null ) { + properties = new ArrayList(); + } + properties.add( property ); } public List getProperties() { return properties; } + + public void setProperties(List properties) { + this.properties = properties; + } } diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Target.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Target.java index 793541cbc..0ee75087f 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Target.java +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1338/Target.java @@ -35,6 +35,10 @@ public class Target { throw new IllegalStateException( "Setter is there just as a marker it should not be used" ); } + public StringList getProperties() { + return properties; + } + public static class StringList extends ArrayList { private StringList() {