diff --git a/src/main/java/org/mapstruct/intellij/inspection/MissingMapperOrMapperConfigAnnotationInspection.java b/src/main/java/org/mapstruct/intellij/inspection/MissingMapperOrMapperConfigAnnotationInspection.java
index d6583b9..c43c2fd 100644
--- a/src/main/java/org/mapstruct/intellij/inspection/MissingMapperOrMapperConfigAnnotationInspection.java
+++ b/src/main/java/org/mapstruct/intellij/inspection/MissingMapperOrMapperConfigAnnotationInspection.java
@@ -20,7 +20,7 @@
import static org.mapstruct.intellij.util.MapstructUtil.isMapperConfig;
/**
- * Inspection that checks if a mapping class (a class that contains at lease one mapping method) is anntoated with
+ * Inspection that checks if a mapping class (a class that contains at lease one mapping method) is annotated with
* {@link org.mapstruct.Mapper} or {@link org.mapstruct.MapperConfig}.
*
* @author Filip Hrisafov
diff --git a/src/main/java/org/mapstruct/intellij/inspection/NoSourcePropertyDefinedInspection.java b/src/main/java/org/mapstruct/intellij/inspection/NoSourcePropertyDefinedInspection.java
index 6fafca6..8cc75eb 100644
--- a/src/main/java/org/mapstruct/intellij/inspection/NoSourcePropertyDefinedInspection.java
+++ b/src/main/java/org/mapstruct/intellij/inspection/NoSourcePropertyDefinedInspection.java
@@ -15,6 +15,7 @@
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.mapstruct.intellij.MapStructBundle;
+import org.mapstruct.intellij.util.MapstructAnnotationUtils;
import org.mapstruct.intellij.util.MapstructUtil;
/**
@@ -34,7 +35,7 @@ void visitMappingAnnotation( @NotNull ProblemsHolder problemsHolder, @NotNull Ps
}
private static boolean isIgnoreByDefaultEnabled(@NotNull PsiAnnotation psiAnnotation) {
- PsiMethod annotatedMethod = getAnnotatedMethod( psiAnnotation );
+ PsiMethod annotatedMethod = MapstructAnnotationUtils.getAnnotatedMethod(psiAnnotation );
if (annotatedMethod == null) {
return false;
}
@@ -47,49 +48,4 @@ private static boolean isIgnoreByDefaultEnabled(@NotNull PsiAnnotation psiAnnota
return ignoreByDefault instanceof PsiLiteralExpression
&& Boolean.TRUE.equals( ((PsiLiteralExpression) ignoreByDefault).getValue() );
}
-
- @Nullable
- private static PsiMethod getAnnotatedMethod(@NotNull PsiAnnotation psiAnnotation) {
- PsiElement psiAnnotationParent = psiAnnotation.getParent();
- if (psiAnnotationParent == null) {
- return null;
- }
- PsiElement psiAnnotationParentParent = psiAnnotationParent.getParent();
- if (psiAnnotationParentParent instanceof PsiMethod) {
- // directly annotated with @Mapping
- return (PsiMethod) psiAnnotationParentParent;
- }
-
- PsiElement psiAnnotationParentParentParent = psiAnnotationParentParent.getParent();
- if (psiAnnotationParentParentParent instanceof PsiAnnotation) {
- // inside @Mappings without array
- PsiElement mappingsAnnotationParent = psiAnnotationParentParentParent.getParent();
- if (mappingsAnnotationParent == null) {
- return null;
- }
- PsiElement mappingsAnnotationParentParent = mappingsAnnotationParent.getParent();
- if (mappingsAnnotationParentParent instanceof PsiMethod) {
- return (PsiMethod) mappingsAnnotationParentParent;
- }
- return null;
- }
- else if (psiAnnotationParentParentParent instanceof PsiAnnotationParamListImpl) {
- // inside @Mappings wit array
- PsiElement mappingsArray = psiAnnotationParentParentParent.getParent();
- if (mappingsArray == null) {
- return null;
- }
- PsiElement mappingsAnnotationParent = mappingsArray.getParent();
- if (mappingsAnnotationParent == null) {
- return null;
- }
- PsiElement mappingsAnnotationParentParent = mappingsAnnotationParent.getParent();
- if (mappingsAnnotationParentParent instanceof PsiMethod) {
- return (PsiMethod) mappingsAnnotationParentParent;
- }
- return null;
-
- }
- return null;
- }
}
diff --git a/src/main/java/org/mapstruct/intellij/inspection/NonExistingTargetPropertiesInspection.java b/src/main/java/org/mapstruct/intellij/inspection/NonExistingTargetPropertiesInspection.java
new file mode 100644
index 0000000..1d612a9
--- /dev/null
+++ b/src/main/java/org/mapstruct/intellij/inspection/NonExistingTargetPropertiesInspection.java
@@ -0,0 +1,83 @@
+package org.mapstruct.intellij.inspection;
+
+import com.intellij.codeInsight.AnnotationUtil;
+import com.intellij.codeInsight.intention.QuickFixFactory;
+import com.intellij.codeInspection.LocalQuickFix;
+import com.intellij.codeInspection.LocalQuickFixOnPsiElement;
+import com.intellij.codeInspection.ProblemHighlightType;
+import com.intellij.codeInspection.ProblemsHolder;
+import com.intellij.codeInspection.util.IntentionFamilyName;
+import com.intellij.codeInspection.util.IntentionName;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiAnnotation;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiMethod;
+import com.intellij.psi.PsiNameValuePair;
+import com.intellij.psi.PsiType;
+import org.jetbrains.annotations.NotNull;
+import org.mapstruct.intellij.MapStructBundle;
+import org.mapstruct.intellij.util.MapStructVersion;
+import org.mapstruct.intellij.util.MapstructAnnotationUtils;
+import org.mapstruct.intellij.util.MapstructUtil;
+import org.mapstruct.intellij.util.TargetUtils;
+
+import java.util.Set;
+
+import static org.mapstruct.intellij.util.TargetUtils.getTargetType;
+
+public class NonExistingTargetPropertiesInspection extends MappingAnnotationInspectionBase {
+
+ @Override
+ void visitMappingAnnotation(
+ @NotNull final ProblemsHolder problemsHolder,
+ @NotNull final PsiAnnotation psiAnnotation,
+ @NotNull final MappingAnnotation mappingAnnotation) {
+
+ MapStructVersion version = MapstructUtil.resolveMapStructProjectVersion(problemsHolder.getFile());
+
+ PsiNameValuePair targetProperty = mappingAnnotation.getTargetProperty();
+ if (targetProperty != null) {
+
+ PsiMethod method = MapstructAnnotationUtils.getAnnotatedMethod(psiAnnotation);
+ if (method != null) {
+ PsiType targetType = getTargetType(method);
+ if (targetType != null && targetProperty.getValue() != null) {
+ Set
+ This inspection reports when a target property does not exist.
+
+
+
+//wrong
+@Mapper
+public interface EmployeeMapper {
+ @Mapping(source = "employeeName", target = "nonExistingField")
+ Employee toEmployee(EmployeeDto employeeDto);
+}
+
+
+//correct
+@Mapper
+public interface EmployeeMapper {
+ @Mapping(source = "employeeName", target = "name")
+ Employee toEmployee(EmployeeDto employeeDto);
+}
+
+
+
+
+