From cabfec01e9f6e079ed23a3a40832f334a7be6fce Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 18 Dec 2014 19:46:35 +0100 Subject: [PATCH] IDEA-130071 (SSR incorrectly says pattern does not match anything in selected scope) --- .../compiler/JavaCompilingVisitor.java | 26 ++++++++++++++++++- .../TestModeOptimizingSearchHelper.java | 2 +- .../OptimizedSearchScanTest.java | 20 ++++++++------ 3 files changed, 38 insertions(+), 10 deletions(-) diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/compiler/JavaCompilingVisitor.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/compiler/JavaCompilingVisitor.java index 9c689fea4eea..25b8a1257045 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/compiler/JavaCompilingVisitor.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/compiler/JavaCompilingVisitor.java @@ -436,7 +436,31 @@ public class JavaCompilingVisitor extends JavaRecursiveElementWalkingVisitor { private void handleReference(PsiJavaCodeReferenceElement reference) { - handleReferenceText(reference.getReferenceName(), myCompilingVisitor.getContext()); + if (shouldOccur(reference)) { + handleReferenceText(reference.getReferenceName(), myCompilingVisitor.getContext()); + } + } + + private boolean shouldOccur(PsiJavaCodeReferenceElement reference) { + final CompileContext compileContext = myCompilingVisitor.getContext(); + final PsiElement parent = reference.getParent(); + if (!(parent instanceof PsiReferenceList)) { + return true; + } + final PsiElement grandParent = parent.getParent(); + if (!(grandParent instanceof PsiMethod)) { + return true; + } + final PsiMethod method = (PsiMethod)grandParent; + if (method.getThrowsList() != parent) { + return true; + } + final String name = method.getName(); + if (!compileContext.getPattern().isTypedVar(name)) { + return true; + } + final SubstitutionHandler handler = (SubstitutionHandler)compileContext.getPattern().getHandler(name); + return !(handler != null && handler.getMinOccurs() == 0); } private static void handleReferenceText(String refname, CompileContext compileContext) { diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/TestModeOptimizingSearchHelper.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/TestModeOptimizingSearchHelper.java index e341b57da8ce..cfedec2d93a9 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/TestModeOptimizingSearchHelper.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/compiler/TestModeOptimizingSearchHelper.java @@ -28,7 +28,7 @@ public class TestModeOptimizingSearchHelper extends OptimizingSearchHelperBase { } protected void doAddSearchWordInCode(final String refname) { - append(refname, "reserved in code:"); + append(refname, "in code:"); } @Override diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/OptimizedSearchScanTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/OptimizedSearchScanTest.java index f17c45bfcf3d..b1467372dbfb 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/OptimizedSearchScanTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/OptimizedSearchScanTest.java @@ -1,18 +1,22 @@ package com.intellij.structuralsearch; import com.intellij.structuralsearch.impl.matcher.compiler.PatternCompiler; -import com.intellij.idea.Bombed; - -import java.util.Calendar; /** * @author Maxim.Mossienko */ -@Bombed(day = 28, description = "support it", month = Calendar.JULY, user = "maxim.mossienko") -public abstract class OptimizedSearchScanTest extends StructuralSearchTestCase { - public void _testClassByQName() throws Exception { - String plan = findWordsToBeUsedWhenSearchingFor("A.f"); - assertEquals("[in code:f]", plan); +public class OptimizedSearchScanTest extends StructuralSearchTestCase { + + public void testClassByQName() throws Exception { + final String plan = findWordsToBeUsedWhenSearchingFor("A.f"); + assertEquals("[in code:f][in code:A]", plan); + } + + public void testOptionalMethodWithThrowsClause() { + final String plan = findWordsToBeUsedWhenSearchingFor("class C {" + + " void 'm{0,1} () throws OMGWTFBBQException {}" + + "}"); + assertEquals("exception should not be in plan", "[in code:C]", plan); } private String findWordsToBeUsedWhenSearchingFor(final String s) {