View Javadoc
1   /**
2    * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
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 }