diff options
Diffstat (limited to 'java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/iterators/DocValuesIterator.java')
-rw-r--r-- | java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/iterators/DocValuesIterator.java | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/iterators/DocValuesIterator.java b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/iterators/DocValuesIterator.java new file mode 100644 index 000000000000..c1323abd0951 --- /dev/null +++ b/java/structuralsearch-java/src/com/intellij/structuralsearch/impl/matcher/iterators/DocValuesIterator.java @@ -0,0 +1,64 @@ +package com.intellij.structuralsearch.impl.matcher.iterators; + +import com.intellij.dupLocator.iterators.NodeIterator; +import com.intellij.psi.JavaDocTokenType; +import com.intellij.psi.PsiElement; +import com.intellij.psi.tree.IElementType; +import com.intellij.psi.javadoc.PsiDocToken; +import com.intellij.psi.javadoc.PsiDocTagValue; + +import java.util.ArrayList; + +/** + * Iterates over java doc values tag + */ +public class DocValuesIterator extends NodeIterator { + private int index; + private final ArrayList<PsiElement> tokens = new ArrayList<PsiElement>(2); + private static final IElementType tokenType = JavaDocTokenType.DOC_COMMENT_DATA; + + public DocValuesIterator(PsiElement start) { + for(PsiElement e = start; e != null; e = e.getNextSibling()) { + if (e instanceof PsiDocTagValue) tokens.add(e); + else if (e instanceof PsiDocToken && ((PsiDocToken)e).getTokenType() == tokenType) { + tokens.add(e); + e = advanceToNext(e); + } + } + } + + // since doctag value may be inside doc comment we specially skip that nodes from list + static PsiElement advanceToNext(PsiElement e) { + PsiElement nextSibling = e.getNextSibling(); + if (nextSibling instanceof PsiDocTagValue) e = nextSibling; + + nextSibling = e.getNextSibling(); + + if (nextSibling instanceof PsiDocToken && + ((PsiDocToken)nextSibling).getTokenType() == tokenType + ) { + e = nextSibling; + } + return e; + } + + public boolean hasNext() { + return index >=0 && index < tokens.size(); + } + + public PsiElement current() { + return hasNext() ? tokens.get(index) : null; + } + + public void advance() { + if (index < tokens.size()) ++ index; + } + + public void rewind() { + if (index >= 0) --index; + } + + public void reset() { + index = 0; + } +} |