From d08ce61cd50e624d802db7ea623648ba5a3ffb6a Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 26 Feb 2018 14:13:41 +0100 Subject: [PATCH] SSR: error checking for xml templates --- .../XmlStructuralSearchProfile.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/XmlStructuralSearchProfile.java b/platform/structuralsearch/source/com/intellij/structuralsearch/XmlStructuralSearchProfile.java index d2e19b7c6628..86e136898a3f 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/XmlStructuralSearchProfile.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/XmlStructuralSearchProfile.java @@ -3,6 +3,7 @@ package com.intellij.structuralsearch; import com.intellij.codeInsight.template.TemplateContextType; import com.intellij.codeInsight.template.XmlContextType; +import com.intellij.dupLocator.iterators.NodeIterator; import com.intellij.dupLocator.util.NodeFilter; import com.intellij.lang.Language; import com.intellij.lang.StdLanguages; @@ -112,6 +113,34 @@ public class XmlStructuralSearchProfile extends StructuralSearchProfile { return StdFileTypes.XML; } + @Override + public void checkSearchPattern(CompiledPattern pattern) { + final ValidatingVisitor visitor = new ValidatingVisitor(); + final NodeIterator nodes = pattern.getNodes(); + while (nodes.hasNext()) { + nodes.current().accept(visitor); + nodes.advance(); + } + nodes.reset(); + } + + static class ValidatingVisitor extends PsiRecursiveElementWalkingVisitor { + + @Override + public void visitErrorElement(PsiErrorElement element) { + super.visitErrorElement(element); + final String errorDescription = element.getErrorDescription(); + final PsiElement parent = element.getParent(); + if (parent instanceof XmlAttribute && "'=' expected".equals(errorDescription)) { + return; + } + else if (parent instanceof XmlTag && errorDescription.startsWith("Element") && errorDescription.endsWith(" is not closed")) { + return; + } + throw new MalformedPatternException(errorDescription); + } + } + @Override public void checkReplacementPattern(Project project, ReplaceOptions options) { }