SSR: find reference with $ in name

This commit is contained in:
Bas Leijdekkers
2017-05-27 09:13:25 +02:00
parent 49ba013282
commit 3a965ce394
2 changed files with 18 additions and 22 deletions
@@ -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());
@@ -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"));
}
}