Spec-Zone.ru › Kotlin 1.9

Что нового в Kotlin 1.5.20

Выпущено: 24 июня 2021

Kotlin 1.5.20 содержит исправления ошибок, обнаруженных в новых функциях 1.5.0, а также различные улучшения инструментария.

Обзор изменений можно найти в посте в блоге о выпуске и этом видео:

Kotlin/JVM

В Kotlin 1.5.20 на платформе JVM внесены следующие обновления:

  • Конкатенация строк с помощью invokedynamic

  • Поддержка аннотаций JSpecify для указания неявности

  • Поддержка вызовов методов, сгенерированных Lombok, в модулях, содержащих код Kotlin и Java

Конкатенация строк с помощью invokedynamic

Kotlin 1.5.20 компилирует конкатенацию строк в динамические вызовы (invokedynamic) на целевых платформах JVM 9+, что соответствует современным версиям Java. Более точно, он использует StringConcatFactory.makeConcatWithConstants() для конкатенации строк.

Чтобы вернуться к конкатенации с помощью StringBuilder.append(), используемой в предыдущих версиях, добавьте параметр компилятора -Xstring-concat=inline.

Узнайте, как добавить параметры компилятора в Gradle, Maven и компиляторе командной строки.

Поддержка аннотаций JSpecify для указания неявности

Компилятор Kotlin может считывать различные типы аннотаций для указания неявности, чтобы передавать информацию о неявности из Java в Kotlin. Версия 1.5.20 добавляет поддержку проекта JSpecify, который включает стандартный объединённый набор аннотаций Java для указания неявности.

С помощью JSpecify можно предоставить более подробную информацию о неявности, чтобы помочь Kotlin поддерживать безопасность при работе с нулевыми значениями при взаимодействии с Java. Можно задавать значения неявности по умолчанию для области объявления, пакета или модуля, указывать параметрическую неявность и многое другое. Более подробную информацию можно найти в руководстве пользователя 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 и реализация могут значительно измениться в любое время.

Подробнее о безопасности при работе с нулевыми значениями и типах платформы.

Поддержка вызовов методов, сгенерированных Lombok, в модулях, содержащих код Kotlin и Java

Плагин Lombok для компилятора экспериментальный. Он может быть удален или изменён в любое время. Используйте его только для оценочных целей. Мы ценим ваши отзывы об этом в YouTrack.

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.

Узнайте, как настроить плагин Lombok для компилятора.

Kotlin/Native

Kotlin/Native 1.5.20 предлагает предварительный просмотр новой функции и улучшений инструментария:

  • Выбор экспорта комментариев KDoc в сгенерированные заголовки Objective-C

  • Исправления ошибок компилятора

  • Улучшенная производительность Array.copyInto() внутри одного массива

Выбор экспорта комментариев KDoc в сгенерированные заголовки Objective-C

Возможность экспортировать комментарии KDoc в сгенерированные заголовки Objective-C экспериментальная. Она может быть удалена или изменена в любое время. Необходима регистрация (см. детали ниже), и вы должны использовать ее только для оценочных целей. Мы ценим ваши отзывы об этом в YouTrack.

Теперь вы можете настроить 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 раз быстрее (в зависимости от количества копируемых объектов) благодаря оптимизациям управления памятью для этого случая.

END_OF_DOCUMENT_MARKER ```

Kotlin/JS

С версией 1.5.20 мы публикуем руководство, которое поможет вам мигрировать ваши проекты к новому бекенду на основе IR для Kotlin/JS.

Руководство по миграции для бекенда JS IR

Новое руководство по миграции для бекенда JS IR определяет проблемы, которые могут возникнуть во время миграции, и предлагает решения для них. Если вы обнаружите какие-либо проблемы, которые не освещены в руководстве, пожалуйста, сообщите об этом в наш отслеживатель проблем.

Gradle

Kotlin 1.5.20 вводит следующие возможности, которые могут улучшить опыт работы с Gradle:

  • Кэширование загрузчиков классов для процессоров аннотаций в kapt

  • Устаревание свойства kotlin.parallel.tasks.in.project build

Кэширование загрузчиков классов для процессоров аннотаций в kapt

Кэширование загрузчиков классов для процессоров аннотаций в kapt является экспериментальным. Оно может быть удалено или изменено в любое время. Используйте его только для оценочных целей. Мы будем признательны за ваши отзывы в YouTrack.

Теперь есть новая экспериментальная возможность, которая позволяет кэшировать загрузчики классов для процессоров аннотаций в 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
}
Последнее изменение: 25 мая 2023 г.
Что нового в Kotlin 1.5.30 Что нового в Kotlin 1.5.0

© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/whatsnew1520.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API