У меня есть обработчик аннотации java, который генерирует кучу java файлов во время компиляции. Я хотел бы сделать сгенерированные классы более приятными для использования в kotlin, добавив методы расширения. Мне говорили на форумах kotlin, что я мог бы попробовать написать файл kotlin, содержащий мои функции расширения. Я пробовал это, я использовал объект Filer
для создания этого файла, выводящего его в каталог StandardLocations.SOURCE_OUTPUT. Intellij может видеть мой сгенерированный класс, и я могу использовать функции расширения по назначению, но приложение не будет компилироваться, потому что компилятор не может найти новый файл kotlin. Есть ли способ написать новый файл kotlin, который будет получен компилятором kotlin?
Как сгенерировать файл kotlin из обработчика аннотаций?
Ответ 1
Для 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 перед вызовом обработчика аннотации javax с помощью задачи compileDebugJavaWithJavac)
Ответ 2
Выведите ваши файлы (с соответствующими именами пакетов) в каталог, например src/build/generated-src/kotlin/your/package/File.kt
и добавьте это в свой build.gradle
:
sourceSets {
main.java.srcDirs += 'build/generated-src/kotlin'
}