From 0656f7b3e3ac96d8a9d058a05aece1e83edf1a2d Mon Sep 17 00:00:00 2001 From: Bas Leijdekkers Date: Tue, 20 Mar 2018 15:59:34 +0100 Subject: [PATCH] SSR: fix php searching --- .../dupLocator/iterators/NodeIterator.java | 14 +++++++++----- .../impl/matcher/handlers/MatchingHandler.java | 8 +++++++- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/platform/duplicates-analysis/src/com/intellij/dupLocator/iterators/NodeIterator.java b/platform/duplicates-analysis/src/com/intellij/dupLocator/iterators/NodeIterator.java index acd9d9f43574..65a8f6c2b957 100644 --- a/platform/duplicates-analysis/src/com/intellij/dupLocator/iterators/NodeIterator.java +++ b/platform/duplicates-analysis/src/com/intellij/dupLocator/iterators/NodeIterator.java @@ -1,10 +1,9 @@ +// Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.dupLocator.iterators; import com.intellij.psi.PsiElement; +import org.jetbrains.annotations.NotNull; -/** - * Node iterator interface - */ public abstract class NodeIterator implements Cloneable { public abstract boolean hasNext(); public abstract PsiElement current(); @@ -19,12 +18,17 @@ public abstract class NodeIterator implements Cloneable { } } + public void rewindTo(@NotNull PsiElement element) { + while (current() != element) { + rewind(); + } + } + public NodeIterator clone() { try { return (NodeIterator) super.clone(); } catch (CloneNotSupportedException e) { - e.printStackTrace(); - return null; + throw new RuntimeException(); } } } diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/MatchingHandler.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/MatchingHandler.java index 27d234f3b6b7..8366ae70b7a7 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/MatchingHandler.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/handlers/MatchingHandler.java @@ -46,6 +46,7 @@ public abstract class MatchingHandler { public boolean matchSequentially(NodeIterator patternNodes, NodeIterator matchNodes, MatchContext context) { final MatchingStrategy strategy = context.getPattern().getStrategy(); final PsiElement currentPatternNode = patternNodes.current(); + final PsiElement currentMatchNode = matchNodes.current(); skipIfNecessary(matchNodes, currentPatternNode, strategy); skipComments(matchNodes, currentPatternNode); @@ -69,7 +70,12 @@ public abstract class MatchingHandler { if (patternNodes.hasNext()) { final MatchingHandler nextHandler = context.getPattern().getHandler(patternNodes.current()); - return nextHandler.matchSequentially(patternNodes, matchNodes, context); + if (nextHandler.matchSequentially(patternNodes, matchNodes, context)) { + return true; + } else { + patternNodes.rewindTo(currentPatternNode); + matchNodes.rewindTo(currentMatchNode); + } } else { // match was found return handler.isMatchSequentiallySucceeded(matchNodes);