注释生成的Java源可空性(对于Kotlin)

我使用源代码生成工具( antlr )为我的项目生成Java源文件。 但是,我写的大部分,如果不是全部我的代码,在Kotlin。

Kotlin已经提供了很好的Java互操作性 ,所以使用生成的源代码不是问题。 但是,由于Kotlin如何将Java的可空types引入一个无效的系统 ,所以我失去了大部分使用Kotlin的无效安全性。 最好的我有平台types警告(使types明确,以避免微妙的错误); 最糟糕的是我有意外的崩溃和微妙的错误。

但是,Kotlin会尊重可空性注释 ,例如JSR-305,FindBugs,Lombok,Eclipse和JetBrains各自的@Nullable / @NonNullforms,将这些forms作为合适的非空types或可选的。

因为代码是生成的,我有权访问源代码(并了解它是如何工作的),所以我知道哪些函数可以/不能返回null ,并且要注释它们,以便将它们整齐地包含到我的空安全代码中。 但是,我不能直接将注释添加到代码中,因为它是在构建步骤中生成的,并会覆盖任何手动更改。

有没有可能/什么是最好的方式来注释生成的Java源的空性为了在空安全代码中使用的目的?

最好的方法是修改源代码生成器,使其包含您需要的注释。

如果你不能修改生成器(例如,因为生成器是专有的,你没有它的源代码),那么你可以使用字节码工程来做到这一点。 例如,ASM网站上的这个页面提供了一种方法:

当然,无论哪种情况,都需要一些方法来告诉工具(生成器,字节码重写器,不管)应该注释哪些方法。