我正在编写一个插件,用于在分析阶段构建一些辅助数据,并且在分析完所有文件/类之后,我想对所有数据运行一个过程。

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

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

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

最佳答案

我也遇到了这个问题,以为如果我编译10个类,我将获得每个文件的每个阶段,但这不是它的工作方式。它一次编译一个文件,因此您可以一次获取每个事件的所有事件。我发现,如果您控制正在执行编译的过程(即您正在从Java运行Javac),则可以在编译器运行时收集所有ANALYZE事件,然后在编译完成后对其进行处理。

然后,如果您要发出新的源,则可以这样做,请自己再次运行编译器,然后继续进行直到输出稳定为止。

不好我还必须连接自己的一组回调:“哦,我需要等到这三个类都经过分析等等之后,这样每个分析才能订阅所需的内容,然后在遇到这些类型时运行然后您的回调。

也许有更好的策略,但是我看到了这个孤独的问题,不想在没有暗示我如何处理这些问题的情况下就把它留了下来。

关于java - 实现在完成所有分析后运行的JavaC编译器插件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48122117/

10-10 18:10
查看更多