Почему не запускается капт? - PullRequest
0 голосов
/ 26 ноября 2018

Я пытаюсь реализовать генерацию кода на основе аннотаций в проекте 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.

Я бы очень признателен за помощь в понимании того, что я делаю не так.

Заранее спасибо!

...