From f78c51bd6bffffb7678561bdbd68f5d462a76fa0 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Wed, 2 Jul 2014 11:44:11 +0200 Subject: [PATCH] Report more SSR java template errors in search dialog (IDEA-126794) --- .../JavaStructuralSearchProfile.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/plugins/structuralsearch/source/com/intellij/structuralsearch/JavaStructuralSearchProfile.java b/plugins/structuralsearch/source/com/intellij/structuralsearch/JavaStructuralSearchProfile.java index 280119d36e3b..a2ab45ebeb0f 100644 --- a/plugins/structuralsearch/source/com/intellij/structuralsearch/JavaStructuralSearchProfile.java +++ b/plugins/structuralsearch/source/com/intellij/structuralsearch/JavaStructuralSearchProfile.java @@ -270,6 +270,8 @@ public class JavaStructuralSearchProfile extends StructuralSearchProfile { @Override public void checkSearchPattern(Project project, MatchOptions options) { class ValidatingVisitor extends JavaRecursiveElementWalkingVisitor { + private PsiElement myCurrent; + @Override public void visitAnnotation(PsiAnnotation annotation) { final PsiJavaCodeReferenceElement nameReferenceElement = annotation.getNameReferenceElement(); @@ -302,15 +304,31 @@ public class JavaStructuralSearchProfile extends StructuralSearchProfile { throw new MalformedPatternException(SSRBundle.message("invalid.modifier.type",name)); } } + + @Override + public void visitErrorElement(PsiErrorElement element) { + super.visitErrorElement(element); + final PsiElement parent = element.getParent(); + if (parent != myCurrent || !"';' expected".equals(element.getErrorDescription())) { + throw new MalformedPatternException(element.getErrorDescription()); + } + } + + public void setCurrent(PsiElement current) { + myCurrent = current; + } } ValidatingVisitor visitor = new ValidatingVisitor(); - final NodeIterator nodes = PatternCompiler.compilePattern(project, options).getNodes(); - while(nodes.hasNext()) { - nodes.current().accept( visitor ); + final CompiledPattern compiledPattern = PatternCompiler.compilePattern(project, options); + final int nodeCount = compiledPattern.getNodeCount(); + final NodeIterator nodes = compiledPattern.getNodes(); + while (nodes.hasNext()) { + final PsiElement current = nodes.current(); + visitor.setCurrent(nodeCount == 1 && current instanceof PsiExpressionStatement ? current : null); + current.accept(visitor); nodes.advance(); } nodes.reset(); - } @Override