下面列出了com.sun.source.tree.OpensTree#com.sun.source.tree.TreeVisitor 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public static void parse(Path moduleInfoPath, ModuleClassVisitor moduleClassVisitor) throws IOException {
var compiler = ToolProvider.getSystemJavaCompiler();
try(var fileManager = compiler.getStandardFileManager(null, null, null)) {
var compilationUnits = fileManager.getJavaFileObjects(moduleInfoPath);
var task = compiler.getTask(null, fileManager, null, null, null, compilationUnits);
var javacTask = (JavacTask)task;
var units = javacTask.parse();
var unit = units.iterator().next();
var moduleHandler = new ModuleHandler(moduleClassVisitor);
var visitor = (TreeVisitor<?,?>)Proxy.newProxyInstance(TreeVisitor.class.getClassLoader(), new Class<?>[]{ TreeVisitor.class},
(proxy, method, args) -> {
ModuleHandler.METHOD_MAP
.getOrDefault(method.getName(), (handler, node, v) -> {
throw new AssertionError("invalid node " + node.getClass());
})
.visit(moduleHandler, (Tree)args[0], (TreeVisitor<?,?>)proxy);
return null;
});
unit.accept(visitor, null);
}
}
public <R, D> R accept(TreeVisitor<R, D> arg0, D arg1) {
R ret = null;
for (JCVariableDecl v : vars) {
ret = v.accept(arg0, arg1);
}
return ret;
}
@SuppressWarnings("static-method")
public void visitCompilationUnit(CompilationUnitTree node, TreeVisitor<?, ?> visitor) {
for(var directive: node.getTypeDecls()) {
if (!(directive instanceof ModuleTree)) { // skip unnecessary nodes: imports, etc
continue;
}
accept(visitor, directive);
}
}
@Override
public <R, D> R accept(TreeVisitor<R, D> visitor, D data) {
return visitor.visitEnhancedForLoop(this, data);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> visitor, D data) {
return visitor.visitParameterizedType(this, data);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitClass(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> visitor, D data) {
return visitor.visitForLoop(this, data);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitVariable(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> visitor, D data) {
return expressions().get(0).accept(visitor, data);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitIdentifier(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitDoWhileLoop(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitArrayType(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitForLoop(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitEnhancedForLoop(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitLiteral(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitMethodInvocation(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitCase(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitSynchronized(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitPrimitiveType(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitCatch(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> visitor, D data) {
return visitor.visitWhileLoop(this, data);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitIf(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitExpressionStatement(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> visitor, D data) {
return visitor.visitCompoundAssignment(this, data);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitContinue(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitReturn(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> visitor, D data) {
return visitor.visitVariable(this, data);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitAssert(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitMethodInvocation(this, d);
}
@Override
public <R, D> R accept(TreeVisitor<R, D> v, D d) {
return v.visitNewClass(this, d);
}