/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.lang.apex.rule;
import java.util.Collections;
import java.util.List;
import java.util.Stack;
import net.sourceforge.pmd.Rule;
import net.sourceforge.pmd.RuleContext;
import net.sourceforge.pmd.lang.apex.ast.ApexNode;
import net.sourceforge.pmd.lang.apex.ast.ApexParserVisitor;
import net.sourceforge.pmd.lang.ast.Node;
import net.sourceforge.pmd.lang.rule.AbstractRuleChainVisitor;
import net.sourceforge.pmd.lang.rule.XPathRule;
public class ApexRuleChainVisitor extends AbstractRuleChainVisitor {
protected void indexNodes(List<Node> nodes, RuleContext ctx) {
Stack<Node> stack = new Stack<>();
stack.addAll(nodes);
Collections.reverse(stack);
while (!stack.isEmpty()) {
Node node = stack.pop();
indexNode(node);
if (node.jjtGetNumChildren() > 0) {
for (int i = node.jjtGetNumChildren() - 1; i >= 0; i--) {
stack.push(node.jjtGetChild(i));
}
}
}
}
protected void visit(Rule rule, Node node, RuleContext ctx) {
if (rule instanceof XPathRule) {
((XPathRule) rule).evaluate(node, ctx);
} else {
((ApexNode<?>) node).jjtAccept((ApexParserVisitor) rule, ctx);
}
}
}