如何从注解处理器生成Kotlin文件?

20

我有一个 Java 注解处理器,在编译期间生成了一堆 Java 文件。我想通过添加扩展方法,使生成的类在 Kotlin 中更易于使用。在 Kotlin 论坛上,有人告诉我可以尝试编写一个包含扩展函数的 Kotlin 文件。我已经尝试过了,使用 Filer 对象创建该文件,并将其输出到 StandardLocations.SOURCE_OUTPUT 目录中。Intellij 可以看到我的生成类,我也可以像预期的那样使用扩展函数,但是应用程序无法编译,因为编译器找不到新的 Kotlin 文件。是否有任何方法可以编写一个新的 Kotlin 文件,以便被 Kotlin 编译器捕捉到?


你是如何编译你的应用程序的? - yole
使用kotlin-android gradle插件。抱歉,这是一个非常重要的细节。 - Bradley Campbell
你能否发布一个演示问题的样例项目? - miensol
1
是的。我刚刚在我的项目中添加了一个带有错误代码的分支:https://github.com/grandstaish/paperparcel/tree/kotlin-extensions。只需在Android Studio或Intellij中打开源代码并构建整个项目即可。kotlin-example应用程序将无法构建。 - Bradley Campbell
KEEP/Kotlin跟踪系统中是否有类似的问题? - wnc_21
2个回答

2

对于 kapt,您可以通过以下方式获取源文件夹。

Map<String, String> options = processingEnv.getOptions();
                String generatedPath = options.get("kapt.kotlin.generated");

String path = generatedPath
                    .replaceAll("(.*)tmp(/kapt/debug/)kotlinGenerated",
                            "$1generated/source$2");

很遗憾,它无法在kapt2上工作(请参见问题KT-14070)。

您还可以通过资源编写器创建.kt文件。

Writer w = processingEnv.getFiler().createResource(SOURCE_OUTPUT, "package_name", "Sample.kt")

但是现在你需要调用编译器两次,因为compileDebugKotlin任务在调用compileDebugJavaWithJavac任务之前运行,而后者需要调用javax注释处理器。


0

将您的文件(使用适当的包名称)输出到像 src/build/generated-src/kotlin/your/package/File.kt 这样的目录中。

然后将以下内容添加到您的build.gradle 文件中:

sourceSets {
    main.java.srcDirs += 'build/generated-src/kotlin'
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接