实现在完成所有分析后运行的JavaC编译器插件

时间:2018-01-05 22:22:53

标签: java javac

我正在编写一个插件,在分析阶段构建一些辅助数据,一旦分析了所有文件/类,我想对所有数据运行一个进程。

今天的编译器框架只发送(通过TaskListener)ANALYZEGENERATE个事件,每个编译单元一个。我感到惊讶的是,每个编译单元,ANALYZE事件GENERATE事件与所有ANALYZE事件相比,然后是所有GENERATE事件。

我想要的是一个单独的事件,说“所有分析都已完成”,但似乎没有这样的事件。

做这样的事情的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

我也遇到了这个问题,认为如果我编译10个类,我会得到每个文件的每个阶段,但这不是它的工作原理。它一次编译一个文件,因此您可以同时获取每个文件的所有事件。我发现如果你控制正在进行编译的进程(即你从java运行javac),那么你可以在编译器运行时收集所有的ANALYZE事件,然后在编译完成后处理它们。

然后,如果你想要发出新的源代码,你可以自己再次运行编译器,继续运行直到你的输出稳定。

这......不太好。我还必须连接我自己的回调集“哦,我需要等到这三个类被分析/等”,所以每个分析都可以订阅它需要的东西,然后当遇到这些类型时,运行那你的回调。

也许有更好的策略,但我看到了这个孤独的问题,并且不想在没有一些关于我如何解决问题的提示的情况下离开它。