package com.nvlad.yii2support.views.inspections; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.PsiFile; import com.intellij.util.ArrayUtil; import com.jetbrains.php.lang.inspections.PhpInspection; import com.jetbrains.php.lang.psi.elements.MethodReference; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; import com.jetbrains.php.lang.psi.visitors.PhpElementVisitor; import com.nvlad.yii2support.views.ViewsUtil; import org.jetbrains.annotations.NotNull; /** * Created by NVlad on 15.01.2017. */ final public class MissedViewInspection extends PhpInspection { @NotNull @Override public String getShortName() { return "MissedViewInspection"; } @NotNull @Override public PsiElementVisitor buildVisitor(@NotNull ProblemsHolder problemsHolder, boolean isOnTheFly) { return new PhpElementVisitor() { @Override public void visitPhpMethodReference(MethodReference reference) { if (!ViewsUtil.isValidRenderMethod(reference)) { return; } if (ArrayUtil.contains(reference.getName(), ViewsUtil.renderMethods)) { if (reference.getParameters().length > 0) { PsiElement pathParameter = reference.getParameters()[0]; if (pathParameter instanceof StringLiteralExpression) { String path = ((StringLiteralExpression) pathParameter).getContents(); if (path.startsWith("//") || path.startsWith("@")) { return; } PsiFile file = ViewsUtil.getViewFile(pathParameter); if (file == null || !file.isValid()) { final String errorViewNotFoundTemplate = "View file for \"%name%\" not found."; final MissedViewLocalQuickFix quickFix = new MissedViewLocalQuickFix(path); final String descriptionTemplate = errorViewNotFoundTemplate.replace("%name%", path); final PsiElement stringPart = pathParameter.findElementAt(1); if (stringPart != null) { problemsHolder.registerProblem(stringPart, descriptionTemplate, quickFix); } } } } } } }; } }