Nos complace anunciar la versión de Kotlin 1.2.40, ¡una actualización de herramientas y corrección de errores para Kotlin 1.2! En esta actualización:

  • Permite añadir más de una dependencia expectedBy en los módulos experimentales multiplataforma
  • Añade soporte para parámetros crossinline suspend en funciones inline
  • Añadela anotación @JvmDefault que permite definir los métodos default de las interfaces de Java (experimental)
  • Añade nuevas inspecciones e intenciones al plugin de IntelliJ de Kotlin
  • Depreca el uso de nombres breves de companion objects en tipos accesibles a través de un tipo extendido sin importarlos de forma cualificada
  • Arregla un montón de problemas en el compilador y el plugin del IDE y proporciona mejoras de rendimiento

La actualización es compatible con todas las versiones de IntelliJ IDEA desde la 2017.1 hasta la 2018.1, así como con Android Studio 3.0, 3.1 y 3.2 Canary.

Nos gustaría agradecer a nuestros contribuyentes cuyas pull requests han sido incluídas en esta versión: Toshiaki KameyamaMikaël PeltierAlexey BelkovmeztihnGaetan ZoritchakYoshinori IsogaiCuihtlauac AlvaradoEgor NeliubaElifarley C.Felix GuoJake WhartonRaluca SauciucRenaud PaquayRodrigo B. de OliveiraValeriy ZhirnovYanis BaturaYuta SakataKenji Tomitayukuku.

La lista completa de cambios de esta versión se encuentra en el changelog.

Mejoras en los proyectos multiplataforma

Esta actualización trae varias mejoras en la característica de proyectos multiplataforma.

Los módulos de plataforma ahora permiten reutilizar el código y proporcionar varias implementaciones específicas de plataforma desde más de un módulo común. Esto se hace añadiendo varias dependencies expectedBy al módulo de plataforma. Por ejemplo:

apply plugin: 'kotlin-platform-jvm' // ... dependencies { expectedBy project(":io-common") expectedBy project(":data-common") // ... }

Bótese que las dependencias expectedBy siguen sin ser transitivas, así que si un módulo común, por ejemplo, app-common, depende de otro, lib-common, entonces, en un módulo de plataforma, se puede proporcionar implementaciones actual para ambos, especificamos de forma manual ambos como dependencias expectedBy, o añadiendo una dependencia expectedBy únicamente en app-common y una dependencia de compilación en una modulo de plataforma existente por lib-common.

Otra mejora en el soporte de los parámetros default en las funciones expect y constructores:

expect class StringMatcher { fun match(value: String, matchStrictly: Boolean = false): Boolean }

Nótese que los valores de parámetros por defecto solo se permiten en las declaraciones expected. No los especifiquéis en sus equivalentes actual.

Parámetros crossinline de funciones suspend

Esta actualización permite utilizar parámetros crossinline en funciones inline de tipos de función suspend, que se pueden llamar dentro de funciones suspendibles anidadas y lambdas:

inline fun schedule(crossinline runner: suspend () -> Unit) { launch(CommonPool) { runner() } }

Soporte para declarar métodos default de interfaces Java

Esta versión incluye soporte experimental para generar métodos por defecto en interfaces Java para la JVM cuando se targetea a la 1.8 o superior. Esta característica está deshabilitada por defecto, y la podéis habilitar pasando el flag de compilación -Xenable-jvm-default. Lo que hace que un miembro de interfaz con un cuerpo se pueda marcar con la anotación @JvmDefault (desde el paquete kotlin.jvm):

interface Foo { @JvmDefault fun foo(): Int = 0 }

Como esta funcionalidad es experimental en Kotlin 1.2.x, su diseño e implementación pueden cambiar en futuras actualizaciones, incluyendo el flag de compilación.

Restricciones de visibilidad para tipos companion objects incluídos en el ámbito a través de herencia

Para proporcionar una migración suave con respecto a cambios potencialmente rompedores en Kotlin 1.3 en relación a los clasificadores visibles a través de companion objects, esta actualización introduce un warning de deprecación y herramientas para migrar en el plugin del IDE.

Ahora, cuando un cuerpo de un tipo Foo, utiliza un nombre de tipo corto (no cualificado) que está declarado en el companion object de un supertipo de Foo, así como en los supertipos de dichos companion objects, sin un import correspondiente, se produce un warning con un quick-fix para añadir el import. Un ejemplo es:

interface Bar { companion object { class FromBarCompanion } } class Foo : Bar { fun foo(): FromBarCompanion = TODO() // Warning: access to this type by short name // is deprecated and is going to be removed. }

En Kotlin 1.3, estos nombres cortos van a ser invisibles a no ser que estén cualificados e importados. El cambio planificado se ha probado ya en proyectos reales con más de 1.5 millones de líneas de código Kotlin en total, y el impacto esperado es mínimo.

Para una descripción detallada y la motivación del cambio, echad un ojo a KT-21515.

Mejoras en el plugin de IntelliJ IDEA

Intenciones para añadir y borrar el return explícito en una lambda

Hay una nueva intención para añadir y borrar returns explícitos etiquetados para el resultado de expresiones en lambdas:

Otros cambios en el plugin del IDE:

  • Nuevas intenciones para añadir y borrar anotaciones  de use-site targets
  • Una inspección para destacar y borrar referencias a companion object no necesarias y explícitas
  • Un montón de mejoras de estabilidad y de rendimiento

Cambios en el compilador

La actualización de Kotlin 1.2.40 arregla varios problemas conocidos en el compilador de Kotlin e introduce mejoras de rendimiento.

El código que genera el compilador es ahora más eficiente en varios casos, por ejemplo al acceder a propiedades privadas de los companion objects, comprobar la igualdad de entradas enum, y comparar números Long. Gracias a nuestro contribuyente Mikaël Peltier.

Cómo actualizar

Para actualizar el plugin, usad *Tools* → *Kotlin* → *Configure Kotlin Plugin Updates* y pulsad el botóm *Check for updates now*. Y no olvidéis actualizar la versión del compilador y de la librería estándar en vuestros scripts de Maven y Gradle.

Como de costumbre si os encontráis cualquier problema con esta nueva versión, sois bienvenidos a pedir ayuda en los foros, en Slack (invitación aquí), o informar sobre problemas en el issue tracker.

¡A Kotlinear!