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 fd82b2cfe75a..40464e1d1d3a 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 @@ -927,28 +927,15 @@ public class JavaMatchingVisitor extends JavaElementVisitor { @Override public void visitPolyadicExpression(PsiPolyadicExpression expression) { - PsiPolyadicExpression expr2 = (PsiPolyadicExpression)myMatchingVisitor.getElement(); + final PsiPolyadicExpression expr2 = (PsiPolyadicExpression)myMatchingVisitor.getElement(); - boolean result = expression.getOperationTokenType().equals(expr2.getOperationTokenType()); - if (result) { - PsiExpression[] operands1 = expression.getOperands(); - PsiExpression[] operands2 = expr2.getOperands(); - if (operands1.length != operands2.length) { - result = false; - } - else { - for (int i = 0; i < operands1.length; i++) { - PsiExpression e1 = operands1[i]; - PsiExpression e2 = operands2[i]; - if (!myMatchingVisitor.match(e1, e2)) { - result = false; - break; - } - } - } + myMatchingVisitor.setResult(expression.getOperationTokenType().equals(expr2.getOperationTokenType())); + if (myMatchingVisitor.getResult()) { + final PsiExpression[] operands1 = expression.getOperands(); + final PsiExpression[] operands2 = expr2.getOperands(); + myMatchingVisitor.setResult( + myMatchingVisitor.matchSequentially(new ArrayBackedNodeIterator(operands1), new ArrayBackedNodeIterator(operands2))); } - - myMatchingVisitor.setResult(result); } @Override 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 26b11476cf39..084d4706c517 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 @@ -216,7 +216,7 @@ public class JavaCompilingVisitor extends JavaRecursiveElementWalkingVisitor { createAndSetSubstitutionHandlerFromReference( reference, resolve != null ? ((PsiClass)resolve).getQualifiedName() : reference.getText(), - referenceParent instanceof PsiExpression + referenceParent instanceof PsiReferenceExpression ); } } diff --git a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java index d9089e7f4282..8a3a89298869 100644 --- a/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java +++ b/platform/structuralsearch/testSource/com/intellij/structuralsearch/StructuralSearchTest.java @@ -3249,4 +3249,17 @@ public class StructuralSearchTest extends StructuralSearchTestCase { assertEquals("find assert statement with messages", 1, findMatchesCount(source, "assert '_a : '_b;")); assertEquals("find assert statement without messages", 2, findMatchesCount(source, "assert 'a : '_b{0,0};")); } + + public void testPolyadicExpression() { + String source = "class A {" + + " void f() {" + + " int i = 1 + 2;" + + " int j = 1 + 2 + 3;" + + " int k = 1 + 2 + 3 + 4;" + + " }" + + "}"; + assertEquals("find polyadic expression", 3, findMatchesCount(source, "'_a + '_b+")); + assertEquals("find polyadic expression of 3 operands", 1, findMatchesCount(source, "'_a + '_b{2,2}")); + assertEquals("find polyadic expression of >3 operands", 2, findMatchesCount(source, "'_a + '_b{2,100}")); + } }