1 /***
2 * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
3 */
4 package test.net.sourceforge.pmd.ast;
5
6 import junit.framework.TestCase;
7 import net.sourceforge.pmd.TargetJDK1_4;
8 import net.sourceforge.pmd.ast.ASTCompilationUnit;
9 import net.sourceforge.pmd.ast.JavaParser;
10 import net.sourceforge.pmd.ast.JavaParserVisitor;
11
12 import java.io.StringReader;
13 import java.lang.reflect.InvocationHandler;
14 import java.lang.reflect.Method;
15 import java.lang.reflect.Proxy;
16 import java.util.HashSet;
17 import java.util.Set;
18
19 public class ParserTst extends TestCase {
20
21 private class Collector implements InvocationHandler {
22 private Class clazz = null;
23 private Set collection = new HashSet();
24
25 public Collector(Class clazz) {
26 this.clazz = clazz;
27 }
28
29 public Set getCollection() {
30 return collection;
31 }
32
33 public Object invoke(Object proxy, Method method, Object params[]) throws Throwable {
34 if (method.getName().equals("visit")) {
35 if (clazz.isInstance(params[0])) {
36 collection.add(params[0]);
37 }
38 }
39
40 Method childrenAccept = params[0].getClass().getMethod("childrenAccept", new Class[]{JavaParserVisitor.class, Object.class});
41 childrenAccept.invoke(params[0], new Object[]{proxy, null});
42 return null;
43 }
44 }
45
46 public Set getNodes(Class clazz, String javaCode) throws Throwable {
47 Collector coll = new Collector(clazz);
48 JavaParser parser = (new TargetJDK1_4()).createParser(new StringReader(javaCode));
49 ASTCompilationUnit cu = parser.CompilationUnit();
50 JavaParserVisitor jpv = (JavaParserVisitor) Proxy.newProxyInstance(JavaParserVisitor.class.getClassLoader(), new Class[]{JavaParserVisitor.class}, coll);
51 jpv.visit(cu, null);
52 return coll.getCollection();
53 }
54 }