diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/Matcher.java b/platform/structuralsearch/source/com/intellij/structuralsearch/Matcher.java index 6c457826d7cc..a90623b7c209 100644 --- a/platform/structuralsearch/source/com/intellij/structuralsearch/Matcher.java +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/Matcher.java @@ -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(); } diff --git a/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/iterators/SingleNodeIterator.java b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/iterators/SingleNodeIterator.java new file mode 100644 index 000000000000..832f3adae996 --- /dev/null +++ b/platform/structuralsearch/source/com/intellij/structuralsearch/impl/matcher/iterators/SingleNodeIterator.java @@ -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; + } +}