SSR: introduce SingleNodeIterator

This commit is contained in:
Bas Leijdekkers
2017-10-09 12:54:17 +02:00
parent 6704ec8682
commit 263c8b0b6b
2 changed files with 46 additions and 3 deletions
@@ -38,6 +38,7 @@ import com.intellij.structuralsearch.impl.matcher.*;
import com.intellij.structuralsearch.impl.matcher.compiler.PatternCompiler;
import com.intellij.structuralsearch.impl.matcher.handlers.MatchingHandler;
import com.intellij.structuralsearch.impl.matcher.handlers.TopLevelMatchingHandler;
import com.intellij.structuralsearch.impl.matcher.iterators.SingleNodeIterator;
import com.intellij.structuralsearch.impl.matcher.iterators.SsrFilteringNodeIterator;
import com.intellij.structuralsearch.impl.matcher.strategies.MatchingStrategy;
import com.intellij.structuralsearch.plugin.ui.Configuration;
@@ -480,7 +481,7 @@ public class Matcher {
final Language elementLanguage = element.getLanguage();
if (strategy.continueMatching(element) && elementLanguage.isKindOf(language)) {
visitor.matchContext(new ArrayBackedNodeIterator(new PsiElement[] {element}));
visitor.matchContext(new SingleNodeIterator(element));
return;
}
for(PsiElement el=element.getFirstChild();el!=null;el=el.getNextSibling()) {
@@ -551,8 +552,7 @@ public class Matcher {
assert targetNode != null : "Could not match down up when no target node";
final LanguageFileType fileType = (LanguageFileType)options.getFileType();
match(elementToStartMatching, fileType.getLanguage());
visitor.matchContext(new SingleNodeIterator(elementToStartMatching));
matchContext.getSink().matchingFinished();
return sink.getMatches();
}
@@ -0,0 +1,43 @@
// Copyright 2000-2017 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.structuralsearch.impl.matcher.iterators;
import com.intellij.dupLocator.iterators.NodeIterator;
import com.intellij.psi.PsiElement;
/**
* @author Bas Leijdekkers
*/
public class SingleNodeIterator extends NodeIterator {
private final PsiElement myNode;
private boolean myHasNext = true;
public SingleNodeIterator(PsiElement node) {
myNode = node;
}
@Override
public boolean hasNext() {
return myHasNext;
}
@Override
public PsiElement current() {
return myHasNext ? myNode : null;
}
@Override
public void advance() {
myHasNext = false;
}
@Override
public void rewind() {
myHasNext = true;
}
@Override
public void reset() {
myHasNext = true;
}
}