From c8a468a1008e7cf9744c88cde3e7cf95da42d88c Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Mon, 5 Nov 2018 17:09:00 +0100 Subject: [PATCH] SSR: Java string literal should not match char fix --- .../impl/matcher/JavaMatchingVisitor.java | 24 +++++++++---------- .../StructuralSearchTest.java | 1 + 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java index 66680879b62e..e430c1ac1991 100644 --- a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/JavaMatchingVisitor.java @@ -1090,23 +1090,21 @@ public class JavaMatchingVisitor extends JavaElementVisitor { public void visitLiteralExpression(final PsiLiteralExpression const1) { final PsiLiteralExpression const2 = getExpression(PsiLiteralExpression.class); if (const2 == null) return; + final PsiType type1 = const1.getType(); + if (type1 != null && !myMatchingVisitor.setResult(type1.equals(const2.getType()))) { + return; + } final MatchingHandler handler = (MatchingHandler)const1.getUserData(CompiledPattern.HANDLER_KEY); if (handler instanceof SubstitutionHandler) { - final PsiType type1 = const1.getType(); - if (type1 != null && !type1.equals(const2.getType())) { - myMatchingVisitor.setResult(false); - } - else { - int offset = 0; - int length = const2.getTextLength(); - final String text = const2.getText(); + int offset = 0; + int length = const2.getTextLength(); + final String text = const2.getText(); - if (StringUtil.isQuotedString(text)) { - length--; - offset++; - } - myMatchingVisitor.setResult(((SubstitutionHandler)handler).handle(const2, offset, length, myMatchingVisitor.getMatchContext())); + if (StringUtil.isQuotedString(text)) { + length--; + offset++; } + myMatchingVisitor.setResult(((SubstitutionHandler)handler).handle(const2, offset, length, myMatchingVisitor.getMatchContext())); } else if (handler != null) { myMatchingVisitor.setResult(handler.match(const1, const2, myMatchingVisitor.getMatchContext())); diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java index d7214e4d1130..82e86d291cfa 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java @@ -282,6 +282,7 @@ public class StructuralSearchTest extends StructuralSearchTestCase { "}"; assertEquals("match literal by value", 1, findMatchesCount(s3, "32")); assertEquals("match char with substitution", 3, findMatchesCount(s3, "\\''_x\\'")); + assertEquals("string literal should not match char", 0, findMatchesCount(s3, "\"a\"")); } public void testCovariantArraySearch() {