尽管启用了kapt.correctErrorTypes,但kapt仍将使用error.NonExistentClass替换生成的类引用

时间:2019-07-11 18:58:37

标签: gradle kotlin annotation-processing kapt

我有一个自定义注释处理器,可以大致执行以下操作:

  • 生成注释类型(使用该类型的类将推迟到以后的几轮使用)
  • 在下一轮中,使用这种类型处理类并为其生成更多文件

到目前为止,这在Java中效果很好。但是最近,我一直在将某些类从Java转换为Kotlin。设置仍然相同。 但是,当我使用生成的注释类型将类转换为Kotlin时,会弹出此错误:

  

错误:不兼容的类型:NonExistentClass无法转换为Annotation       @ error.NonExistentClass()

值得注意的是,只有在文件位于Kotlin中时才会发生这种情况-其他(Java)文件也使用相同的注释,并且当我从Kotlin文件中删除注释时它们不会产生错误。

经过一番谷歌搜索,我发现建议的解决方案是将an option添加到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"

    //...
}

have been other people with this problem on SO,但那里没有建议的解决方案为我解决。

编辑:我进行了更多测试,发现当类型用作注释时,生成的类型仅由error.NonExistentClass替换为kapt(作为对象类型甚至泛型参数,它都可以正常工作)。在这一点上,我认为这可能只是SECRET_KEY bug

0 个答案:

没有答案