| package com.intellij.dupLocator.iterators; |
| |
| import com.intellij.dupLocator.util.NodeFilter; |
| import com.intellij.psi.PsiElement; |
| |
| /** |
| * Iterator over important nodes |
| */ |
| public class FilteringNodeIterator extends NodeIterator { |
| private final NodeIterator delegate; |
| private final NodeFilter filter; |
| |
| private void advanceToNext() { |
| while (delegate.hasNext() && filter.accepts(delegate.current())) { |
| delegate.advance(); |
| } |
| } |
| |
| private void rewindToPrevious() { |
| while (filter.accepts(delegate.current())) { |
| delegate.rewind(); |
| } |
| } |
| |
| public FilteringNodeIterator(NodeIterator iterator, NodeFilter filter) { |
| delegate = iterator; |
| this.filter = filter; |
| advanceToNext(); |
| } |
| |
| public boolean hasNext() { |
| return delegate.hasNext() && !filter.accepts(delegate.current()); |
| } |
| |
| public void rewind(int number) { |
| while(number > 0) { |
| delegate.rewind(); |
| rewindToPrevious(); |
| --number; |
| } |
| } |
| |
| public PsiElement current() { |
| return delegate.current(); |
| } |
| |
| public void advance() { |
| delegate.advance(); |
| advanceToNext(); |
| } |
| |
| public void rewind() { |
| delegate.rewind(); |
| rewindToPrevious(); |
| } |
| |
| public void reset() { |
| delegate.reset(); |
| advanceToNext(); |
| } |
| } |