是否可以编写双通道 checkstyle 检查?

Is it possible to write a dual pass checkstyle check?

我有两种情况需要进行 checkstyle 检查。假设我有一堆带有注释@BusinessLogic 的对象。我想首先遍历所有 *.java 文件,创建一个包含这些对象的完整类名的集合。假设这里的 类 之一是 MyBusinessLogic。接下来,作为自定义 checkstyle 检查器的一部分,如果在任何代码中有任何代码行显示“new MyBusinessLogic()”,我想检查并使构建失败。当使用@BusinessLogic 注释对象时,我们希望强制执行 DI。这可能与 checkstyle 吗?我不确定 checkstyle 是否进行双重传递。

我正在考虑的另一个选项是一些 gradle 插件,它可能会扫描所有 java 文件并将 类 的列表写入一个文件,并用 @BusinessLogic 注释,然后 运行 checkstyle 在那之后我的检查器在文件中读取的位置?

我的下一个情况是我有一个以 jar 形式交付的库,所以在那个 jar 中,我也有 类 用 @BusinessLogic 注释,我需要确保它们也被添加到我的列表中 类 不应手动更新,只能使用依赖注入创建。

阅读 checkstyle 文档后,在此处跟进上一个问题的问题:

谢谢, 院长

Is it possible to write a dual pass checkstyle check?

可能,是的,但官方不支持。支持将在 https://github.com/checkstyle/checkstyle/issues/3540 到来,但尚未达成一致。

Multi-file 可以使用 FileSet 进行验证(仍未得到官方支持),但使用 TreeWalker 检查会变得更加困难。这是因为 TreeWalker 不会将 finishProcessing 链接到支票。您可以实现自己的 TreeWalker,它将 finishProcessing 链接到 AbstractChecks 的实现。

您必须使用此方法一次性完成所有操作。使用注释 @YYY 记录所有 new XXX 和 类。在finishProcessing方法中,将2之间得到的信息进行关联,有匹配时打印违规。

I have a library delivered as a jar

Checkstyle 不支持读取 JAR 或字节码。您始终可以创建一个硬编码列表作为替代方案。唯一的其他方法是将您自己的 reader 构建到 Checkstyle 中。