package fr.adrienbrault.idea.symfony2plugin.intentions.yaml; import com.intellij.codeInspection.LocalInspectionTool; import com.intellij.codeInspection.ProblemHighlightType; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import fr.adrienbrault.idea.symfony2plugin.Symfony2ProjectComponent; import fr.adrienbrault.idea.symfony2plugin.util.SymfonyUtil; import org.apache.commons.lang.StringUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.yaml.YAMLTokenTypes; /** * @author Daniel Espendiller <daniel@espendiller.net> */ public class YamlQuotedEscapedInspection extends LocalInspectionTool { @NotNull 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.getNode().getElementType() == YAMLTokenTypes.SCALAR_DSTRING && SymfonyUtil.isVersionGreaterThenEquals(element.getProject(), "2.8")) { // "Foo\Foo" -> "Foo\\Foo" String text = StringUtils.strip(element.getText(), "\""); // dont check to long strings // ascii chars that need to be escape; some @see Symfony\Component\Yaml\Unescaper if(text.length() < 255 && text.matches(".*[^\\\\]\\\\[^\\\\0abtnvfre \"/N_LPxuU].*")) { holder.registerProblem(element, "Not escaping a backslash in a double-quoted string is deprecated", ProblemHighlightType.WEAK_WARNING); } } else if (element.getNode().getElementType() == YAMLTokenTypes.TEXT && SymfonyUtil.isVersionGreaterThenEquals(element.getProject(), "2.8")) { // @foo -> "@foo" String text = element.getText(); if(text.length() > 1) { String startChar = text.substring(0, 1); if(startChar.equals("@") || startChar.equals("`") || startChar.equals("|") || startChar.equals(">")) { holder.registerProblem(element, String.format("Deprecated usage of '%s' at the beginning of unquoted string", startChar), ProblemHighlightType.WEAK_WARNING); } else if(startChar.equals("%")) { // deprecated in => "3.1"; but as most user will need to migrate in 2.8 let them know it already holder.registerProblem(element, "Not quoting a scalar starting with the '%' indicator character is deprecated since Symfony 3.1", ProblemHighlightType.WEAK_WARNING); } } } super.visitElement(element); } }; } }