У меня есть пользовательский процессор аннотаций, который примерно так:
- генерирует тип аннотации (классы, использующие этот тип, откладываются до последующих раундов)
- в последующем раунде обработайте классы, используя этот тип, и сгенерируйте для них еще несколько файлов
До сих пор это хорошо работало в Java. Но недавно я перевел некоторые из своих классов с Java на Kotlin. Настройка все та же.
Но когда я преобразовал класс, используя сгенерированный тип аннотации, в Kotlin, эта ошибка появилась:
ошибка: несовместимые типы: NonExistentClass не может быть преобразован в аннотацию
@ Error.NonExistentClass ()
Стоит отметить, что это происходит только тогда, когда файл находится в Kotlin - другие (Java) файлы также используют ту же аннотацию, и они не выдают ошибку, когда я удаляю аннотацию из файла Kotlin.
После некоторого поиска в Google я обнаружил, что рекомендуемое решение - добавить параметр к build.gradle
:
kapt {
correctErrorTypes = true
}
Однако использование этого не решило проблему. Я посмотрел на сгенерированный файл заглушки, и стало ясно, что kapt
продолжает помещать туда error.NonExistentClass
, несмотря на настройку:
package my.pckg;
import my.pckg.GeneratedAnnotation;
@kotlin.Metadata(...)
public final class MyClass {
private int myAnnotatedField;
@error.NonExistentClass()
public static void myAnnotatedField$annotations() {
}
public final int getMyAnnotatedField() {
return 0;
}
public final void setMyAnnotatedField(int p0) {
}
//...
}
Я думаю, стоит отметить, что:
- заглушка сохранила правильный импорт для сгенерированной аннотации
kapt
перемещена аннотация в статический метод, в то время как исходная сгенерированная аннотация поддерживает только поля
MyClass
выглядит так:
package my.pckg
import my.pckg.GeneratedAnnotation
class MyClass {
@GeneratedAnnotation
var myAnnotatedField: Int = 0
//...
}
А вот и build.gradle
:
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
android {
//...
kotlinOptions {
jvmTarget = '1.8'
}
}
kapt {
correctErrorTypes = true
}
dependencies {
kapt 'custom.annotation.processor'
implementation "androidx.core:core-ktx:+"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.41"
//...
}
Там были другие людей с этой проблемой на SO , но ни одно из предложенных там решений не устранило ее для меня ,
Редактировать: Я провел еще несколько тестов и обнаружил, что сгенерированный тип только заменен на error.NonExistentClass
, когда тип используется в качестве аннотации (как тип объекта или даже дженерик-аргумент работает нормально). На данный момент я считаю, что это может быть просто kapt
ошибка .