1
2
3
4 package net.sourceforge.pmd.lang.java;
5
6 import java.io.StringReader;
7 import java.lang.reflect.InvocationHandler;
8 import java.lang.reflect.Method;
9 import java.lang.reflect.Proxy;
10 import java.util.ArrayList;
11 import java.util.Collection;
12 import java.util.HashSet;
13 import java.util.List;
14 import java.util.Set;
15
16 import net.sourceforge.pmd.lang.LanguageRegistry;
17 import net.sourceforge.pmd.lang.LanguageVersion;
18 import net.sourceforge.pmd.lang.LanguageVersionHandler;
19 import net.sourceforge.pmd.lang.java.JavaLanguageModule;
20 import net.sourceforge.pmd.lang.java.ast.ASTCompilationUnit;
21 import net.sourceforge.pmd.lang.java.ast.JavaParserVisitor;
22 import net.sourceforge.pmd.lang.java.dfa.DataFlowFacade;
23 import net.sourceforge.pmd.lang.java.symboltable.SymbolFacade;
24
25 public abstract class ParserTst {
26
27 private class Collector<E> implements InvocationHandler {
28 private Class<E> clazz = null;
29 private Collection<E> collection;
30
31 public Collector(Class<E> clazz) {
32 this(clazz, new HashSet<E>());
33 }
34
35 public Collector(Class<E> clazz, Collection<E> coll) {
36 this.clazz = clazz;
37 this.collection = coll;
38 }
39
40 public Collection<E> 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((E) 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 <E> Set<E> getNodes(Class<E> clazz, String javaCode) throws Throwable {
58 return getNodes(LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getDefaultVersion(), clazz, javaCode);
59 }
60
61 public <E> Set<E> getNodes(LanguageVersion languageVersion, Class<E> clazz, String javaCode) throws Throwable {
62 Collector<E> coll = new Collector<E>(clazz);
63 LanguageVersionHandler languageVersionHandler = languageVersion.getLanguageVersionHandler();
64 ASTCompilationUnit cu = (ASTCompilationUnit)languageVersionHandler.getParser(languageVersionHandler.getDefaultParserOptions()).parse(null, new StringReader(javaCode));
65 JavaParserVisitor jpv = (JavaParserVisitor) Proxy.newProxyInstance(JavaParserVisitor.class.getClassLoader(), new Class[]{JavaParserVisitor.class}, coll);
66 jpv.visit(cu, null);
67 return (Set<E>) coll.getCollection();
68 }
69
70 public <E> List<E> getOrderedNodes(Class<E> clazz, String javaCode) throws Throwable {
71 Collector<E> coll = new Collector<E>(clazz, new ArrayList<E>());
72 LanguageVersionHandler languageVersionHandler = LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getDefaultVersion().getLanguageVersionHandler();
73 ASTCompilationUnit cu = (ASTCompilationUnit)languageVersionHandler.getParser(languageVersionHandler.getDefaultParserOptions()).parse(null, new StringReader(javaCode));
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(languageVersionHandler.getDataFlowHandler(), cu);
80
81 return (List<E>) coll.getCollection();
82 }
83
84 public <E> String dumpNodes(List<E> list ) throws Throwable {
85 StringBuilder sb = new StringBuilder () ;
86 int index = 0;
87 for (E item : list) {
88 sb.append("\n node[").append(index).append(item.toString());
89 index ++;
90 }
91 return sb.toString();
92 }
93
94 public ASTCompilationUnit buildDFA(String javaCode) throws Throwable {
95 LanguageVersionHandler languageVersionHandler = LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getDefaultVersion().getLanguageVersionHandler();
96 ASTCompilationUnit cu = (ASTCompilationUnit)languageVersionHandler.getParser(languageVersionHandler.getDefaultParserOptions()).parse(null, new StringReader(javaCode));
97 JavaParserVisitor jpv = (JavaParserVisitor) Proxy.newProxyInstance(JavaParserVisitor.class.getClassLoader(), new Class[]{JavaParserVisitor.class}, new Collector<ASTCompilationUnit>(ASTCompilationUnit.class));
98 jpv.visit(cu, null);
99 new SymbolFacade().initializeWith(cu);
100 new DataFlowFacade().initializeWith(languageVersionHandler.getDataFlowHandler(), cu);
101 return cu;
102 }
103
104 public ASTCompilationUnit parseJava13(String code) {
105 return parseJava(LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.3"), code);
106 }
107 public ASTCompilationUnit parseJava14(String code) {
108 return parseJava(LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.4"), code);
109 }
110 public ASTCompilationUnit parseJava15(String code) {
111 return parseJava(LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.5"), code);
112 }
113 public ASTCompilationUnit parseJava17(String code) {
114 return parseJava(LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.7"), code);
115 }
116 public ASTCompilationUnit parseJava18(String code) {
117 return parseJava(LanguageRegistry.getLanguage(JavaLanguageModule.NAME).getVersion("1.8"), code);
118 }
119 public ASTCompilationUnit parseJava(LanguageVersion languageVersion, String code) {
120 LanguageVersionHandler languageVersionHandler = languageVersion.getLanguageVersionHandler();
121 ASTCompilationUnit rootNode = (ASTCompilationUnit)languageVersionHandler.getParser(languageVersionHandler.getDefaultParserOptions()).parse(null, new StringReader(code));
122 languageVersionHandler.getSymbolFacade().start(rootNode);
123 return rootNode;
124 }
125 }