1 /***
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package test.net.sourceforge.pmd.testframework;
5
6 import junit.framework.TestCase;
7 import net.sourceforge.pmd.TargetJDK1_4;
8 import net.sourceforge.pmd.TargetJDKVersion;
9 import net.sourceforge.pmd.ast.ASTCompilationUnit;
10 import net.sourceforge.pmd.ast.JavaParser;
11 import net.sourceforge.pmd.ast.JavaParserVisitor;
12 import net.sourceforge.pmd.dfa.DataFlowFacade;
13 import net.sourceforge.pmd.symboltable.SymbolFacade;
14
15 import java.io.StringReader;
16 import java.lang.reflect.InvocationHandler;
17 import java.lang.reflect.Method;
18 import java.lang.reflect.Proxy;
19 import java.util.ArrayList;
20 import java.util.Collection;
21 import java.util.HashSet;
22 import java.util.List;
23 import java.util.Set;
24
25 public class ParserTst extends TestCase {
26
27 private class Collector implements InvocationHandler {
28 private Class clazz = null;
29 private Collection collection;
30
31 public Collector(Class clazz) {
32 this(clazz, new HashSet());
33 }
34
35 public Collector(Class clazz, Collection coll) {
36 this.clazz = clazz;
37 this.collection = coll;
38 }
39
40 public Collection getCollection() {
41 return collection;
42 }
43
44 public Object invoke(Object proxy, Method method, Object params[]) throws Throwable {
45 if (method.getName().equals("visit")) {
46 if (clazz.isInstance(params[0])) {
47 collection.add(params[0]);
48 }
49 }
50
51 Method childrenAccept = params[0].getClass().getMethod("childrenAccept", new Class[]{JavaParserVisitor.class, Object.class});
52 childrenAccept.invoke(params[0], new Object[]{proxy, null});
53 return null;
54 }
55 }
56
57 public Set getNodes(Class clazz, String javaCode) throws Throwable {
58 return getNodes(new TargetJDK1_4(), clazz, javaCode);
59 }
60
61 public Set getNodes(TargetJDKVersion jdk, Class clazz, String javaCode) throws Throwable {
62 Collector coll = new Collector(clazz);
63 JavaParser parser = jdk.createParser(new StringReader(javaCode));
64 ASTCompilationUnit cu = parser.CompilationUnit();
65 JavaParserVisitor jpv = (JavaParserVisitor) Proxy.newProxyInstance(JavaParserVisitor.class.getClassLoader(), new Class[]{JavaParserVisitor.class}, coll);
66 jpv.visit(cu, null);
67 return (Set) coll.getCollection();
68 }
69
70 public List getOrderedNodes(Class clazz, String javaCode) throws Throwable {
71 Collector coll = new Collector(clazz, new ArrayList());
72 JavaParser parser = (new TargetJDK1_4()).createParser(new StringReader(javaCode));
73 ASTCompilationUnit cu = parser.CompilationUnit();
74 JavaParserVisitor jpv = (JavaParserVisitor) Proxy.newProxyInstance(JavaParserVisitor.class.getClassLoader(), new Class[]{JavaParserVisitor.class}, coll);
75 jpv.visit(cu, null);
76 SymbolFacade sf = new SymbolFacade();
77 sf.initializeWith(cu);
78 DataFlowFacade dff = new DataFlowFacade();
79 dff.initializeWith(cu);
80 return (List) coll.getCollection();
81 }
82
83 public ASTCompilationUnit buildDFA(String javaCode) throws Throwable {
84 JavaParser parser = (new TargetJDK1_4()).createParser(new StringReader(javaCode));
85 ASTCompilationUnit cu = parser.CompilationUnit();
86 JavaParserVisitor jpv = (JavaParserVisitor) Proxy.newProxyInstance(JavaParserVisitor.class.getClassLoader(), new Class[]{JavaParserVisitor.class}, new Collector(ASTCompilationUnit.class));
87 jpv.visit(cu, null);
88 new SymbolFacade().initializeWith(cu);
89 new DataFlowFacade().initializeWith(cu);
90 return cu;
91 }
92 }