EcmascriptRuleChainVisitor.java
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       ((XPathRulerule).evaluate(node, ctx);
40   else {
41       ((EcmascriptNodenode).jjtAccept((EcmascriptParserVisitorrule, ctx);
42   }
43     }
44 }