From dd13840a4ec05b5686026463ac18128200ece894 Mon Sep 17 00:00:00 2001 From: thunderhook <8238759+thunderhook@users.noreply.github.com> Date: Fri, 25 Jul 2025 23:30:46 +0200 Subject: [PATCH 1/3] #236: Do not register problems when on mapping composition annotations --- .../MapstructReferenceInspection.java | 13 +++++++- ...etPropertyInspectionOnAnnotationsTest.java | 31 +++++++++++++++++++ ...TargetPropertyInspectionOnAnnotations.java | 16 ++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/mapstruct/intellij/bugs/_236/DisableSourceAndTargetPropertyInspectionOnAnnotationsTest.java create mode 100644 testData/bugs/_236/DisableSourceAndTargetPropertyInspectionOnAnnotations.java diff --git a/src/main/java/org/mapstruct/intellij/inspection/MapstructReferenceInspection.java b/src/main/java/org/mapstruct/intellij/inspection/MapstructReferenceInspection.java index 290b4b8..b36e68f 100644 --- a/src/main/java/org/mapstruct/intellij/inspection/MapstructReferenceInspection.java +++ b/src/main/java/org/mapstruct/intellij/inspection/MapstructReferenceInspection.java @@ -5,14 +5,18 @@ */ package org.mapstruct.intellij.inspection; +import java.util.Optional; + import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.openapi.util.TextRange; import com.intellij.psi.ContributedReferenceHost; +import com.intellij.psi.PsiClass; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiLanguageInjectionHost; import com.intellij.psi.PsiReference; +import com.intellij.psi.util.PsiTreeUtil; import org.jetbrains.annotations.NotNull; import org.mapstruct.intellij.codeinsight.references.BaseReference; import org.mapstruct.intellij.codeinsight.references.BaseValueMappingReference; @@ -64,7 +68,14 @@ private boolean shouldRegisterProblem(BaseReference reference) { if ( reference instanceof BaseValueMappingReference valueMappingReference ) { return valueMappingReference.getEnumClass() != null; } - return true; + + return !containingClassIsAnnotationType( reference.getElement() ); + } + + private boolean containingClassIsAnnotationType(PsiElement element) { + return Optional.ofNullable( PsiTreeUtil.getParentOfType( element, PsiClass.class ) ) + .map( PsiClass::isAnnotationType ) + .orElse( false ); } } } diff --git a/src/test/java/org/mapstruct/intellij/bugs/_236/DisableSourceAndTargetPropertyInspectionOnAnnotationsTest.java b/src/test/java/org/mapstruct/intellij/bugs/_236/DisableSourceAndTargetPropertyInspectionOnAnnotationsTest.java new file mode 100644 index 0000000..450791f --- /dev/null +++ b/src/test/java/org/mapstruct/intellij/bugs/_236/DisableSourceAndTargetPropertyInspectionOnAnnotationsTest.java @@ -0,0 +1,31 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at https://www.apache.org/licenses/LICENSE-2.0 + */ +package org.mapstruct.intellij.bugs._236; + +import org.jetbrains.annotations.NotNull; +import org.mapstruct.intellij.inspection.BaseInspectionTest; +import org.mapstruct.intellij.inspection.MapstructReferenceInspection; + +/** + * @author Oliver Erhart + */ +public class DisableSourceAndTargetPropertyInspectionOnAnnotationsTest extends BaseInspectionTest { + + @Override + protected String getTestDataPath() { + return "testData/bugs/_236"; + } + + @NotNull + @Override + protected Class getInspection() { + return MapstructReferenceInspection.class; + } + + public void testDisableSourceAndTargetPropertyInspectionOnAnnotations() { + doTest(); + } +} diff --git a/testData/bugs/_236/DisableSourceAndTargetPropertyInspectionOnAnnotations.java b/testData/bugs/_236/DisableSourceAndTargetPropertyInspectionOnAnnotations.java new file mode 100644 index 0000000..2c1065a --- /dev/null +++ b/testData/bugs/_236/DisableSourceAndTargetPropertyInspectionOnAnnotations.java @@ -0,0 +1,16 @@ +/* + * Copyright MapStruct Authors. + * + * Licensed under the Apache License version 2.0, available at https://www.apache.org/licenses/LICENSE-2.0 + */ + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +import org.mapstruct.Mapping; + +@Retention(RetentionPolicy.CLASS) +@Mapping(target = "id", ignore = true) +@Mapping(target = "creationDate", expression = "java(new java.util.Date())") +@Mapping(target = "name", source = "groupName") +@interface ToEntity { } \ No newline at end of file From e08b1371e6007453ecdaa327e190cdf000fa3968 Mon Sep 17 00:00:00 2001 From: thunderhook <8238759+thunderhook@users.noreply.github.com> Date: Mon, 28 Jul 2025 08:18:22 +0200 Subject: [PATCH 2/3] #236: Add a test for mapping composition using the @Mappings wrapper annotation --- ...urceAndTargetPropertyInspectionOnAnnotations.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/testData/bugs/_236/DisableSourceAndTargetPropertyInspectionOnAnnotations.java b/testData/bugs/_236/DisableSourceAndTargetPropertyInspectionOnAnnotations.java index 2c1065a..c9303e1 100644 --- a/testData/bugs/_236/DisableSourceAndTargetPropertyInspectionOnAnnotations.java +++ b/testData/bugs/_236/DisableSourceAndTargetPropertyInspectionOnAnnotations.java @@ -8,9 +8,19 @@ import java.lang.annotation.RetentionPolicy; import org.mapstruct.Mapping; +import org.mapstruct.Mappings; @Retention(RetentionPolicy.CLASS) @Mapping(target = "id", ignore = true) @Mapping(target = "creationDate", expression = "java(new java.util.Date())") @Mapping(target = "name", source = "groupName") -@interface ToEntity { } \ No newline at end of file +@interface ToEntity { } + +@Retention(RetentionPolicy.CLASS) +@Mappings({ + @Mapping(target = "id", ignore = true), + @Mapping(target = "creationDate", expression = "java(new java.util.Date())"), + @Mapping(target = "name", source = "groupName") +}) +@interface ToEntityWithMappings { } + From a38c39766da32eaea156386d5c7053ec08bbf3fa Mon Sep 17 00:00:00 2001 From: thunderhook <8238759+thunderhook@users.noreply.github.com> Date: Mon, 28 Jul 2025 08:21:33 +0200 Subject: [PATCH 3/3] #236: Remove the use of Optional#ofNullable --- .../inspection/MapstructReferenceInspection.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/mapstruct/intellij/inspection/MapstructReferenceInspection.java b/src/main/java/org/mapstruct/intellij/inspection/MapstructReferenceInspection.java index b36e68f..e8dd873 100644 --- a/src/main/java/org/mapstruct/intellij/inspection/MapstructReferenceInspection.java +++ b/src/main/java/org/mapstruct/intellij/inspection/MapstructReferenceInspection.java @@ -5,8 +5,6 @@ */ package org.mapstruct.intellij.inspection; -import java.util.Optional; - import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.openapi.util.TextRange; @@ -73,9 +71,14 @@ private boolean shouldRegisterProblem(BaseReference reference) { } private boolean containingClassIsAnnotationType(PsiElement element) { - return Optional.ofNullable( PsiTreeUtil.getParentOfType( element, PsiClass.class ) ) - .map( PsiClass::isAnnotationType ) - .orElse( false ); + + PsiClass containingClass = PsiTreeUtil.getParentOfType( element, PsiClass.class ); + + if ( containingClass == null ) { + return false; + } + + return containingClass.isAnnotationType(); } } }