package fr.adrienbrault.idea.symfony2plugin.routing.inspection; import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.jetbrains.php.lang.psi.elements.StringLiteralExpression; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import fr.adrienbrault.idea.symfony2plugin.routing.PhpRouteReferenceContributor; import fr.adrienbrault.idea.symfony2plugin.util.MethodMatcher; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; /** * @author Daniel Espendiller <daniel@espendiller.net> */ abstract public class AbstractPhpRouteInspection extends LocalInspectionTool { @Override public boolean runForWholeFile() { return true; } @NotNull @Override public PsiElementVisitor buildVisitor(final @NotNull ProblemsHolder holder, boolean isOnTheFly) { if(!Symfony2ProjectComponent.isEnabled(holder.getProject())) { return super.buildVisitor(holder, isOnTheFly); } return new PsiElementVisitor() { @Override public void visitElement(PsiElement element) { if(element instanceof StringLiteralExpression) { String contents = ((StringLiteralExpression) element).getContents(); if(StringUtils.isNotBlank(contents)) { annotate(contents, element, holder); } } super.visitElement(element); } }; } public void annotate(String routeName, @NotNull final PsiElement element, @NotNull ProblemsHolder holder) { if(StringUtils.isBlank(routeName)) { return; } MethodMatcher.MethodMatchParameter methodMatchParameter = new MethodMatcher.StringParameterMatcher(element, 0) .withSignature(PhpRouteReferenceContributor.GENERATOR_SIGNATURES) .match(); if(methodMatchParameter == null) { return; } annotateRouteName(element, holder, routeName); } abstract protected void annotateRouteName(PsiElement target, @NotNull ProblemsHolder holder, final String routeName); }