Kotlin 1.2-beta2

Nos complace anunciar la segunda Beta de Kotlin 1.2. En esta versión, nos hemos centrado mayormente en pequeños cambios internos y en añadir algunas cosas pendientes a nuestra historia de proyectos multiplataforma.

Nos gustaría agradecer a Andrey Mischenko, Francesco Vasco, Jake Wharton, Jonathan Leitschuh, Kirill Rakhman, Pap Lorinc, Paul Merlin, Raluca Sauciuc, Toshiaki Kameyama, y Yoshinori Isogai por sus contribuciones a Kotlin 1.2 Beta2.

La lista completa de cambios desde la 1.2-Beta se puede encontrar aquí, con la lista de cambios más relevante a continuación:

Compilador

Mejoras de rendimiento en el compilador

Hemos incluído un número de mejoras de rendimiento en el compilador desde la última versión pública. De media, los tiempos de construcción han decrementado en casi un 20%.

Normalización de código generado para las herramientas de postprocesado de bytecode

Desde la versión 1.0, Kotlin soporta expresiones con control de flujo complejo, como expresiones try-catch y llamadas a función inline. Dicho código es válido de acuerdo con la especificación de la JVM. Por desgracia, algunas herramientas de procesado de bytecode no gestionan dicho código demasiado bien cuando dichas expresiones se encuentran en las llamadas de los argumentos de los constructores.

Para mitigar este problema para los usuarios de dichas herramientas de procesado, hemos añadido una nueva opción de la línea de comandos (-Xnormalize-constructor-calls=MODE) que instruye al compilador a generar bytecode más parecido a Java para dichas construcciones. Donde MODE es una de las siguientes opciones:

  • disable (por defecto) – genera bytecode de la misma forma que Kotlin 1.0 y 1.1
  • enable – genera bytecode similar a Java para las llamadas a constructores. Esto puede cambiar el orden en el que las clases se cargan e inicializan
  • preserve-class-initialization – genera bytecode similar a Java para las llamadas a los constructores, asegurándose de que el orden de inicialización de las clases se mantenga igual. Esto puede afectar al rendimiento en general de vuestra aplicación, así que usadlo únicamente si tenéis un estado complejo compartido entre vuestras clases que se actualiza durante la inicialización de las clases.

La solución alternativa “manual” es almacenar los valores de las sub-expresiones con contro lde flujo en variables, en vez de evaluarlas directamente dentro de los argumento de la llamada. De forma similar a lo que hace -Xnormalize-constructor-calls=enable.

Echad un ojo a KT-19251 para más detalles.

Proyectos multiplataforma

Hay numerosas mejoras en relación al soporte de los proyectos multiplataforma, principalmente en el IDE, pero no exclusivamente. Las más destacadas son las siguientes:

Anotaciones para escribir tests unitarios multiplataforma

Ahora es posible escribir tests en los proyectos comunes de forma que se compilen y ejecuten en cada proyecto de plataforma. Se proporcionan 4 anotaciones en el paquete kotlint-test para anotar los tests en el código común: @Test, @Ignore, @BeforeTest y @AfterTest.
En la plataforma JVM las anotaciones se mapean a las equivalentes en las anotaciones de JUnit 4 y
En la plataforma JavaScript ya están disponibles en JS su soporte desde la versión 1.1.4, más información en este anuncio.

Para usarlas tenéis que añadir una dependencia a kotlin-test-annotations-common en vuestro módulo común, a kotlin-test-junit en vuestro módulo de la JVM, y a kotlin-test-js en los módulos de JavaScript.

“implement” renombrado a “expectedBy”

Siguiendo la nomenclatura de expect / actual, hemos renombrado la configuración de dependencia de Gradle implement (que se usaba por los proyectos de plataforma para apuntar a su correspondiente proyecto común) a expectedBy, y el nombre viejo queda deprecado.

Corregida la importación de proyectos multiplataforma con múltiples módulos

Había un problema bastante molesto con referencias a código común en un módulo de plataforma que no se resolvían en un proyecto multiplataforma con múltiples módulos. Ahora hemos arreglado la importación dichos proyectos desde Gradle de forma que no tendréis que añadir dependencias extras de forma manual para hacer que dichas referencias se resuelvan.

Plugin de gradle

Renombramos warningsAsErrors a allWarningsAsErrors

Hemos renombrado el flag introducido en Kotlin 1.2 Beta llamado warningAsErrors a allWarningsAsError:

compileKotlin.kotlinOptions.allWarningsAsErrors = true

Librería estándar

Closeable.use llama a Throwable.addSupressed en los sitios en los que está disponible

Al final, Closeable.use por fin llama a Throwable.addSupressed cuando se ha lanzado una excepción mientras se cerraba el recurso tras otra excepción. Para habilitar este comportamiento, tenéis que añadir kotlin-stdlib-jdk7 en vuestras dependencias.

Notas de versión preeliminar

Como con otras versiones hito, no ofrecemos ningún tipo de garantía de compatibilidad para las nuevas características del lenguaje y de la librería estándar.
Cualquier cosa introducida en una versión hito de la 1.2 está sujeta a cambiar antes de la versión final de la 1.2.
Cuando lleguemos a la RC final, el compilador rechazará todos los binarios producidos por versiones preeliminares y eso os forzará a recompilar todo lo que hayáis compilado con las 1.2-Mx, 1.2-Beta o 1.2-Beta2.
Sin embargo, todo el código compilado por la 1.1.x y versiones anteriores será siendo perfectamente válido sin recompilación.

Cómo probar

En Maven/Gradle: Añadid http://dl.bintray.com/kotlin/kotlin-eap-1.2 como repositorio en vuestro build script y en vuestros proyectos; usad 1.2.0-beta-88 como el número de versión para el compilador y la librería estándar.

En IntelliJ IDEA: Id a ToolsKotlinConfigure Kotlin Plugin Updates,y seleccionad “Early Access Preview 1.2” en el desplegable Update channel, y pulsad Check for updates.

El compilador de línea de comandos se puede descargar desde la página de versión de GitHub.

En try.kotlinlang.org: Usad el desplegable de la esquina inferior derecha para cambiar la versión del compilador a la 1.2‑Beta2 (próximamente).