JavaRuleChainVisitor.java
01 package net.sourceforge.pmd.lang.java.rule;
02 
03 import java.util.List;
04 
05 import net.sourceforge.pmd.Rule;
06 import net.sourceforge.pmd.RuleContext;
07 import net.sourceforge.pmd.lang.ast.Node;
08 import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
09 import net.sourceforge.pmd.lang.java.ast.JavaNode;
10 import net.sourceforge.pmd.lang.java.ast.JavaParserVisitor;
11 import net.sourceforge.pmd.lang.java.ast.JavaParserVisitorAdapter;
12 import net.sourceforge.pmd.lang.rule.AbstractRuleChainVisitor;
13 import net.sourceforge.pmd.lang.rule.XPathRule;
14 
15 public class JavaRuleChainVisitor extends AbstractRuleChainVisitor {
16 
17   protected void indexNodes(List<Node> nodes, RuleContext ctx) {
18     JavaParserVisitor javaParserVistor = new JavaParserVisitorAdapter() {
19       // Perform a visitation of the AST to index nodes which need
20       // visiting by type
21       public Object visit(JavaNode node, Object data) {
22         indexNode(node);
23         return super.visit(node, data);
24       }
25     };
26 
27     for (int i = 0; i < nodes.size(); i++) {
28       javaParserVistor.visit((ASTCompilationUnit)nodes.get(i), ctx);
29     }
30   }
31 
32   protected void visit(Rule rule, Node node, RuleContext ctx) {
33     // Rule better either be a JavaParserVisitor, or a XPathRule
34     if (rule instanceof XPathRule) {
35       ((XPathRule)rule).evaluate(node, ctx);
36     else {
37       ((JavaNode)node).jjtAccept((JavaParserVisitor)rule, ctx);
38     }
39   }
40 }