Commit eb8aba96 authored by codefairy08's avatar codefairy08
Browse files

add method findFirstChildNodeBreadthFirst

parent 4819c03e
Loading
Loading
Loading
Loading
+27 −0
Original line number Diff line number Diff line
@@ -26,6 +26,7 @@ import org.antlr.v4.runtime.tree.ParseTree;

import java.util.Collection;
import java.util.LinkedList;
import java.util.Queue;

/**
 * Extractor utility.
@@ -71,6 +72,32 @@ public final class ExtractorUtils {
        return Optional.absent();
    }
    
    /**
     * Find first child node breadth first.
     *
     * @param node start node
     * @param ruleName rule name
     * @return matched node
     */
    public static Optional<ParserRuleContext> findFirstChildNodeBreadthFirst(final ParserRuleContext node, final RuleName ruleName) {
        Queue<ParserRuleContext> parserRuleContexts = new LinkedList<>();
        parserRuleContexts.add(node);
        ParserRuleContext parserRuleContext;
        while (null != (parserRuleContext = parserRuleContexts.poll())) {
            if (parserRuleContext instanceof ParserRuleContext) {
                if (isMatchedNode((ParserRuleContext) parserRuleContext, ruleName)) {
                    return Optional.of((ParserRuleContext) parserRuleContext);
                }
                for (int i = 0; i < parserRuleContext.getChildCount(); i++) {
                    if (parserRuleContext.getChild(i) instanceof ParserRuleContext) {
                        parserRuleContexts.add((ParserRuleContext) parserRuleContext.getChild(i));
                    }
                }
            }
        }
        return Optional.absent();
    }
    
    /**
     * Find first child node none recursive.
     *