From 80d26a1a9c0ce2a7c5312d9ed498ade8d5cdedc3 Mon Sep 17 00:00:00 2001 From: Filip Hrisafov Date: Mon, 25 Oct 2021 08:22:26 +0200 Subject: [PATCH] #148, #1386, #2593 Only import top level classes Instead of importing all classes, inner classes will be used through their top level classes only. This also fixes the problem in #2593 since inner classes are no longer imported but used through their top classes --- .../itest/tests/MavenIntegrationTest.java | 5 + .../main/java/DefaultPackageObject.java | 97 +++++++++++++++++++ .../src/test/resources/defaultPackage/pom.xml | 21 ++++ .../test/java/DefaultPackageTest.java | 31 ++++++ .../ap/internal/model/common/Type.java | 69 ++++++++++++- .../test/imports/InnerClassesImportsTest.java | 9 +- .../imports/nested/NestedImportsTest.java | 54 +++++++++++ .../NestedSourceInOtherPackageMapper.java | 18 ++++ .../ap/test/imports/nested/Source.java | 48 +++++++++ .../nested/SourceInOtherPackageMapper.java | 18 ++++ .../ap/test/imports/nested/Target.java | 48 +++++++++ .../nested/TargetInOtherPackageMapper.java | 18 ++++ .../nested/other/SourceInOtherPackage.java | 48 +++++++++ .../nested/other/TargetInOtherPackage.java | 48 +++++++++ .../BeanWithInnerEnumMapperImpl.java | 48 +++++++++ .../innerclasses/InnerClassMapperImpl.java | 55 +++++++++++ .../NestedSourceInOtherPackageMapperImpl.java | 42 ++++++++ .../SourceInOtherPackageMapperImpl.java | 54 +++++++++++ .../TargetInOtherPackageMapperImpl.java | 54 +++++++++++ 19 files changed, 776 insertions(+), 9 deletions(-) create mode 100644 integrationtest/src/test/resources/defaultPackage/main/java/DefaultPackageObject.java create mode 100644 integrationtest/src/test/resources/defaultPackage/pom.xml create mode 100644 integrationtest/src/test/resources/defaultPackage/test/java/DefaultPackageTest.java create mode 100644 processor/src/test/java/org/mapstruct/ap/test/imports/nested/NestedImportsTest.java create mode 100644 processor/src/test/java/org/mapstruct/ap/test/imports/nested/NestedSourceInOtherPackageMapper.java create mode 100644 processor/src/test/java/org/mapstruct/ap/test/imports/nested/Source.java create mode 100644 processor/src/test/java/org/mapstruct/ap/test/imports/nested/SourceInOtherPackageMapper.java create mode 100644 processor/src/test/java/org/mapstruct/ap/test/imports/nested/Target.java create mode 100644 processor/src/test/java/org/mapstruct/ap/test/imports/nested/TargetInOtherPackageMapper.java create mode 100644 processor/src/test/java/org/mapstruct/ap/test/imports/nested/other/SourceInOtherPackage.java create mode 100644 processor/src/test/java/org/mapstruct/ap/test/imports/nested/other/TargetInOtherPackage.java create mode 100644 processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/innerclasses/BeanWithInnerEnumMapperImpl.java create mode 100644 processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/innerclasses/InnerClassMapperImpl.java create mode 100644 processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/nested/NestedSourceInOtherPackageMapperImpl.java create mode 100644 processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/nested/SourceInOtherPackageMapperImpl.java create mode 100644 processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/nested/TargetInOtherPackageMapperImpl.java diff --git a/integrationtest/src/test/java/org/mapstruct/itest/tests/MavenIntegrationTest.java b/integrationtest/src/test/java/org/mapstruct/itest/tests/MavenIntegrationTest.java index 2ec0ba9aa..59aa48b05 100644 --- a/integrationtest/src/test/java/org/mapstruct/itest/tests/MavenIntegrationTest.java +++ b/integrationtest/src/test/java/org/mapstruct/itest/tests/MavenIntegrationTest.java @@ -128,6 +128,11 @@ public class MavenIntegrationTest { void simpleTest() { } + // for issue #2593 + @ProcessorTest(baseDir = "defaultPackage") + void defaultPackageTest() { + } + @ProcessorTest(baseDir = "springTest") void springTest() { } diff --git a/integrationtest/src/test/resources/defaultPackage/main/java/DefaultPackageObject.java b/integrationtest/src/test/resources/defaultPackage/main/java/DefaultPackageObject.java new file mode 100644 index 000000000..ba684850b --- /dev/null +++ b/integrationtest/src/test/resources/defaultPackage/main/java/DefaultPackageObject.java @@ -0,0 +1,97 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +/** + * @author Filip Hrisafov + */ +public class DefaultPackageObject { + public enum CarType { + SEDAN, CAMPER, X4, TRUCK; + } + + static public class Car { + + private String make; + private int numberOfSeats; + private CarType type; + + public Car(String string, int numberOfSeats, CarType sedan) { + this.make = string; + this.numberOfSeats = numberOfSeats; + this.type = sedan; + } + + + public String getMake() { + return make; + } + + public void setMake(String make) { + this.make = make; + } + + public int getNumberOfSeats() { + return numberOfSeats; + } + + public void setNumberOfSeats(int numberOfSeats) { + this.numberOfSeats = numberOfSeats; + } + + public CarType getType() { + return type; + } + + public void setType(CarType type) { + this.type = type; + } + } + + static public class CarDto { + + private String make; + private int seatCount; + private String type; + + public String getMake() { + return make; + } + + public void setMake(String make) { + this.make = make; + } + + public int getSeatCount() { + return seatCount; + } + + public void setSeatCount(int seatCount) { + this.seatCount = seatCount; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + } + + + @Mapper + public interface CarMapper { + + CarMapper INSTANCE = Mappers.getMapper( CarMapper.class ); + + @Mapping(source = "numberOfSeats", target = "seatCount") + CarDto carToCarDto(Car car); + } +} diff --git a/integrationtest/src/test/resources/defaultPackage/pom.xml b/integrationtest/src/test/resources/defaultPackage/pom.xml new file mode 100644 index 000000000..d72300f61 --- /dev/null +++ b/integrationtest/src/test/resources/defaultPackage/pom.xml @@ -0,0 +1,21 @@ + + + + 4.0.0 + + + org.mapstruct + mapstruct-it-parent + 1.0.0 + ../pom.xml + + + defaultPackage + jar + diff --git a/integrationtest/src/test/resources/defaultPackage/test/java/DefaultPackageTest.java b/integrationtest/src/test/resources/defaultPackage/test/java/DefaultPackageTest.java new file mode 100644 index 000000000..ddc834cc8 --- /dev/null +++ b/integrationtest/src/test/resources/defaultPackage/test/java/DefaultPackageTest.java @@ -0,0 +1,31 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at http://www.apache.org/licenses/LICENSE-2.0 + */ + +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * @author Filip Hrisafov + */ + +public class DefaultPackageTest { + + @Test + public void shouldWorkCorrectlyInDefaultPackage() { + DefaultPackageObject.CarDto carDto = DefaultPackageObject.CarMapper.INSTANCE.carToCarDto( + new DefaultPackageObject.Car( + "Morris", + 5, + DefaultPackageObject.CarType.SEDAN + ) ); + + assertThat( carDto ).isNotNull(); + assertThat( carDto.getMake() ).isEqualTo( "Morris" ); + assertThat( carDto.getSeatCount() ).isEqualTo( 5 ); + assertThat( carDto.getType() ).isEqualTo( "SEDAN" ); + } +} diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/common/Type.java b/processor/src/main/java/org/mapstruct/ap/internal/model/common/Type.java index bba33a276..00bcae371 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/common/Type.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/common/Type.java @@ -5,9 +5,11 @@ */ package org.mapstruct.ap.internal.model.common; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Deque; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; @@ -22,6 +24,7 @@ import javax.lang.model.element.Element; import javax.lang.model.element.ElementKind; import javax.lang.model.element.ExecutableElement; import javax.lang.model.element.Modifier; +import javax.lang.model.element.NestingKind; import javax.lang.model.element.TypeElement; import javax.lang.model.element.VariableElement; import javax.lang.model.type.ArrayType; @@ -71,9 +74,11 @@ public class Type extends ModelElement implements Comparable { private final ImplementationType implementationType; private final Type componentType; + private final Type topLevelType; private final String packageName; private final String name; + private final String nameWithTopLevelTypeName; private final String qualifiedName; private final boolean isInterface; @@ -172,6 +177,9 @@ public class Type extends ModelElement implements Comparable { this.filters = new Filters( accessorNaming, typeUtils, typeMirror ); this.loggingVerbose = loggingVerbose; + + this.topLevelType = topLevelType( this.typeElement, this.typeFactory ); + this.nameWithTopLevelTypeName = nameWithTopLevelTypeName( this.typeElement ); } //CHECKSTYLE:ON @@ -199,11 +207,23 @@ public class Type extends ModelElement implements Comparable { *

* If the {@code java.time} variant is referred to first, the {@code java.time.LocalDateTime} will be imported * and the {@code org.joda} variant will be referred to with its FQN. + *

+ * If the type is nested and its top level type is to be imported + * then the name including its top level type will be returned. * - * @return Just the name if this {@link Type} will be imported, otherwise the fully-qualified name. + * @return Just the name if this {@link Type} will be imported, the name up to the top level {@link Type} + * (if the top level type is important, otherwise the fully-qualified name. */ public String createReferenceName() { - return isToBeImported() ? name : ( shouldUseSimpleName() ? name : qualifiedName ); + if ( isToBeImported() || shouldUseSimpleName() ) { + return name; + } + + if ( isTopLevelTypeToBeImported() && nameWithTopLevelTypeName != null ) { + return nameWithTopLevelTypeName; + } + + return qualifiedName; } public List getTypeParameters() { @@ -402,6 +422,10 @@ public class Type extends ModelElement implements Comparable { result.addAll( componentType.getImportTypes() ); } + if ( topLevelType != null ) { + result.addAll( topLevelType.getImportTypes() ); + } + for ( Type parameter : typeParameters ) { result.addAll( parameter.getImportTypes() ); } @@ -413,6 +437,10 @@ public class Type extends ModelElement implements Comparable { return result; } + protected boolean isTopLevelTypeToBeImported() { + return topLevelType != null && topLevelType.isToBeImported(); + } + /** * Whether this type is to be imported by means of an import statement in the currently generated source file * (it can be referenced in the generated source using its simple name) or not (referenced using the FQN). @@ -435,7 +463,7 @@ public class Type extends ModelElement implements Comparable { isToBeImported = true; } } - else { + else if ( typeElement == null || !typeElement.getNestingKind().isNested() ) { toBeImportedTypes.put( trimmedName, trimmedQualifiedName ); isToBeImported = true; } @@ -1492,4 +1520,39 @@ public class Type extends ModelElement implements Comparable { return trimmedClassName; } + private static String nameWithTopLevelTypeName(TypeElement element) { + if ( element == null ) { + return null; + } + if ( !element.getNestingKind().isNested() ) { + return element.getSimpleName().toString(); + } + + Deque elements = new ArrayDeque<>(); + elements.addFirst( element.getSimpleName() ); + Element parent = element.getEnclosingElement(); + while ( parent != null && parent.getKind() != ElementKind.PACKAGE ) { + elements.addFirst( parent.getSimpleName() ); + parent = parent.getEnclosingElement(); + } + + return String.join( ".", elements ); + } + + private static Type topLevelType(TypeElement typeElement, TypeFactory typeFactory) { + if ( typeElement == null || typeElement.getNestingKind() == NestingKind.TOP_LEVEL ) { + return null; + } + + Element parent = typeElement.getEnclosingElement(); + while ( parent != null ) { + if ( parent.getEnclosingElement() != null && + parent.getEnclosingElement().getKind() == ElementKind.PACKAGE ) { + break; + } + parent = parent.getEnclosingElement(); + } + return parent == null ? null : typeFactory.getType( parent.asType() ); + } + } diff --git a/processor/src/test/java/org/mapstruct/ap/test/imports/InnerClassesImportsTest.java b/processor/src/test/java/org/mapstruct/ap/test/imports/InnerClassesImportsTest.java index 91e5df6a2..abad5e417 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/imports/InnerClassesImportsTest.java +++ b/processor/src/test/java/org/mapstruct/ap/test/imports/InnerClassesImportsTest.java @@ -14,7 +14,6 @@ import org.mapstruct.ap.test.imports.innerclasses.InnerClassMapper; import org.mapstruct.ap.test.imports.innerclasses.SourceWithInnerClass; import org.mapstruct.ap.test.imports.innerclasses.SourceWithInnerClass.SourceInnerClass; import org.mapstruct.ap.test.imports.innerclasses.TargetWithInnerClass; -import org.mapstruct.ap.test.imports.innerclasses.TargetWithInnerClass.TargetInnerClass; import org.mapstruct.ap.test.imports.innerclasses.TargetWithInnerClass.TargetInnerClass.TargetInnerInnerClass; import org.mapstruct.ap.testutil.IssueKey; import org.mapstruct.ap.testutil.ProcessorTest; @@ -47,8 +46,7 @@ public class InnerClassesImportsTest { assertThat( target ).isNotNull(); assertThat( target.getInnerClassMember().getValue() ).isEqualTo( 412 ); - generatedSource.forMapper( InnerClassMapper.class ).containsImportFor( SourceInnerClass.class ); - generatedSource.forMapper( InnerClassMapper.class ).containsImportFor( TargetInnerClass.class ); + generatedSource.addComparisonToFixtureFor( InnerClassMapper.class ); } @ProcessorTest @@ -61,8 +59,7 @@ public class InnerClassesImportsTest { assertThat( target ).isNotNull(); assertThat( target.getValue() ).isEqualTo( 412 ); - generatedSource.forMapper( InnerClassMapper.class ).containsImportFor( SourceInnerClass.class ); - generatedSource.forMapper( InnerClassMapper.class ).containsImportFor( TargetInnerInnerClass.class ); + generatedSource.addComparisonToFixtureFor( InnerClassMapper.class ); } @ProcessorTest @@ -82,6 +79,6 @@ public class InnerClassesImportsTest { assertThat( sourceAgain ).isNotNull(); assertThat( sourceAgain.getInnerEnum() ).isEqualTo( InnerEnum.A ); - generatedSource.forMapper( BeanWithInnerEnumMapper.class ).containsImportFor( InnerEnum.class ); + generatedSource.addComparisonToFixtureFor( BeanWithInnerEnumMapper.class ); } } diff --git a/processor/src/test/java/org/mapstruct/ap/test/imports/nested/NestedImportsTest.java b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/NestedImportsTest.java new file mode 100644 index 000000000..37c522e4c --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/NestedImportsTest.java @@ -0,0 +1,54 @@ +/* + * 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.imports.nested; + +import org.junit.jupiter.api.extension.RegisterExtension; +import org.mapstruct.ap.test.imports.nested.other.SourceInOtherPackage; +import org.mapstruct.ap.test.imports.nested.other.TargetInOtherPackage; +import org.mapstruct.ap.testutil.IssueKey; +import org.mapstruct.ap.testutil.ProcessorTest; +import org.mapstruct.ap.testutil.WithClasses; +import org.mapstruct.ap.testutil.runner.GeneratedSource; + +/** + * @author Filip Hrisafov + */ +@WithClasses({ + SourceInOtherPackage.class, + TargetInOtherPackage.class, + Source.class, + Target.class +}) +@IssueKey("1386,148") +class NestedImportsTest { + + @RegisterExtension + final GeneratedSource generatedSource = new GeneratedSource(); + + @ProcessorTest + @WithClasses( { + SourceInOtherPackageMapper.class + } ) + void shouldGenerateNestedInnerClassesForSourceInOtherPackage() { + generatedSource.addComparisonToFixtureFor( SourceInOtherPackageMapper.class ); + } + + @ProcessorTest + @WithClasses( { + NestedSourceInOtherPackageMapper.class + } ) + void shouldGenerateCorrectImportsForTopLevelClassesFromOnlyNestedInnerClasses() { + generatedSource.addComparisonToFixtureFor( NestedSourceInOtherPackageMapper.class ); + } + + @ProcessorTest + @WithClasses( { + TargetInOtherPackageMapper.class + } ) + void shouldGenerateNestedInnerClassesForTargetInOtherPackage() { + generatedSource.addComparisonToFixtureFor( TargetInOtherPackageMapper.class ); + } +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/imports/nested/NestedSourceInOtherPackageMapper.java b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/NestedSourceInOtherPackageMapper.java new file mode 100644 index 000000000..7f98737d1 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/NestedSourceInOtherPackageMapper.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.imports.nested; + +import org.mapstruct.Mapper; +import org.mapstruct.ap.test.imports.nested.other.SourceInOtherPackage; + +/** + * @author Filip Hrisafov + */ +@Mapper +public interface NestedSourceInOtherPackageMapper { + + Target.Nested map(SourceInOtherPackage.Nested source); +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/imports/nested/Source.java b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/Source.java new file mode 100644 index 000000000..2d2e9aa21 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/Source.java @@ -0,0 +1,48 @@ +/* + * 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.imports.nested; + +/** + * @author Filip Hrisafov + */ +public class Source { + + private Nested value; + + public Nested getValue() { + return value; + } + + public void setValue(Nested value) { + this.value = value; + } + + public static class Nested { + + private Inner inner; + + public static class Inner { + + private String value; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + } + + public Inner getInner() { + return inner; + } + + public void setInner(Inner inner) { + this.inner = inner; + } + } +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/imports/nested/SourceInOtherPackageMapper.java b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/SourceInOtherPackageMapper.java new file mode 100644 index 000000000..7150823c1 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/SourceInOtherPackageMapper.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.imports.nested; + +import org.mapstruct.Mapper; +import org.mapstruct.ap.test.imports.nested.other.SourceInOtherPackage; + +/** + * @author Filip Hrisafov + */ +@Mapper +public interface SourceInOtherPackageMapper { + + Target map(SourceInOtherPackage source); +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/imports/nested/Target.java b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/Target.java new file mode 100644 index 000000000..78a50fcb1 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/Target.java @@ -0,0 +1,48 @@ +/* + * 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.imports.nested; + +/** + * @author Filip Hrisafov + */ +public class Target { + + private Nested value; + + public Nested getValue() { + return value; + } + + public void setValue(Nested value) { + this.value = value; + } + + public static class Nested { + + private Inner inner; + + public static class Inner { + + private String value; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + } + + public Inner getInner() { + return inner; + } + + public void setInner(Inner inner) { + this.inner = inner; + } + } +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/imports/nested/TargetInOtherPackageMapper.java b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/TargetInOtherPackageMapper.java new file mode 100644 index 000000000..a40d52eb1 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/TargetInOtherPackageMapper.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.imports.nested; + +import org.mapstruct.Mapper; +import org.mapstruct.ap.test.imports.nested.other.TargetInOtherPackage; + +/** + * @author Filip Hrisafov + */ +@Mapper +public interface TargetInOtherPackageMapper { + + TargetInOtherPackage map(Source source); +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/imports/nested/other/SourceInOtherPackage.java b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/other/SourceInOtherPackage.java new file mode 100644 index 000000000..f6646c716 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/other/SourceInOtherPackage.java @@ -0,0 +1,48 @@ +/* + * 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.imports.nested.other; + +/** + * @author Filip Hrisafov + */ +public class SourceInOtherPackage { + + private Nested value; + + public Nested getValue() { + return value; + } + + public void setValue(Nested value) { + this.value = value; + } + + public static class Nested { + + private Inner inner; + + public static class Inner { + + private String value; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + } + + public Inner getInner() { + return inner; + } + + public void setInner(Inner inner) { + this.inner = inner; + } + } +} diff --git a/processor/src/test/java/org/mapstruct/ap/test/imports/nested/other/TargetInOtherPackage.java b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/other/TargetInOtherPackage.java new file mode 100644 index 000000000..da6b596c0 --- /dev/null +++ b/processor/src/test/java/org/mapstruct/ap/test/imports/nested/other/TargetInOtherPackage.java @@ -0,0 +1,48 @@ +/* + * 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.imports.nested.other; + +/** + * @author Filip Hrisafov + */ +public class TargetInOtherPackage { + + private Nested value; + + public Nested getValue() { + return value; + } + + public void setValue(Nested value) { + this.value = value; + } + + public static class Nested { + + private Inner inner; + + public static class Inner { + + private String value; + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + } + + public Inner getInner() { + return inner; + } + + public void setInner(Inner inner) { + this.inner = inner; + } + } +} diff --git a/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/innerclasses/BeanWithInnerEnumMapperImpl.java b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/innerclasses/BeanWithInnerEnumMapperImpl.java new file mode 100644 index 000000000..1428fabd8 --- /dev/null +++ b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/innerclasses/BeanWithInnerEnumMapperImpl.java @@ -0,0 +1,48 @@ +/* + * 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.imports.innerclasses; + +import javax.annotation.processing.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2021-10-16T21:06:53+0200", + comments = "version: , compiler: javac, environment: Java 17 (Oracle Corporation)" +) +public class BeanWithInnerEnumMapperImpl implements BeanWithInnerEnumMapper { + + @Override + public BeanWithInnerEnum fromFacade(BeanFacade beanFacade) { + if ( beanFacade == null ) { + return null; + } + + BeanWithInnerEnum beanWithInnerEnum = new BeanWithInnerEnum(); + + beanWithInnerEnum.setTest( beanFacade.getTest() ); + if ( beanFacade.getInnerEnum() != null ) { + beanWithInnerEnum.setInnerEnum( Enum.valueOf( BeanWithInnerEnum.InnerEnum.class, beanFacade.getInnerEnum() ) ); + } + + return beanWithInnerEnum; + } + + @Override + public BeanFacade toFacade(BeanWithInnerEnum beanWithInnerEnum) { + if ( beanWithInnerEnum == null ) { + return null; + } + + BeanFacade beanFacade = new BeanFacade(); + + beanFacade.setTest( beanWithInnerEnum.getTest() ); + if ( beanWithInnerEnum.getInnerEnum() != null ) { + beanFacade.setInnerEnum( beanWithInnerEnum.getInnerEnum().name() ); + } + + return beanFacade; + } +} diff --git a/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/innerclasses/InnerClassMapperImpl.java b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/innerclasses/InnerClassMapperImpl.java new file mode 100644 index 000000000..bd85a7abe --- /dev/null +++ b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/innerclasses/InnerClassMapperImpl.java @@ -0,0 +1,55 @@ +/* + * 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.imports.innerclasses; + +import javax.annotation.processing.Generated; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2021-10-16T21:06:53+0200", + comments = "version: , compiler: javac, environment: Java 17 (Oracle Corporation)" +) +public class InnerClassMapperImpl implements InnerClassMapper { + + @Override + public TargetWithInnerClass sourceToTarget(SourceWithInnerClass source) { + if ( source == null ) { + return null; + } + + TargetWithInnerClass targetWithInnerClass = new TargetWithInnerClass(); + + targetWithInnerClass.setInnerClassMember( innerSourceToInnerTarget( source.getInnerClassMember() ) ); + + return targetWithInnerClass; + } + + @Override + public TargetWithInnerClass.TargetInnerClass innerSourceToInnerTarget(SourceWithInnerClass.SourceInnerClass source) { + if ( source == null ) { + return null; + } + + TargetWithInnerClass.TargetInnerClass targetInnerClass = new TargetWithInnerClass.TargetInnerClass(); + + targetInnerClass.setValue( source.getValue() ); + + return targetInnerClass; + } + + @Override + public TargetWithInnerClass.TargetInnerClass.TargetInnerInnerClass innerSourceToInnerInnerTarget(SourceWithInnerClass.SourceInnerClass source) { + if ( source == null ) { + return null; + } + + TargetWithInnerClass.TargetInnerClass.TargetInnerInnerClass targetInnerInnerClass = new TargetWithInnerClass.TargetInnerClass.TargetInnerInnerClass(); + + targetInnerInnerClass.setValue( source.getValue() ); + + return targetInnerInnerClass; + } +} diff --git a/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/nested/NestedSourceInOtherPackageMapperImpl.java b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/nested/NestedSourceInOtherPackageMapperImpl.java new file mode 100644 index 000000000..53dd91b9e --- /dev/null +++ b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/nested/NestedSourceInOtherPackageMapperImpl.java @@ -0,0 +1,42 @@ +/* + * 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.imports.nested; + +import javax.annotation.processing.Generated; +import org.mapstruct.ap.test.imports.nested.other.SourceInOtherPackage; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2021-10-24T19:26:14+0200", + comments = "version: , compiler: javac, environment: Java 1.8.0_161 (Oracle Corporation)" +) +public class NestedSourceInOtherPackageMapperImpl implements NestedSourceInOtherPackageMapper { + + @Override + public Target.Nested map(SourceInOtherPackage.Nested source) { + if ( source == null ) { + return null; + } + + Target.Nested nested = new Target.Nested(); + + nested.setInner( innerToInner( source.getInner() ) ); + + return nested; + } + + protected Target.Nested.Inner innerToInner(SourceInOtherPackage.Nested.Inner inner) { + if ( inner == null ) { + return null; + } + + Target.Nested.Inner inner1 = new Target.Nested.Inner(); + + inner1.setValue( inner.getValue() ); + + return inner1; + } +} diff --git a/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/nested/SourceInOtherPackageMapperImpl.java b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/nested/SourceInOtherPackageMapperImpl.java new file mode 100644 index 000000000..a16751846 --- /dev/null +++ b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/nested/SourceInOtherPackageMapperImpl.java @@ -0,0 +1,54 @@ +/* + * 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.imports.nested; + +import javax.annotation.Generated; +import org.mapstruct.ap.test.imports.nested.other.SourceInOtherPackage; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2018-08-19T19:13:35+0200", + comments = "version: , compiler: javac, environment: Java 1.8.0_161 (Oracle Corporation)" +) +public class SourceInOtherPackageMapperImpl implements SourceInOtherPackageMapper { + + @Override + public Target map(SourceInOtherPackage source) { + if ( source == null ) { + return null; + } + + Target target = new Target(); + + target.setValue( nestedToNested( source.getValue() ) ); + + return target; + } + + protected Target.Nested.Inner innerToInner(SourceInOtherPackage.Nested.Inner inner) { + if ( inner == null ) { + return null; + } + + Target.Nested.Inner inner1 = new Target.Nested.Inner(); + + inner1.setValue( inner.getValue() ); + + return inner1; + } + + protected Target.Nested nestedToNested(SourceInOtherPackage.Nested nested) { + if ( nested == null ) { + return null; + } + + Target.Nested nested1 = new Target.Nested(); + + nested1.setInner( innerToInner( nested.getInner() ) ); + + return nested1; + } +} diff --git a/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/nested/TargetInOtherPackageMapperImpl.java b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/nested/TargetInOtherPackageMapperImpl.java new file mode 100644 index 000000000..b1e5d09f4 --- /dev/null +++ b/processor/src/test/resources/fixtures/org/mapstruct/ap/test/imports/nested/TargetInOtherPackageMapperImpl.java @@ -0,0 +1,54 @@ +/* + * 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.imports.nested; + +import javax.annotation.processing.Generated; +import org.mapstruct.ap.test.imports.nested.other.TargetInOtherPackage; + +@Generated( + value = "org.mapstruct.ap.MappingProcessor", + date = "2021-10-24T13:45:02+0200", + comments = "version: , compiler: javac, environment: Java 1.8.0_161 (Oracle Corporation)" +) +public class TargetInOtherPackageMapperImpl implements TargetInOtherPackageMapper { + + @Override + public TargetInOtherPackage map(Source source) { + if ( source == null ) { + return null; + } + + TargetInOtherPackage targetInOtherPackage = new TargetInOtherPackage(); + + targetInOtherPackage.setValue( nestedToNested( source.getValue() ) ); + + return targetInOtherPackage; + } + + protected TargetInOtherPackage.Nested.Inner innerToInner(Source.Nested.Inner inner) { + if ( inner == null ) { + return null; + } + + TargetInOtherPackage.Nested.Inner inner1 = new TargetInOtherPackage.Nested.Inner(); + + inner1.setValue( inner.getValue() ); + + return inner1; + } + + protected TargetInOtherPackage.Nested nestedToNested(Source.Nested nested) { + if ( nested == null ) { + return null; + } + + TargetInOtherPackage.Nested nested1 = new TargetInOtherPackage.Nested(); + + nested1.setInner( innerToInner( nested.getInner() ) ); + + return nested1; + } +}