kapt заменяет сгенерированные ссылки на классы error.NonExistentClass, несмотря на то, что kapt.correctErrorTypes включен - PullRequest
0 голосов
/ 11 июля 2019

У меня есть пользовательский процессор аннотаций, который примерно так:

  • генерирует тип аннотации (классы, использующие этот тип, откладываются до последующих раундов)
  • в последующем раунде обработайте классы, используя этот тип, и сгенерируйте для них еще несколько файлов

До сих пор это хорошо работало в 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 ошибка .

...