Skip to content

Commit 359630a

Browse files
sjaakdfiliphr
authored andcommitted
mapstruct#1772 unmapped source prop remaining when target and source entry diff (mapstruct#1778)
1 parent b2bb768 commit 359630a

5 files changed

Lines changed: 143 additions & 5 deletions

File tree

processor/src/main/java/org/mapstruct/ap/internal/model/BeanMappingMethod.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -396,23 +396,30 @@ private boolean handleDefinedMappings() {
396396
for ( Mapping mapping : entry.getValue() ) {
397397
TargetReference targetReference = mapping.getTargetReference();
398398
if ( targetReference.isValid() ) {
399-
if ( !handledTargets.contains( first( targetReference.getPropertyEntries() ).getFullName() ) ) {
399+
String target = first( targetReference.getPropertyEntries() ).getFullName();
400+
if ( !handledTargets.contains( target ) ) {
400401
if ( handleDefinedMapping( mapping, handledTargets ) ) {
401402
errorOccurred = true;
402403
}
403404
}
405+
if ( mapping.getSourceReference() != null && mapping.getSourceReference().isValid() ) {
406+
List<PropertyEntry> sourceEntries = mapping.getSourceReference().getPropertyEntries();
407+
if ( !sourceEntries.isEmpty() ) {
408+
String source = first( sourceEntries ).getFullName();
409+
unprocessedSourceProperties.remove( source );
410+
}
411+
}
404412
}
405413
else {
406414
errorOccurred = true;
407415
}
408416
}
409417
}
418+
419+
// remove the remaining name based properties
410420
for ( String handledTarget : handledTargets ) {
411-
// In order to avoid: "Unknown property foo in return type" in case of duplicate
412-
// target mappings
413421
unprocessedTargetProperties.remove( handledTarget );
414422
unprocessedDefinedTargets.remove( handledTarget );
415-
unprocessedSourceProperties.remove( handledTarget );
416423
}
417424

418425
return errorOccurred;
@@ -497,7 +504,6 @@ else if ( mapping.getSourceName() != null ) {
497504
.nullValuePropertyMappingStrategy( mapping.getNullValuePropertyMappingStrategy() )
498505
.build();
499506
handledTargets.add( propertyName );
500-
unprocessedSourceProperties.remove( mapping.getSourceName() );
501507
unprocessedSourceParameters.remove( sourceRef.getParameter() );
502508
}
503509
else {
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/*
2+
* Copyright MapStruct Authors.
3+
*
4+
* Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package org.mapstruct.ap.test.bugs._1772;
7+
8+
import org.mapstruct.Mapper;
9+
import org.mapstruct.Mapping;
10+
import org.mapstruct.ReportingPolicy;
11+
import org.mapstruct.factory.Mappers;
12+
13+
/**
14+
* @author Sjaak Derksen
15+
*/
16+
@Mapper(unmappedSourcePolicy = ReportingPolicy.ERROR)
17+
public interface Issue1772Mapper {
18+
19+
Issue1772Mapper INSTANCE = Mappers.getMapper( Issue1772Mapper.class );
20+
21+
@Mapping(target = "nestedTarget.doubleNestedTarget", source = "nestedSource.doublyNestedSourceField" )
22+
Target map(Source source);
23+
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/*
2+
* Copyright MapStruct Authors.
3+
*
4+
* Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package org.mapstruct.ap.test.bugs._1772;
7+
8+
import org.junit.Test;
9+
import org.junit.runner.RunWith;
10+
import org.mapstruct.ap.testutil.IssueKey;
11+
import org.mapstruct.ap.testutil.WithClasses;
12+
import org.mapstruct.ap.testutil.runner.AnnotationProcessorTestRunner;
13+
14+
import static org.assertj.core.api.Assertions.assertThat;
15+
16+
/**
17+
* @author Sjaak Derksen
18+
*/
19+
@IssueKey("1772")
20+
@RunWith(AnnotationProcessorTestRunner.class)
21+
@WithClasses({
22+
Issue1772Mapper.class,
23+
Source.class,
24+
Target.class,
25+
})
26+
public class Issue1772Test {
27+
28+
@Test
29+
public void shouldCorrectlyMarkSourceAsUsed() {
30+
31+
Source source = new Source();
32+
source.setNestedSource( new Source.NestedSource() );
33+
source.getNestedSource().setDoublyNestedSourceField( 5d );
34+
35+
Target target = Issue1772Mapper.INSTANCE.map( source );
36+
37+
assertThat( target.getNestedTarget().getDoubleNestedTarget() ).isEqualTo( 5d );
38+
}
39+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright MapStruct Authors.
3+
*
4+
* Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package org.mapstruct.ap.test.bugs._1772;
7+
8+
/**
9+
* @author Sjaak Derksen
10+
*/
11+
public class Source {
12+
13+
private NestedSource nestedSource;
14+
15+
public NestedSource getNestedSource() {
16+
return nestedSource;
17+
}
18+
19+
public void setNestedSource(NestedSource nestedSource) {
20+
this.nestedSource = nestedSource;
21+
}
22+
23+
public static class NestedSource {
24+
25+
private double doublyNestedSourceField;
26+
27+
public double getDoublyNestedSourceField() {
28+
return doublyNestedSourceField;
29+
}
30+
31+
public void setDoublyNestedSourceField(double doublyNestedSourceField) {
32+
this.doublyNestedSourceField = doublyNestedSourceField;
33+
}
34+
}
35+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright MapStruct Authors.
3+
*
4+
* Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package org.mapstruct.ap.test.bugs._1772;
7+
8+
/**
9+
* @author Sjaak Derksen
10+
*/
11+
public class Target {
12+
13+
private NestedTarget nestedTarget;
14+
15+
public NestedTarget getNestedTarget() {
16+
return nestedTarget;
17+
}
18+
19+
public void setNestedTarget(NestedTarget nestedTarget) {
20+
this.nestedTarget = nestedTarget;
21+
}
22+
23+
public static class NestedTarget {
24+
25+
private double doubleNestedTarget;
26+
27+
public double getDoubleNestedTarget() {
28+
return doubleNestedTarget;
29+
}
30+
31+
public void setDoubleNestedTarget(double doubleNestedTarget) {
32+
this.doubleNestedTarget = doubleNestedTarget;
33+
}
34+
}
35+
}

0 commit comments

Comments
 (0)