package ru.csu.stan.java.ast.main; import java.io.FileNotFoundException; import javax.tools.JavaFileObject; import ru.csu.stan.java.ast.core.BypassException; import ru.csu.stan.java.ast.core.TraversalHandler; import com.sun.tools.javac.file.JavacFileManager; import com.sun.tools.javac.main.JavaCompiler; import com.sun.tools.javac.tree.JCTree.JCCompilationUnit; import com.sun.tools.javac.util.Context; /** * "Главный класс" получения представления AST. * */ public class Main { private Iterable<? extends JavaFileObject> units; private final Context context = new Context(); private JavaCompiler compiler; /** * Закрытый конструктор */ private Main() {} /** * Статический метод генерации */ public static Main getInstance(String path) throws FileNotFoundException { Main main = new Main(); main.fillUnits(path); main.compiler = new JavaCompiler(main.context); return main; } private void fillUnits(String path) throws FileNotFoundException { JavacFileManager jfm = new JavacFileManager(context, true, null); this.units = jfm.getJavaFileObjectsFromFiles(JavaFileSearcher .getJavaFilesFromDirectory(path)); } public Iterable<? extends JavaFileObject> getUnits() { return units; } public void execute(JavaFileObject file, Iterable<TraversalHandler> handlers) throws BypassException { if (file == null) { throw new NullPointerException("File is null"); } JCCompilationUnit unit = compiler.parse(file); TreeWalkerImpl treeWalker = new TreeWalkerImpl(unit, unit.lineMap); if (handlers != null) { for (TraversalHandler handler : handlers) { treeWalker.addBypassHandler(handler); } } treeWalker.executeBypass(); } }