88import com .intellij .codeInspection .ProblemHighlightType ;
99import com .intellij .codeInspection .ProblemsHolder ;
1010import com .intellij .openapi .util .TextRange ;
11+ import com .intellij .psi .CommonClassNames ;
1112import com .intellij .psi .ContributedReferenceHost ;
1213import com .intellij .psi .PsiClass ;
1314import com .intellij .psi .PsiElement ;
1415import com .intellij .psi .PsiElementVisitor ;
1516import com .intellij .psi .PsiLanguageInjectionHost ;
17+ import com .intellij .psi .PsiMethod ;
18+ import com .intellij .psi .PsiParameter ;
1619import com .intellij .psi .PsiReference ;
20+ import com .intellij .psi .PsiType ;
1721import com .intellij .psi .util .PsiTreeUtil ;
22+ import com .intellij .psi .util .PsiUtil ;
1823import org .jetbrains .annotations .NotNull ;
24+ import org .jetbrains .annotations .Nullable ;
1925import org .mapstruct .intellij .codeinsight .references .BaseReference ;
2026import org .mapstruct .intellij .codeinsight .references .BaseValueMappingReference ;
2127
2228/**
2329 * Inspection that checks if mapstruct references can be resolved.
24- * @see BaseReference
30+ *
2531 * @author hduelme
32+ * @see BaseReference
2633 */
2734public class MapstructReferenceInspection extends InspectionBase {
2835
2936 @ Override
3037 @ NotNull PsiElementVisitor buildVisitorInternal (@ NotNull ProblemsHolder holder , boolean isOnTheFly ) {
31- return new MapstructReferenceVisitor (holder );
38+ return new MapstructReferenceVisitor ( holder );
3239 }
3340
3441 private static class MapstructReferenceVisitor extends PsiElementVisitor {
@@ -44,14 +51,16 @@ private MapstructReferenceVisitor(ProblemsHolder holder) {
4451 */
4552 @ Override
4653 public void visitElement (@ NotNull PsiElement element ) {
47- if (element instanceof ContributedReferenceHost r && element instanceof PsiLanguageInjectionHost ) {
48- for (PsiReference psiReference : r .getReferences ()) {
54+ if ( element instanceof ContributedReferenceHost r && element instanceof PsiLanguageInjectionHost ) {
55+ for ( PsiReference psiReference : r .getReferences () ) {
4956 if ( psiReference instanceof BaseReference baseReference && psiReference .resolve () == null ) {
5057 TextRange range = psiReference .getRangeInElement ();
51- if (range .isEmpty () && range .getStartOffset () == 1 && "\" \" " .equals ( element .getText () ) ) {
58+ if ( range .isEmpty () && range .getStartOffset () == 1 && "\" \" " .equals ( element .getText () ) ) {
5259 String message = ProblemsHolder .unresolvedReferenceMessage ( baseReference );
53- holder .registerProblem ( element , message , ProblemHighlightType .LIKE_UNKNOWN_SYMBOL ,
54- TextRange .create ( 0 , 2 ) );
60+ holder .registerProblem (
61+ element , message , ProblemHighlightType .LIKE_UNKNOWN_SYMBOL ,
62+ TextRange .create ( 0 , 2 )
63+ );
5564 }
5665 else if ( shouldRegisterProblem ( baseReference ) ) {
5766 holder .registerProblem ( psiReference );
@@ -67,9 +76,34 @@ private boolean shouldRegisterProblem(BaseReference reference) {
6776 return valueMappingReference .getEnumClass () != null ;
6877 }
6978
79+ if ( singleSourceParameterIsOfTypeMap ( reference .getMappingMethod () ) ) {
80+ return false ;
81+ }
82+
7083 return !containingClassIsAnnotationType ( reference .getElement () );
7184 }
7285
86+ private boolean singleSourceParameterIsOfTypeMap (@ Nullable PsiMethod mappingMethod ) {
87+
88+ if ( mappingMethod != null ) {
89+ PsiParameter [] parameters = mappingMethod .getParameterList ().getParameters ();
90+ if ( parameters .length > 0 ) {
91+ PsiType parameterType = parameters [0 ].getType ();
92+ return isMapType ( parameterType );
93+ }
94+ }
95+
96+ return false ;
97+ }
98+
99+ private boolean isMapType (PsiType type ) {
100+ PsiClass psiClass = PsiUtil .resolveClassInType ( type );
101+ if ( psiClass == null ) {
102+ return false ;
103+ }
104+ return CommonClassNames .JAVA_UTIL_MAP .equals ( psiClass .getQualifiedName () );
105+ }
106+
73107 private boolean containingClassIsAnnotationType (PsiElement element ) {
74108
75109 PsiClass containingClass = PsiTreeUtil .getParentOfType ( element , PsiClass .class );
0 commit comments