01 /**
02 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
03 */
04 package net.sourceforge.pmd.lang.ecmascript.rule;
05
06 import java.util.Collections;
07 import java.util.List;
08 import java.util.Stack;
09
10 import net.sourceforge.pmd.Rule;
11 import net.sourceforge.pmd.RuleContext;
12 import net.sourceforge.pmd.lang.ast.Node;
13 import net.sourceforge.pmd.lang.ecmascript.ast.EcmascriptNode;
14 import net.sourceforge.pmd.lang.ecmascript.ast.EcmascriptParserVisitor;
15 import net.sourceforge.pmd.lang.rule.AbstractRuleChainVisitor;
16 import net.sourceforge.pmd.lang.rule.XPathRule;
17
18 public class EcmascriptRuleChainVisitor extends AbstractRuleChainVisitor {
19
20 protected void indexNodes(List<Node> nodes, RuleContext ctx) {
21 // Visit Nodes in DFS order
22 Stack<Node> stack = new Stack<Node>();
23 stack.addAll(nodes);
24 Collections.reverse(stack);
25 while (!stack.isEmpty()) {
26 Node node = stack.pop();
27 indexNode(node);
28 if (node.jjtGetNumChildren() > 0) {
29 for (int i = node.jjtGetNumChildren() - 1; i >= 0; i--) {
30 stack.push(node.jjtGetChild(i));
31 }
32 }
33 }
34 }
35
36 protected void visit(Rule rule, Node node, RuleContext ctx) {
37 // Rule better either be a EcmascriptParserVisitor, or a XPathRule
38 if (rule instanceof XPathRule) {
39 ((XPathRule) rule).evaluate(node, ctx);
40 } else {
41 ((EcmascriptNode) node).jjtAccept((EcmascriptParserVisitor) rule, ctx);
42 }
43 }
44 }
|