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 的错误跟踪器上,问题现在被标记为已修复。
应该在 Kotlin 1.0.2 版本中解决
我最近将大部分项目转换为 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 的错误跟踪器上,问题现在被标记为已修复。
应该在 Kotlin 1.0.2 版本中解决