Skip to content

Commit eaf0978

Browse files
committed
#223: Improve error messages for reference inspection
1 parent cd71c8d commit eaf0978

16 files changed

+101
-23
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright MapStruct Authors.
3+
*
4+
* Licensed under the Apache License version 2.0, available at https://www.apache.org/licenses/LICENSE-2.0
5+
*/
6+
package org.mapstruct.intellij.codeinsight.references;
7+
8+
import com.intellij.openapi.util.TextRange;
9+
import com.intellij.psi.PsiElement;
10+
import org.jetbrains.annotations.NotNull;
11+
import org.jetbrains.annotations.Nullable;
12+
import org.mapstruct.intellij.MapStructBundle;
13+
14+
/**
15+
* @author Filip Hrisafov
16+
*/
17+
abstract class BaseMappingReference extends MapstructBaseReference {
18+
19+
BaseMappingReference(@NotNull PsiElement element, @Nullable MapstructBaseReference previousReference,
20+
TextRange rangeInElement, String value) {
21+
super( element, previousReference, rangeInElement, value );
22+
}
23+
24+
@NotNull
25+
@Override
26+
public String getUnresolvedMessagePattern() {
27+
//noinspection UnresolvedPropertyKey
28+
return MapStructBundle.message( "unknown.property" );
29+
}
30+
}

src/main/java/org/mapstruct/intellij/codeinsight/references/BaseReference.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package org.mapstruct.intellij.codeinsight.references;
77

8+
import com.intellij.codeInsight.daemon.EmptyResolveMessageProvider;
89
import com.intellij.openapi.util.TextRange;
910
import com.intellij.psi.PsiElement;
1011
import com.intellij.psi.PsiMethod;
@@ -21,7 +22,7 @@
2122
*
2223
* @author Filip Hrisafov
2324
*/
24-
public abstract class BaseReference extends PsiReferenceBase<PsiElement> {
25+
public abstract class BaseReference extends PsiReferenceBase<PsiElement> implements EmptyResolveMessageProvider {
2526

2627
/**
2728
* @param element the element for which a reference should be found

src/main/java/org/mapstruct/intellij/codeinsight/references/BaseValueMappingReference.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import com.intellij.psi.PsiMethod;
1414
import org.jetbrains.annotations.NotNull;
1515
import org.jetbrains.annotations.Nullable;
16+
import org.mapstruct.intellij.MapStructBundle;
1617

1718
/**
1819
* Base Reference for {@link org.mapstruct.ValueMapping}(s).
@@ -108,6 +109,13 @@ public final Object[] getVariants() {
108109
@NotNull
109110
abstract Object[] getVariantsInternal(@NotNull PsiMethod mappingMethod, @NotNull PsiClass enumClass);
110111

112+
@NotNull
113+
@Override
114+
public String getUnresolvedMessagePattern() {
115+
//noinspection UnresolvedPropertyKey
116+
return MapStructBundle.message( "unknown.enum.constant" );
117+
}
118+
111119
private static boolean isNotValueMapping(@Nullable PsiMethod mappingMethod) {
112120
return mappingMethod == null || mappingMethod.getParameterList().getParametersCount() != 1;
113121
}

src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructMappingQualifiedByNameReference.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.intellij.psi.PsiTypes;
2525
import org.jetbrains.annotations.NotNull;
2626
import org.jetbrains.annotations.Nullable;
27+
import org.mapstruct.intellij.MapStructBundle;
2728
import org.mapstruct.intellij.util.MapstructUtil;
2829

2930
import static com.intellij.codeInsight.AnnotationUtil.findAnnotation;
@@ -167,6 +168,13 @@ PsiType resolvedType() {
167168
return null;
168169
}
169170

171+
@NotNull
172+
@Override
173+
public String getUnresolvedMessagePattern() {
174+
//noinspection UnresolvedPropertyKey
175+
return MapStructBundle.message( "unknown.qualifiedByName.reference" );
176+
}
177+
170178
/**
171179
* @param psiElement the literal for which references need to be created
172180
* @return the references for the given {@code psiLiteral}

src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructSourceReference.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
*
3636
* @author Filip Hrisafov
3737
*/
38-
class MapstructSourceReference extends MapstructBaseReference {
38+
class MapstructSourceReference extends BaseMappingReference {
3939

4040
/**
4141
* Create a new {@link MapstructSourceReference} with the provided parameters.

src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructTargetReference.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
*
5050
* @author Filip Hrisafov
5151
*/
52-
class MapstructTargetReference extends MapstructBaseReference {
52+
class MapstructTargetReference extends BaseMappingReference {
5353

5454
private final MapStructVersion mapStructVersion;
5555

src/main/java/org/mapstruct/intellij/inspection/MapstructReferenceInspection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public void visitElement(@NotNull PsiElement element) {
4747
if ( psiReference instanceof BaseReference baseReference && psiReference.resolve() == null ) {
4848
TextRange range = psiReference.getRangeInElement();
4949
if (range.isEmpty() && range.getStartOffset() == 1 && "\"\"".equals( element.getText() ) ) {
50-
String message = ProblemsHolder.unresolvedReferenceMessage( psiReference );
50+
String message = ProblemsHolder.unresolvedReferenceMessage( baseReference );
5151
holder.registerProblem( element, message, ProblemHighlightType.LIKE_UNKNOWN_SYMBOL,
5252
TextRange.create( 0, 2 ) );
5353
}

src/main/resources/org/mapstruct/intellij/messages/MapStructBundle.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,6 @@ intention.replace.source.property=Replace source ''.'' with ''{0}''
4444
plugin.settings.title=MapStruct
4545
plugin.settings.quickFix.title=Quick fix properties
4646
plugin.settings.quickFix.preferSourceBeforeTargetInMapping=Prefer source before target in @Mapping
47+
unknown.property=Unknown property ''{0}''
48+
unknown.enum.constant=Unknown enum constant ''{0}''
49+
unknown.qualifiedByName.reference=Unknown @Named reference ''{0}''

testData/inspection/UnknownIgnoreUnmappedSourceReference.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public void setTestName(String testName) {
3939
interface SingleMappingMapper {
4040

4141
@Mapping(target = "testName", ignore = true)
42-
@BeanMapping(ignoreUnmappedSourceProperties = {"<error descr="Cannot resolve symbol 'testName'">testName</error>"})
42+
@BeanMapping(ignoreUnmappedSourceProperties = {"<error descr="Unknown property 'testName'">testName</error>"})
4343
Target map(Source source);
4444
}
4545

@@ -49,6 +49,6 @@ interface SingleMappingsMapper {
4949
@Mappings({
5050
@Mapping(target = "testName", ignore = true)
5151
})
52-
@BeanMapping(ignoreUnmappedSourceProperties = {"<error descr="Cannot resolve symbol 'testName'">testName</error>"})
52+
@BeanMapping(ignoreUnmappedSourceProperties = {"<error descr="Unknown property 'testName'">testName</error>"})
5353
Target map(Source source);
5454
}

testData/inspection/UnknownNestedSourceReference.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,15 +49,15 @@ public void setTestName(String testName) {
4949
@Mapper
5050
interface SingleMappingMapper {
5151

52-
@Mapping(target = "testName", source="inner.<error descr="Cannot resolve symbol 'testName'">testName</error>")
52+
@Mapping(target = "testName", source="inner.<error descr="Unknown property 'testName'">testName</error>")
5353
Target map(Source source);
5454
}
5555

5656
@Mapper
5757
interface SingleMappingsMapper {
5858

5959
@Mappings({
60-
@Mapping(target = "testName", source="inner.<error descr="Cannot resolve symbol 'testName'">testName</error>")
60+
@Mapping(target = "testName", source="inner.<error descr="Unknown property 'testName'">testName</error>")
6161
})
6262
Target map(Source source);
6363
}

0 commit comments

Comments
 (0)