summaryrefslogtreecommitdiff
path: root/platform/duplicates-analysis/src/com/intellij/dupLocator/iterators/FilteringNodeIterator.java
diff options
context:
space:
mode:
Diffstat (limited to 'platform/duplicates-analysis/src/com/intellij/dupLocator/iterators/FilteringNodeIterator.java')
-rw-r--r--platform/duplicates-analysis/src/com/intellij/dupLocator/iterators/FilteringNodeIterator.java61
1 files changed, 61 insertions, 0 deletions
diff --git a/platform/duplicates-analysis/src/com/intellij/dupLocator/iterators/FilteringNodeIterator.java b/platform/duplicates-analysis/src/com/intellij/dupLocator/iterators/FilteringNodeIterator.java
new file mode 100644
index 000000000000..a06c65fa1563
--- /dev/null
+++ b/platform/duplicates-analysis/src/com/intellij/dupLocator/iterators/FilteringNodeIterator.java
@@ -0,0 +1,61 @@
+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();
+ }
+}