Что нового в Kotlin 1.5.20
Дата выпуска: 24 июня 2021 года
Kotlin 1.5.20 содержит исправления проблем, обнаруженных в новых функциях 1.5.0, а также включает различные улучшения инструментов.
Обзор изменений можно найти в записи в блоге о выпуске и в этом видео:
Kotlin/JVM
В Kotlin 1.5.20 на платформе JVM внесены следующие обновления:
Конкатенация строк с помощью invokedynamic
Kotlin 1.5.20 компилирует конкатенацию строк в динамические вызовы (invokedynamic) на целевых JVM 9+, тем самым поддерживая современные версии Java. Более точно, он использует StringConcatFactory.makeConcatWithConstants() для конкатенации строк.
Чтобы вернуться к конкатенации с помощью StringBuilder.append(), используемой в предыдущих версиях, добавьте опцию компилятора -Xstring-concat=inline.
Узнайте, как добавлять опции компилятора в Gradle, Maven и компиляторе командной строки.
Поддержка аннотаций nullness JSpecify
Компилятор Kotlin может читать различные типы аннотаций нулевости, чтобы передавать информацию о нулевости из Java в Kotlin. Версия 1.5.20 добавляет поддержку проекта JSpecify, который включает стандартный унифицированный набор аннотаций нулевости Java.
С помощью JSpecify вы можете предоставить более подробную информацию о нулевости, чтобы помочь Kotlin поддерживать безопасность при работе с null в коде, взаимодействующем с Java. Вы можете задать значения по умолчанию для null-значений в объявлениях, пакетах или модулях, указать параметрическую нулевость и многое другое. Более подробные сведения об этом можно найти в руководстве пользователя JSpecify.
Вот пример того, как Kotlin может обрабатывать аннотации JSpecify:
// JavaClass.java
import org.jspecify.nullness.*;
@NullMarked
public class JavaClass {
public String notNullableString() { return ""; }
public @Nullable String nullableString() { return ""; }
}
// Test.kt
fun kotlinFun() = with(JavaClass()) {
notNullableString().length // OK
nullableString().length // Warning: receiver nullability mismatch
}
В версии 1.5.20 все несоответствия нулевости согласно информации о нулевости, предоставленной JSpecify, сообщаются как предупреждения. Используйте опции компилятора -Xjspecify-annotations=strict и -Xtype-enhancement-improvements-strict-mode для включения строгого режима (с сообщением об ошибке) при работе с JSpecify. Обратите внимание, что проект JSpecify активно развивается. Его API и реализация могут значительно меняться в любое время.
Дополнительная информация о безопасности при работе с null и платформах типов.
Поддержка вызовов методов, сгенерированных Lombok для Java, в модулях с Kotlin и Java-кодом
Kotlin 1.5.20 предоставляет экспериментальный плагин Lombok компилятора. Этот плагин позволяет генерировать и использовать объявления Java Lombok в модулях с Kotlin и Java-кодом. Аннотации Lombok работают только в Java-источниках и игнорируются при использовании в Kotlin-коде.
Плагин поддерживает следующие аннотации:
@Getter,@Setter@NoArgsConstructor,@RequiredArgsConstructor, и@AllArgsConstructor@Data@With@Value
Мы продолжаем работу над этим плагином. Чтобы узнать о текущем состоянии, посетите README плагина Lombok компилятора.
В настоящее время мы не планируем поддерживать аннотацию @Builder. Однако, мы можем рассмотреть этот вопрос, если вы проголосуете за @Builder в YouTrack.
Kotlin/Native
Kotlin/Native 1.5.20 предлагает предварительный просмотр новой функции и улучшений инструментов:
Выбор экспорта комментариев KDoc в сгенерированные заголовки Objective-C
Улучшенная производительность Array.copyInto() внутри одного массива
Выбор экспорта комментариев KDoc в сгенерированные заголовки Objective-C
Теперь вы можете настроить компилятор Kotlin/Native на экспорт документационных комментариев (KDoc) из Kotlin-кода в сгенерированные Objective-C фреймворки, делая их видимыми для потребителей фреймворков.
Например, следующий Kotlin-код с KDoc:
/** * Prints the sum of the arguments. * Properly handles the case when the sum doesn't fit in 32-bit integer. */ fun printSum(a: Int, b: Int) = println(a.toLong() + b)
генерирует следующие заголовки Objective-C:
/**
* Prints the sum of the arguments.
* Properly handles the case when the sum doesn't fit in 32-bit integer.
*/
+ (void)printSumA:(int32_t)a b:(int32_t)b __attribute__((swift_name("printSum(a:b:)")));
Это также хорошо работает со Swift.
Чтобы попробовать эту возможность экспорта комментариев KDoc в заголовки Objective-C, используйте опцию компилятора -Xexport-kdoc. Добавьте следующие строки в build.gradle(.kts) проектов Gradle, из которых вы хотите экспортировать комментарии:
kotlin {
targets.withType<org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget> {
compilations.get("main").kotlinOptions.freeCompilerArgs += "-Xexport-kdoc"
}
}
kotlin {
targets.withType(org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget) {
compilations.get("main").kotlinOptions.freeCompilerArgs += "-Xexport-kdoc"
}
}
Мы были бы очень благодарны, если бы вы поделились своими отзывами с нами, используя этот билет YouTrack.
Исправления ошибок компилятора
Компилятор Kotlin/Native получил несколько исправлений ошибок в 1.5.20. Полный список можно найти в журнале изменений.
Существует важное исправление, которое влияет на совместимость: в предыдущих версиях строковые константы, содержащие неправильные UTF-суперсклады, теряли свои значения во время компиляции. Теперь такие значения сохраняются. Разработчики приложений могут безопасно обновить до 1.5.20 — ничего не сломается. Однако библиотеки, скомпилированные с 1.5.20, несовместимы с более ранними версиями компилятора. Подробности см. в этом вопросе YouTrack.
Улучшенная производительность Array.copyInto() внутри одного массива
Мы улучшили способ работы Array.copyInto(), когда его источник и место назначения — один и тот же массив. Теперь такие операции выполняются до 20 раз быстрее (в зависимости от количества копируемых объектов) благодаря оптимизациям управления памятью для этого случая.
Kotlin/JS
С версией 1.5.20 мы публикуем руководство, которое поможет вам мигрировать ваши проекты к новому бекенду на основе IR для Kotlin/JS.
Руководство по миграции на бекенд JS IR
Новое руководство по миграции на бекенд JS IR определяет проблемы, с которыми вы можете столкнуться во время миграции, и предоставляет решения для них. Если вы обнаружите какие-либо проблемы, которые не описаны в руководстве, пожалуйста, сообщите о них в наш трекер проблем.
Gradle
Kotlin 1.5.20 включает следующие функции, которые могут улучшить работу с Gradle:
Кэширование загрузчиков классов для обработчиков аннотаций в kapt
Теперь есть новая экспериментальная функция, которая позволяет кэшировать загрузчики классов для обработчиков аннотаций в kapt. Эта функция может повысить скорость kapt при последовательных запусках Gradle.
Чтобы включить эту функцию, используйте следующие свойства в вашем файле gradle.properties.
# positive value will enable caching # use the same value as the number of modules that use kapt kapt.classloaders.cache.size=5 # disable for caching to work kapt.include.compile.classpath=false
Узнайте больше о kapt.
Устаревание свойства kotlin.parallel.tasks.in.project
С этим выпуском параллельная компиляция Kotlin управляется флагом параллельного выполнения Gradle --parallel. Используя этот флаг, Gradle выполняет задачи параллельно, повышая скорость компиляции и более эффективно используя ресурсы.
Вам больше не нужно использовать свойство kotlin.parallel.tasks.in.project. Это свойство устарело и будет удалено в следующем крупном релизе.
Стандартная библиотека
Kotlin 1.5.20 изменяет платформозависимые реализации нескольких функций для работы с символами и в результате обеспечивает унификацию на разных платформах:
Поддержка всех Unicode-цифр в Char.digitToInt() для Kotlin/Native и Kotlin/JS
Унификация реализаций Char.isLowerCase()/isUpperCase() на разных платформах
Поддержка всех Unicode-цифр в Char.digitToInt() для Kotlin/Native и Kotlin/JS
Char.digitToInt() возвращает числовое значение десятичной цифры, которую представляет символ. До версии 1.5.20 функция поддерживала все символы Unicode-цифр только для Kotlin/JVM: реализации на платформах Native и JS поддерживали только ASCII-цифры.
Теперь, как с Kotlin/Native, так и с Kotlin/JS, вы можете вызвать Char.digitToInt() на любом символе Unicode-цифры и получить его числовое представление.
fun main() {
//sampleStart
val ten = '\u0661'.digitToInt() + '\u0039'.digitToInt() // ARABIC-INDIC DIGIT ONE + DIGIT NINE
println(ten)
//sampleEnd
}
Унификация реализаций Char.isLowerCase()/isUpperCase() на разных платформах
Функции Char.isUpperCase() и Char.isLowerCase() возвращают булевое значение в зависимости от регистра символа. Для Kotlin/JVM реализация проверяет как General_Category, так и Other_Uppercase/Other_Lowercase свойства Unicode.
До версии 1.5.20 реализации на других платформах работали по-другому и учитывали только общую категорию. В версии 1.5.20 реализации унифицированы на всех платформах и используют оба свойства для определения регистра символа:
fun main() {
//sampleStart
val latinCapitalA = 'A' // has "Lu" general category
val circledLatinCapitalA = 'Ⓐ' // has "Other_Uppercase" property
println(latinCapitalA.isUpperCase() && circledLatinCapitalA.isUpperCase())
//sampleEnd
}
© 2010–2022 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/whatsnew1520.html