Kotlin 注释处理忽略具有相似名称的项目

Kotlin annotation processing ignores items with similar names

我最近将大部分项目转换为 Kotlin。现在我遇到了几个不寻常的错误,这些错误似乎都与注释库有关。不用说,它没有发生在 Java.

我将描述案例 - 一个在 Dagger 中,一个在 Butterknife 中。

1。 当在不同模型中有 2 个 @Provides 同名方法时。 例如在文件 "FooProvider.kt" 中有一个 "provideFooOrBar" 方法

@Module
class FooProvider(private val view: FooActivity) {
    ... 
    @Provides @FooScope fun provideView() = view
    @Provides @FooScope fun provideFooOrBar() = Foo()
}

并且有另一个文件 "BarProvider.kt" 具有相同的方法名称

@Module
class BarProvider(private val view: BarActivity) {
    ...
    @Provides @BarScope fun provideView() = view
    @Provides @BarScope fun provideFooOrBar() = Bar()
}

在这种情况下,Dagger 无法生成一些工厂库,我得到以下编译错误: Error:(27, 32) error: cannot find symbol class FooProvider_ProvideFooOrBarFactory

可以在 https://github.com/maxandron/DaggerIssue325

找到重现该问题的示例项目

2。 这是使用 Butterknife 时的一个问题。当在两个不同的 类 中有两个 @Bind 注释变量时 - 其中一个在运行时无法初始化而没有任何编译错误!

例如,如果我有:

class FooActivity {
    @Bind(R.id.foo) lateinit var mFoo: View
}
class NotFooActivity {
    @Bind(R.id.not_foo) lateinit var mFoo: View
}

然后其中之一(或两者?)将无法初始化而不会出现任何错误。导致在访问字段时抛出 kotlin.UninitializedPropertyAccessException: lateinit property mFoo has not been initialized 异常。


是我在配置 Kotlin 时做错了什么还是 kotlin 错误?

提前致谢! 罗恩

所以为了稍微回答 kotlin.UninitializedPropertyAccessException: lateinit 问题,我 运行 在我的 project 中遇到了完全相同的事情。我所做的 "solved the issue" 对我来说是从有问题的 class 中删除 Butterknife,在这种情况下,它只是我新的可扩展 RecyclerView 的 viewHolder,然后再次 运行 应用程序。

运行 应用程序,在将我所有的 @Bind(R.id.my_view_id) 切换到 "old school" findViewById(R.id.my_view_id) as MyViewType 之后工作,但随后我切换了相同的 class 返回Butterknife 并且 UninitializedPropertyAccessException 消失了,似乎它不会回来,除非 class 中的某些内容发生变化,然后你'将不得不再次重复此过程。

这里我怀疑这与Kotlin不支持增量编译有关,不知何故通过更改自动生成的代码强制重新编译。但我可能离这里很远,只是想分享我的经验。

我遇到了这个问题,所以我开始调查,这是因为 Kapt is only checking the method name when comparing them, and they are added in a set 造成的,因此不允许重复。带注释的字段也是如此,因此目前每个注释可以有一个 method/field 名称。

我在 equals 方法中添加了 class 名称,现在注释已正确处理,但测试失败,我不知道它们是如何工作的,所以我希望有人知道如何解决这个问题。

原来是kapt的bug。 我 posted an issue 在 Kotlin 的错误跟踪器上,问题现在被标记为已修复。

This solution was merged

应该在 Kotlin 1.0.2 版本中解决