diff --git a/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/UpdateWrapper.ftl b/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/UpdateWrapper.ftl index 9dfbc0858..bdcb438d0 100644 --- a/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/UpdateWrapper.ftl +++ b/processor/src/main/resources/org/mapstruct/ap/internal/model/assignment/UpdateWrapper.ftl @@ -9,7 +9,8 @@ <#import '../macro/CommonMacros.ftl' as lib > <@lib.handleExceptions> <#if includeSourceNullCheck> - if ( <#if sourcePresenceCheckerReference?? >${sourcePresenceCheckerReference}<#else>${sourceReference} != null ) { + <@lib.sourceLocalVarAssignment/> + if ( <#if sourcePresenceCheckerReference?? >${sourcePresenceCheckerReference}<#else><#if sourceLocalVarName??>${sourceLocalVarName}<#else>${sourceReference} != null ) { <@assignToExistingTarget/> <@lib.handleAssignment/>; } diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/A.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/A.java new file mode 100644 index 000000000..692f72282 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/A.java @@ -0,0 +1,18 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1650; + +public class A { + private B b; + + public B getB() { + return b; + } + + public void setB(B b) { + this.b = b; + } +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/AMapper.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/AMapper.java new file mode 100644 index 000000000..860c3b21e --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/AMapper.java @@ -0,0 +1,27 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1650; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.MappingTarget; +import org.mapstruct.factory.Mappers; + +@Mapper +public interface AMapper { + + AMapper INSTANCE = Mappers.getMapper( AMapper.class ); + + @Mapping(source = "b.c", target = "cPrime") + APrime toAPrime(A a, @MappingTarget APrime mappingTarget); + + CPrime toCPrime(C c, @MappingTarget CPrime mappingTarget); + + @Mapping(source = "b.c", target = "cPrime") + APrime toAPrime(A a); + + CPrime toCPrime(C c); +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/APrime.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/APrime.java new file mode 100644 index 000000000..625816f17 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/APrime.java @@ -0,0 +1,19 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1650; + +public class APrime { + + private CPrime cPrime; + + public CPrime getcPrime() { + return cPrime; + } + + public void setcPrime(CPrime cPrime) { + this.cPrime = cPrime; + } +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/B.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/B.java new file mode 100644 index 000000000..924858c8d --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/B.java @@ -0,0 +1,18 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1650; + +public class B { + private C c; + + public C getC() { + return c; + } + + public void setC(C c) { + this.c = c; + } +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/C.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/C.java new file mode 100644 index 000000000..705f2e2d6 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/C.java @@ -0,0 +1,9 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1650; + +public class C { +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/CPrime.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/CPrime.java new file mode 100644 index 000000000..24e4376f8 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/CPrime.java @@ -0,0 +1,9 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1650; + +public class CPrime { +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/Issue1650Test.java b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/Issue1650Test.java new file mode 100644 index 000000000..9dd6f2dba --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/bugs/_1650/Issue1650Test.java @@ -0,0 +1,45 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.ap.test.bugs._1650; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mapstruct.ap.testutil.IssueKey; +import org.mapstruct.ap.testutil.WithClasses; +import org.mapstruct.ap.testutil.runner.AnnotationProcessorTestRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +@IssueKey("1650") +@RunWith(AnnotationProcessorTestRunner.class) +@WithClasses({ + AMapper.class, + A.class, + B.class, + C.class, + APrime.class, + CPrime.class +}) +public class Issue1650Test { + + @Test + public void shouldCompile() { + + A a = new A(); + a.setB( new B() ); + a.getB().setC( new C() ); + + APrime aPrime = new APrime(); + + // update mapping + AMapper.INSTANCE.toAPrime( a, aPrime ); + assertThat( aPrime.getcPrime() ).isNotNull(); + + // create mapping + APrime aPrime1 = AMapper.INSTANCE.toAPrime( a ); + assertThat( aPrime1.getcPrime() ).isNotNull(); + } +}