diff --git a/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseMappingReference.java b/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseMappingReference.java new file mode 100644 index 0000000..1b7cc43 --- /dev/null +++ b/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseMappingReference.java @@ -0,0 +1,30 @@ +/* + * 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.codeinsight.references; + +import com.intellij.openapi.util.TextRange; +import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.mapstruct.intellij.MapStructBundle; + +/** + * @author Filip Hrisafov + */ +abstract class BaseMappingReference extends MapstructBaseReference { + + BaseMappingReference(@NotNull PsiElement element, @Nullable MapstructBaseReference previousReference, + TextRange rangeInElement, String value) { + super( element, previousReference, rangeInElement, value ); + } + + @NotNull + @Override + public String getUnresolvedMessagePattern() { + //noinspection UnresolvedPropertyKey + return MapStructBundle.message( "unknown.property" ); + } +} diff --git a/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseReference.java b/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseReference.java index fcdc738..fc0dc97 100644 --- a/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseReference.java +++ b/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseReference.java @@ -5,6 +5,7 @@ */ package org.mapstruct.intellij.codeinsight.references; +import com.intellij.codeInsight.daemon.EmptyResolveMessageProvider; import com.intellij.openapi.util.TextRange; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiMethod; @@ -21,7 +22,7 @@ * * @author Filip Hrisafov */ -public abstract class BaseReference extends PsiReferenceBase { +public abstract class BaseReference extends PsiReferenceBase implements EmptyResolveMessageProvider { /** * @param element the element for which a reference should be found diff --git a/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseValueMappingReference.java b/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseValueMappingReference.java index 2ac4ae8..c8f7129 100644 --- a/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseValueMappingReference.java +++ b/src/main/java/org/mapstruct/intellij/codeinsight/references/BaseValueMappingReference.java @@ -13,6 +13,7 @@ import com.intellij.psi.PsiMethod; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.mapstruct.intellij.MapStructBundle; /** * Base Reference for {@link org.mapstruct.ValueMapping}(s). @@ -108,6 +109,13 @@ public final Object[] getVariants() { @NotNull abstract Object[] getVariantsInternal(@NotNull PsiMethod mappingMethod, @NotNull PsiClass enumClass); + @NotNull + @Override + public String getUnresolvedMessagePattern() { + //noinspection UnresolvedPropertyKey + return MapStructBundle.message( "unknown.enum.constant" ); + } + private static boolean isNotValueMapping(@Nullable PsiMethod mappingMethod) { return mappingMethod == null || mappingMethod.getParameterList().getParametersCount() != 1; } diff --git a/src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructMappingQualifiedByNameReference.java b/src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructMappingQualifiedByNameReference.java index e89115a..dbe6ff6 100644 --- a/src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructMappingQualifiedByNameReference.java +++ b/src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructMappingQualifiedByNameReference.java @@ -24,6 +24,7 @@ import com.intellij.psi.PsiTypes; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.mapstruct.intellij.MapStructBundle; import org.mapstruct.intellij.util.MapstructUtil; import static com.intellij.codeInsight.AnnotationUtil.findAnnotation; @@ -167,6 +168,13 @@ PsiType resolvedType() { return null; } + @NotNull + @Override + public String getUnresolvedMessagePattern() { + //noinspection UnresolvedPropertyKey + return MapStructBundle.message( "unknown.qualifiedByName.reference" ); + } + /** * @param psiElement the literal for which references need to be created * @return the references for the given {@code psiLiteral} diff --git a/src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructSourceReference.java b/src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructSourceReference.java index 1a7f27b..bd05b7a 100644 --- a/src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructSourceReference.java +++ b/src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructSourceReference.java @@ -35,7 +35,7 @@ * * @author Filip Hrisafov */ -class MapstructSourceReference extends MapstructBaseReference { +class MapstructSourceReference extends BaseMappingReference { /** * Create a new {@link MapstructSourceReference} with the provided parameters. diff --git a/src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructTargetReference.java b/src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructTargetReference.java index 9e995e1..5218abf 100644 --- a/src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructTargetReference.java +++ b/src/main/java/org/mapstruct/intellij/codeinsight/references/MapstructTargetReference.java @@ -49,7 +49,7 @@ * * @author Filip Hrisafov */ -class MapstructTargetReference extends MapstructBaseReference { +class MapstructTargetReference extends BaseMappingReference { private final MapStructVersion mapStructVersion; diff --git a/src/main/java/org/mapstruct/intellij/inspection/MapstructReferenceInspection.java b/src/main/java/org/mapstruct/intellij/inspection/MapstructReferenceInspection.java index bf0c332..290b4b8 100644 --- a/src/main/java/org/mapstruct/intellij/inspection/MapstructReferenceInspection.java +++ b/src/main/java/org/mapstruct/intellij/inspection/MapstructReferenceInspection.java @@ -47,7 +47,7 @@ public void visitElement(@NotNull PsiElement element) { if ( psiReference instanceof BaseReference baseReference && psiReference.resolve() == null ) { TextRange range = psiReference.getRangeInElement(); if (range.isEmpty() && range.getStartOffset() == 1 && "\"\"".equals( element.getText() ) ) { - String message = ProblemsHolder.unresolvedReferenceMessage( psiReference ); + String message = ProblemsHolder.unresolvedReferenceMessage( baseReference ); holder.registerProblem( element, message, ProblemHighlightType.LIKE_UNKNOWN_SYMBOL, TextRange.create( 0, 2 ) ); } diff --git a/src/main/resources/org/mapstruct/intellij/messages/MapStructBundle.properties b/src/main/resources/org/mapstruct/intellij/messages/MapStructBundle.properties index 06c160a..9a5608b 100644 --- a/src/main/resources/org/mapstruct/intellij/messages/MapStructBundle.properties +++ b/src/main/resources/org/mapstruct/intellij/messages/MapStructBundle.properties @@ -44,3 +44,6 @@ intention.replace.source.property=Replace source ''.'' with ''{0}'' plugin.settings.title=MapStruct plugin.settings.quickFix.title=Quick fix properties plugin.settings.quickFix.preferSourceBeforeTargetInMapping=Prefer source before target in @Mapping +unknown.property=Unknown property ''{0}'' +unknown.enum.constant=Unknown enum constant ''{0}'' +unknown.qualifiedByName.reference=Unknown @Named reference ''{0}'' diff --git a/testData/inspection/UnknownIgnoreUnmappedSourceReference.java b/testData/inspection/UnknownIgnoreUnmappedSourceReference.java index 9e0fb46..66921b7 100644 --- a/testData/inspection/UnknownIgnoreUnmappedSourceReference.java +++ b/testData/inspection/UnknownIgnoreUnmappedSourceReference.java @@ -39,7 +39,7 @@ public void setTestName(String testName) { interface SingleMappingMapper { @Mapping(target = "testName", ignore = true) - @BeanMapping(ignoreUnmappedSourceProperties = {"testName"}) + @BeanMapping(ignoreUnmappedSourceProperties = {"testName"}) Target map(Source source); } @@ -49,6 +49,6 @@ interface SingleMappingsMapper { @Mappings({ @Mapping(target = "testName", ignore = true) }) - @BeanMapping(ignoreUnmappedSourceProperties = {"testName"}) + @BeanMapping(ignoreUnmappedSourceProperties = {"testName"}) Target map(Source source); } \ No newline at end of file diff --git a/testData/inspection/UnknownNestedSourceReference.java b/testData/inspection/UnknownNestedSourceReference.java index a3bd361..fc53d02 100644 --- a/testData/inspection/UnknownNestedSourceReference.java +++ b/testData/inspection/UnknownNestedSourceReference.java @@ -49,7 +49,7 @@ public void setTestName(String testName) { @Mapper interface SingleMappingMapper { - @Mapping(target = "testName", source="inner.testName") + @Mapping(target = "testName", source="inner.testName") Target map(Source source); } @@ -57,7 +57,7 @@ interface SingleMappingMapper { interface SingleMappingsMapper { @Mappings({ - @Mapping(target = "testName", source="inner.testName") + @Mapping(target = "testName", source="inner.testName") }) Target map(Source source); } \ No newline at end of file diff --git a/testData/inspection/UnknownNestedTargetReference.java b/testData/inspection/UnknownNestedTargetReference.java index 3df4a38..83d23d1 100644 --- a/testData/inspection/UnknownNestedTargetReference.java +++ b/testData/inspection/UnknownNestedTargetReference.java @@ -49,7 +49,7 @@ public void setTestName(String testName) { @Mapper interface SingleMappingMapper { - @Mapping(target = "inner.name", source="name") + @Mapping(target = "inner.name", source="name") Target map(Source source); } @@ -57,7 +57,7 @@ interface SingleMappingMapper { interface SingleMappingsMapper { @Mappings({ - @Mapping(target = "inner.name", source="name") + @Mapping(target = "inner.name", source="name") }) Target map(Source source); } \ No newline at end of file diff --git a/testData/inspection/UnknownQualifiedByNameReferenceReference.java b/testData/inspection/UnknownQualifiedByNameReferenceReference.java index d413d4e..f86cc5e 100644 --- a/testData/inspection/UnknownQualifiedByNameReferenceReference.java +++ b/testData/inspection/UnknownQualifiedByNameReferenceReference.java @@ -37,7 +37,7 @@ public void setTestName(String testName) { @Mapper interface SingleMappingMapper { - @Mapping(target = "testName", source = "name", qualifiedByName ="StringMapper") + @Mapping(target = "testName", source = "name", qualifiedByName ="StringMapper") Target map(Source source); } @@ -45,7 +45,14 @@ interface SingleMappingMapper { interface SingleMappingsMapper { @Mappings({ - @Mapping(target = "testName", source = "name", qualifiedByName ="StringMapper") + @Mapping(target = "testName", source = "name", qualifiedByName ="StringMapper") }) Target map(Source source); -} \ No newline at end of file +} + +@Mapper +interface EmptyMappingMapper { + + @Mapping(target = "testName", source = "name", qualifiedByName ="") + Target map(Source source); +} diff --git a/testData/inspection/UnknownSourceReference.java b/testData/inspection/UnknownSourceReference.java index 408fdf7..84cd3e1 100644 --- a/testData/inspection/UnknownSourceReference.java +++ b/testData/inspection/UnknownSourceReference.java @@ -37,7 +37,7 @@ public void setTestName(String testName) { @Mapper interface SingleMappingMapper { - @Mapping(target = "testName", source="testName") + @Mapping(target = "testName", source="testName") Target map(Source source); } @@ -45,7 +45,7 @@ interface SingleMappingMapper { interface SingleMappingsMapper { @Mappings({ - @Mapping(target = "testName", source="testName") + @Mapping(target = "testName", source="testName") }) Target map(Source source); } \ No newline at end of file diff --git a/testData/inspection/UnknownTargetReference.java b/testData/inspection/UnknownTargetReference.java index 641934b..1ac3bcf 100644 --- a/testData/inspection/UnknownTargetReference.java +++ b/testData/inspection/UnknownTargetReference.java @@ -37,7 +37,7 @@ public void setTestName(String testName) { @Mapper interface SingleMappingMapper { - @Mapping(target = "name", source="name") + @Mapping(target = "name", source="name") Target map(Source source); } @@ -45,7 +45,14 @@ interface SingleMappingMapper { interface SingleMappingsMapper { @Mappings({ - @Mapping(target = "name", source="name") + @Mapping(target = "name", source="name") }) Target map(Source source); -} \ No newline at end of file +} + +@Mapper +interface EmptyMappingMapper { + + @Mapping(target = "", source="name") + Target map(Source source); +} diff --git a/testData/inspection/UnknownValueMappingSourceReference.java b/testData/inspection/UnknownValueMappingSourceReference.java index c166f85..9acfe41 100644 --- a/testData/inspection/UnknownValueMappingSourceReference.java +++ b/testData/inspection/UnknownValueMappingSourceReference.java @@ -23,7 +23,7 @@ enum Source { @Mapper interface SingleValueMappingMapper { - @ValueMapping(target = "FIST", source = "OTHER") + @ValueMapping(target = "FIST", source = "OTHER") Target map(Source source); } @@ -31,7 +31,7 @@ interface SingleValueMappingMapper { interface SingleValueMappingsMapper { @ValueMappings({ - @ValueMapping(target = "FIST", source = "OTHER") + @ValueMapping(target = "FIST", source = "OTHER") }) Target map(Source source); } @@ -43,3 +43,10 @@ interface StringToEnumMapper { Target map(String source); } +@Mapper +interface EmptyValueMappingMapper { + + @ValueMapping(target = "FIST", source = "") + Target map(Source source); +} + diff --git a/testData/inspection/UnknownValueMappingTargetReference.java b/testData/inspection/UnknownValueMappingTargetReference.java index 1afe3d2..c6a7068 100644 --- a/testData/inspection/UnknownValueMappingTargetReference.java +++ b/testData/inspection/UnknownValueMappingTargetReference.java @@ -23,7 +23,7 @@ enum Source { @Mapper interface SingleValueMappingMapper { - @ValueMapping(target = "OTHER", source = "FIST") + @ValueMapping(target = "OTHER", source = "FIST") Target map(Source source); } @@ -31,7 +31,7 @@ interface SingleValueMappingMapper { interface SingleValueMappingsMapper { @ValueMappings({ - @ValueMapping(target = "OTHER", source = "FIST") + @ValueMapping(target = "OTHER", source = "FIST") }) Target map(Source source); } @@ -41,4 +41,11 @@ interface EnumToStringMapper { @ValueMapping(target = "OTHER", source = "FIST") String map(Source source); -} \ No newline at end of file +} + +@Mapper +interface EmptyValueMappingMapper { + + @ValueMapping(target = "", source = "FIST") + Target map(Source source); +}