Я пытаюсь реализовать генерацию кода на основе аннотаций в проекте Kotlin, но обработка аннотаций, похоже, не запускается.
Проект в целом состоит из трех отдельных проектов:
- "библиотечный модуль", который определяет аннотации и некоторые классы, которые их применяют,
- a "процессор-module ", который определяет процессор аннотаций, который генерирует код Kotlin на основе присутствия классов, аннотированных вышеупомянутыми аннотациями, и
- родительский проект верхнего уровня
Эта установка являетсяМногопроектная сборка Gradle имеет следующую структуру:
.
├── library-module
│ ├── build.gradle
│ └── src
│ └── main
│ └── java
│ ├── MyAnnotatedClass.kt
│ └── MyAnnotation.kt
│
├── processor-module
│ ├── build.gradle
│ └── src
│ └── main
│ ├── java
│ │ └── MyAnnotationProcessor.kt
│ └── resources
│ └── META-INF
│ └── services
│ └── javax.annotation.processing.Processor
│
└── build.gradle
library-module / build.gradle :
Эта сборка для этого проекта не содержит никакой логикисвязанные с обработкой аннотаций.Однако исходный код зависит от кода, который будет сгенерирован процессором аннотаций.
процессор-модуль / build.gradle :
dependencies {
compileOnly project(':library-module')
}
Этот проекттакже имеется файл src/main/resources/META-INF/services/javax.annotation.processing.Processor
, содержащий одну строку, представляющую собой полное имя класса процессора аннотаций.
build.gradle верхнего уровня
plugins {
id "org.jetbrains.kotlin.kapt" version "1.3.10"
}
dependencies {
implementation project(':library-module')
compileOnly project(':processor-module')
kapt project(':processor-module')
}
На данный момент я жестко запрограммировал MyAnnotationProcessor.process()
, чтобы просто безоговорочно написать исходный файл:
@SupportedSourceVersion(SourceVersion.RELEASE_8)
@SupportedAnnotationTypes("MyAnnotation")
@SupportedOptions(RoutesProcessor.KAPT_KOTLIN_GENERATED_OPTION_NAME)
class MyAnnotationProcessor : AbstractProcessor() {
companion object {
const val KAPT_KOTLIN_GENERATED_OPTION_NAME = "kapt.kotlin.generated"
}
override fun process(annotations: MutableSet<out TypeElement>, roundEnv: RoundEnvironment): Boolean {
val greeterClass = ClassName("", "Greeter")
val file = FileSpec.builder("", "HelloWorld")
.addType(TypeSpec.classBuilder("Greeter")
.primaryConstructor(FunSpec.constructorBuilder()
.addParameter("name", String::class)
.build())
.addProperty(PropertySpec.builder("name", String::class)
.initializer("name")
.build())
.addFunction(FunSpec.builder("greet")
.addStatement("println(%S)", "Hello, \$name")
.build())
.build())
.build()
file.writeTo(System.out)
return true
}
}
... но ничего не получается, когда сборка выполняется через Gradle или IntelliJ.
Я бы очень признателен за помощь в понимании того, что я делаю не так.
Заранее спасибо!