El procesamiento de anotaciones de Kotlin ignora los elementos con nombres similares

Hace poco convertí la mayoría de mi proyecto a kotlin. Ahora encuentro varios errores inusuales que parecen referirse a bibliotecas de anotaciones. Huelga decir que no sucedió en Java.

Describiré los casos, uno en Dagger y otro en Butterknife.

1. Al tener 2 métodos @Provides en diferentes modelos con el mismo nombre. Por ejemplo, en el archivo "FooProvider.kt" que tiene un método "provideFooOrBar"

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

Y tener otro archivo "BarProvider.kt" con el mismo nombre de método

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

En este caso, Dagger no genera algunas bibliotecas de fábrica y obtengo el siguiente error de compilación: Error:(27, 32) error: cannot find symbol class FooProvider_ProvideFooOrBarFactory

Se puede encontrar un proyecto de ejemplo que reproduce el problema en https://github.com/maxandron/DaggerIssue325

2. Este es un problema al usar Butterknife. Cuando se tienen dos variables anotadas @Bind en dos clases diferentes – ¡Una de ellas simplemente falla al inicializarse en tiempo de ejecución sin ningún error de compilación!

Por ejemplo si tengo:

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

Entonces uno de ellos (o ambos?) Simplemente fallará al inicializar sin ningún error. kotlin.UninitializedPropertyAccessException: lateinit property mFoo has not been initialized un kotlin.UninitializedPropertyAccessException: lateinit property mFoo has not been initialized excepción para ser lanzado cuando se accede al campo.


¿Es algo que estoy haciendo mal en la configuración de Kotlin o es un error de kotlin?

¡Gracias de antemano! Ron

    Estaba teniendo este problema, así que comencé a investigar y es causado porque Kapt está comprobando solamente el nombre del método al compararlos, y se agregan en un sistema , así que los duplicados no se permiten. Lo mismo ocurre con los campos anotados, por lo que actualmente puede tener un nombre de método / campo por anotación.

    He añadido el nombre de la clase al método de equals y las anotaciones fueron manejadas correctamente ahora, pero las pruebas se rompieron y no sé cómo funcionan, así que espero que alguien sepa cómo arreglar esto.

    Resultó ser un error con kapt. He publicado un problema en el rastreador de errores de Kotlin y el problema ahora está marcado como fijo.

    Esta solución se fusionó

    Se debe resolver en Kotlin versión 1.0.2

    Así que para responder algo a la kotlin.UninitializedPropertyAccessException: lateinit cuestión, estaba corriendo en la misma cosa en mi proyecto . Lo que hice que "solucionó el problema" para mí fue eliminar a Butterknife de la clase ofensiva, en este caso fue sólo un viewHolder para mi nuevo RecyclerView ampliable y, a continuación, ejecutar la aplicación de nuevo.

    Ejecutar la aplicación, después de cambiar todo mi @Bind(R.id.my_view_id) a la "vieja escuela" findViewById(R.id.my_view_id) as MyViewType trabajado, pero luego posteriormente Butterknife la misma clase de nuevo a Butterknife y el Butterknife Se fue, y parece que no volverá a menos que algo en la clase cambie, entonces tendrá que repetir este proceso de nuevo.

    Mi sospecha aquí es que esto tiene algo que ver con Kotlin no apoyar la compilación incremental, y de alguna manera al cambiar el código generado automáticamente que se vio obligado a recompilar. Pero podría estar muy lejos de aquí, sólo pensé que compartiría mi experiencia.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.