Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.unipr;
- import java.io.IOException;
- import java.util.ArrayList;
- import javax.tools.JavaCompiler;
- import javax.tools.JavaFileObject;
- import javax.tools.StandardJavaFileManager;
- import javax.tools.ToolProvider;
- import com.sun.source.util.TreePath;
- import com.sun.source.util.Trees;
- import com.sun.tools.javac.api.JavacTaskImpl;
- import com.sun.tools.javac.code.Kinds;
- import com.sun.tools.javac.main.OptionName;
- import com.sun.tools.javac.model.JavacElements;
- import com.sun.tools.javac.tree.JCTree;
- import com.sun.tools.javac.tree.JCTree.JCCompilationUnit;
- import com.sun.tools.javac.tree.JCTree.JCFieldAccess;
- import com.sun.tools.javac.tree.JCTree.JCIdent;
- import com.sun.tools.javac.tree.TreeScanner;
- import com.sun.tools.javac.util.List;
- /**
- * singletest/A.java is:
- *
- * public class A {
- * private static final int j = 0;
- * private int f() {
- * int x = 1;
- * return B.i + j + x;
- * }
- * }
- *
- * singletest/B.java is:
- *
- * public class B {
- * public static final int i = 0;
- * }
- *
- *
- * Output:
- *
- * decl for i:
- * public static final int i = 0
- *
- * decl for j:
- * private static final int j = 0
- *
- * decl for x:
- * int x = 1
- */
- public class TreeVisitor extends TreeScanner {
- private Trees trees;
- private TreePath path;
- private JavacElements elements;
- public TreeVisitor(JavacTaskImpl task) {
- trees = Trees.instance(task);
- elements = JavacElements.instance(task.getContext());
- }
- public void scan(JCTree tree) {
- if (tree != null) {
- TreePath prev = path;
- path = new TreePath(path, tree);
- try {
- tree.accept(this);
- } finally {
- path = prev;
- }
- }
- }
- @Override
- public void visitIdent(JCIdent tree) {
- if(tree.sym != null && tree.sym.kind == Kinds.VAR) {
- JCTree declTree = elements.getTree(tree.sym);
- System.out.println("decl for " + tree.sym + ":\n" + (declTree == null ? "<no_decl??>" : declTree) + "\n");
- }
- super.visitIdent(tree);
- }
- @Override
- public void visitSelect(JCFieldAccess tree) {
- if (tree.sym != null && tree.sym.kind == Kinds.VAR) {
- JCTree declTree = (JCTree) trees.getTree(tree.sym);
- System.out.println("decl for " + tree.sym + ":\n" + declTree + "\n");
- }
- super.visitSelect(tree);
- }
- @SuppressWarnings("unchecked")
- public static void main(String[] args) throws IOException {
- JavaCompiler tool = ToolProvider.getSystemJavaCompiler();
- StandardJavaFileManager fm = tool.getStandardFileManager(null, null, null);
- Iterable<? extends JavaFileObject> files = fm.getJavaFileObjects("./singletest/A.java");
- java.util.List<String> opts = new ArrayList<String>();
- opts.add(OptionName.SOURCEPATH.optionName);
- opts.add("./singletest");
- JavacTaskImpl task = (JavacTaskImpl)tool.getTask(null, fm, null, opts, null, files); // cast to JavacTaskImpl so I can get the context later
- List<JCCompilationUnit> units = (List<JCCompilationUnit>) task.parse();
- task.analyze();
- new TreeVisitor(task).scan(units.head);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement