From 3a965ce394e9bd472c170cfaef60df68b0116d64 Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Thu, 25 May 2017 22:52:21 +0200 Subject: [PATCH] SSR: find reference with $ in name --- .../compiler/JavaCompilingVisitor.java | 32 ++++++------------- .../StructuralSearchTest.java | 8 +++++ 2 files changed, 18 insertions(+), 22 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 d76f48d26e1b..35bc7ddacdc7 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 @@ -26,6 +26,7 @@ import com.intellij.psi.search.searches.ClassInheritorsSearch; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.structuralsearch.MalformedPatternException; import com.intellij.structuralsearch.SSRBundle; +import com.intellij.structuralsearch.StructuralSearchUtil; import com.intellij.structuralsearch.UnsupportedPatternException; import com.intellij.structuralsearch.impl.matcher.CompiledPattern; import com.intellij.structuralsearch.impl.matcher.JavaCompiledPattern; @@ -171,6 +172,7 @@ public class JavaCompilingVisitor extends JavaRecursiveElementWalkingVisitor { @Override public void visitReferenceExpression(PsiReferenceExpression reference) { visitElement(reference); + handleReference(reference); boolean typedVarProcessed = false; final PsiElement referenceParent = reference.getParent(); @@ -185,17 +187,12 @@ public class JavaCompilingVisitor extends JavaRecursiveElementWalkingVisitor { typedVarProcessed = true; } - if (!(referenceParent instanceof PsiMethodCallExpression)) { - handleReference(reference); - } - MatchingHandler handler = myCompilingVisitor.getContext().getPattern().getHandler(reference); // We want to merge qname related to class to find it in any form final String referencedName = reference.getReferenceName(); - if (!typedVarProcessed && - !(handler instanceof SubstitutionHandler)) { + if (!typedVarProcessed && !(handler instanceof SubstitutionHandler)) { final PsiElement resolve = reference.resolve(); PsiElement referenceQualifier = reference.getQualifier(); @@ -243,12 +240,6 @@ public class JavaCompilingVisitor extends JavaRecursiveElementWalkingVisitor { } } - @Override - public void visitMethodCallExpression(PsiMethodCallExpression expression) { - handleReference(expression.getMethodExpression()); - super.visitMethodCallExpression(expression); - } - @Override public void visitBlockStatement(PsiBlockStatement psiBlockStatement) { super.visitBlockStatement(psiBlockStatement); @@ -332,8 +323,8 @@ public class JavaCompilingVisitor extends JavaRecursiveElementWalkingVisitor { public void visitReferenceElement(PsiJavaCodeReferenceElement reference) { super.visitReferenceElement(reference); - if (reference.getParent() != null && - reference.getParent().getParent() instanceof PsiClass) { + final PsiElement parent = reference.getParent(); + if (parent != null && parent.getParent() instanceof PsiClass) { GlobalCompilingVisitor.setFilter(myCompilingVisitor.getContext().getPattern().getHandler(reference), TypeFilter.getInstance()); } @@ -355,14 +346,13 @@ public class JavaCompilingVisitor extends JavaRecursiveElementWalkingVisitor { GlobalCompilingVisitor.setFilter(handler, ClassFilter.getInstance()); } - private SubstitutionHandler createAndSetSubstitutionHandlerFromReference(final PsiElement expr, final String referenceText, - boolean classQualifier) { + private void createAndSetSubstitutionHandlerFromReference(final PsiElement expr, final String referenceText, boolean classQualifier) { final SubstitutionHandler substitutionHandler = new SubstitutionHandler("__" + referenceText.replace('.', '_'), false, classQualifier ? 0 : 1, 1, false); final boolean caseSensitive = myCompilingVisitor.getContext().getOptions().isCaseSensitiveMatch(); - substitutionHandler.setPredicate(new RegExpPredicate(referenceText.replaceAll("\\.", "\\\\."), caseSensitive, null, false, false)); + substitutionHandler.setPredicate(new RegExpPredicate(StructuralSearchUtil.shieldRegExpMetaChars(referenceText), + caseSensitive, null, false, false)); myCompilingVisitor.getContext().getPattern().setHandler(expr, substitutionHandler); - return substitutionHandler; } @Override @@ -449,7 +439,7 @@ public class JavaCompilingVisitor extends JavaRecursiveElementWalkingVisitor { if (compileContext.getPattern().isTypedVar(refname)) { SubstitutionHandler handler = (SubstitutionHandler)compileContext.getPattern().getHandler(refname); - RegExpPredicate predicate = MatchingHandler.getSimpleRegExpPredicate(handler); + RegExpPredicate predicate = RegExpPredicate.findRegExpPredicate(handler); if (!GlobalCompilingVisitor.isSuitablePredicate(predicate, handler)) { return; } @@ -561,9 +551,7 @@ public class JavaCompilingVisitor extends JavaRecursiveElementWalkingVisitor { } private static boolean needsSupers(final PsiElement element, final MatchingHandler handler) { - if (element.getParent() instanceof PsiClass && - handler instanceof SubstitutionHandler - ) { + if (element.getParent() instanceof PsiClass && handler instanceof SubstitutionHandler) { final SubstitutionHandler handler2 = (SubstitutionHandler)handler; return (handler2.isStrictSubtype() || handler2.isSubtype()); diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java index 22b4bf950a1a..87f8b8f888bd 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java @@ -2416,5 +2416,13 @@ public class StructuralSearchTest extends StructuralSearchTestCase { assertEquals(3, findMatchesCount(source2, "String.valueOf(1)", true)); assertEquals(3, findMatchesCount(source2, "'_a?:[regex( String )].valueOf(1)", true)); assertEquals(4, findMatchesCount(source2, "valueOf(1)", true)); + + String source3 = "class Three {" + + " Three t$;" + + " void f() {" + + " Three a = t$.t$.t$;" + + " }" + + "}"; + assertEquals(2, findMatchesCount(source3, "t$.'_t")); } }