package com.intellij.javascript.karma.config; import com.intellij.codeInspection.LocalInspectionToolSession; import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.lang.javascript.inspections.JSInspection; import com.intellij.lang.javascript.psi.JSElementVisitor; import com.intellij.lang.javascript.psi.JSLiteralExpression; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class KarmaConfigFileInspection extends JSInspection { @NotNull @Override protected PsiElementVisitor createVisitor(final ProblemsHolder holder, LocalInspectionToolSession session) { return new JSElementVisitor() { @Override public void visitJSLiteralExpression(final JSLiteralExpression node) { for (PsiReference ref : node.getReferences()) { if (ref instanceof KarmaConfigFileReference) { handleReference((KarmaConfigFileReference) ref, holder); } } } }; } private static void handleReference(@NotNull KarmaConfigFileReference ref, @NotNull ProblemsHolder holder) { if (ref.isLast()) { PsiFileSystemItem fileItem = resolve(ref); if (fileItem == null) { // JSFileReferencesInspection should highlight the reference as unresolved return; } KarmaConfigFileReference.FileType fileType = ref.getExpectedFileType(); if (fileType == KarmaConfigFileReference.FileType.DIRECTORY) { if (!fileItem.isDirectory()) { holder.registerProblemForReference( ref, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, "Directory expected" ); } } if (fileType == KarmaConfigFileReference.FileType.FILE) { if (fileItem.isDirectory()) { holder.registerProblemForReference( ref, ProblemHighlightType.GENERIC_ERROR_OR_WARNING, "File/Pattern expected" ); } } } } @Nullable private static PsiFileSystemItem resolve(@NotNull KarmaConfigFileReference ref) { ResolveResult[] results = ref.multiResolve(false); for (ResolveResult result : results) { if (result.isValidResult()) { PsiElement element = result.getElement(); if (element instanceof PsiFileSystemItem) { return (PsiFileSystemItem) element; } } } return null; } }