Spec-Zone.ru › Kotlin 1.6

Что нового в Kotlin 1.4.20

Дата выпуска: 23 ноября 2020 года

Kotlin 1.4.20 предлагает ряд новых экспериментальных возможностей и предоставляет исправления и улучшения для существующих функций, включая те, что были добавлены в 1.4.0.

Вы также можете узнать о новых функциях с помощью дополнительных примеров в этой статье блога.

Kotlin/JVM

Улучшения Kotlin/JVM предназначены для того, чтобы поддерживать его на уровне функций современных версий Java:

  • Целевая платформа Java 15

  • Конкатенация строк invokedynamic

Целевая платформа Java 15

Теперь Java 15 доступна как целевая платформа Kotlin/JVM.

Конкатенация строк invokedynamic

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

Kotlin 1.4.20 может компилировать конкатенацию строк в динамические вызовы на JVM 9+ целевых платформах, что повышает производительность.

В настоящее время эта функция является экспериментальной и охватывает следующие случаи:

  • String.plus в операторной (a + b), явной (a.plus(b)), и ссылочной ((a::plus)(b)) формах.

  • toString в инлайновых и данных классах.

  • шаблоны строк, за исключением шаблонов с одним неконстантным аргументом (см. KT-42457).

Чтобы включить invokedynamic конкатенацию строк, добавьте -Xstring-concat опцию компилятора со следующим значениями:

  • indy-with-constants для выполнения invokedynamic конкатенации строк с StringConcatFactory.makeConcatWithConstants().

  • indy для выполнения invokedynamic конкатенации строк с StringConcatFactory.makeConcat().

  • inline чтобы вернуться к классической конкатенации через StringBuilder.append().

Kotlin/JS

Kotlin/JS продолжает быстро развиваться, и в версии 1.4.20 вы найдете ряд экспериментальных функций и улучшений:

  • Изменения в Gradle DSL

  • Новые шаблоны мастера

  • Игнорирование ошибок компиляции с помощью компилятора IR

Изменения в Gradle DSL

Gradle DSL для Kotlin/JS получает ряд обновлений, которые упрощают настройку и кастомизацию проекта. Это включает в себя изменения в настройке webpack, модификации автоматически сгенерированного файла package.json, и улучшенный контроль над транзитными зависимостями.

Единая точка для настройки webpack

Новый блок конфигурации commonWebpackConfig доступен для целевой платформы браузер. Внутри него можно настроить общие параметры из одной точки, вместо того, чтобы дублировать конфигурации для webpackTask, runTask, и testTask.

Чтобы включить поддержку CSS по умолчанию для всех трех задач, добавьте следующий фрагмент в build.gradle(.kts) вашего проекта:

browser {
    commonWebpackConfig {
        cssSupport.enabled = true
    }
    binaries.executable()
}

Подробнее о настройке сборки webpack.

Настройка package.json из Gradle

Для большего контроля над управлением пакетами и распространением Kotlin/JS, вы теперь можете добавлять свойства в файл проекта package.json через Gradle DSL.

Чтобы добавить пользовательские поля в ваш package.json, используйте функцию customField в блоке packageJson компиляции:

kotlin {
    js(BOTH) {
        compilations["main"].packageJson {
            customField("hello", mapOf("one" to 1, "two" to 2))
        }
    }
}

Подробнее о package.json настройке.

Селективные разрешения зависимостей Yarn

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

Kotlin 1.4.20 предоставляет способ настройки селективных разрешений зависимостей Yarn - механизм переопределения зависимостей пакетов, от которых вы зависите.

Вы можете использовать его через YarnRootExtension внутри YarnPlugin в Gradle. Для влияния на разрешенную версию пакета для вашего проекта используйте функцию resolution, передавая селектор имени пакета (как указано Yarn) и версию, к которой он должен разрешиться.

rootProject.plugins.withType<YarnPlugin> {
    rootProject.the<YarnRootExtension>().apply {
        resolution("react", "16.0.0")
        resolution("processor/decamelize", "3.0.0")
    }
}

Здесь, все ваши npm зависимости, которые требуют react, получат версию 16.0.0, а processor получит свою зависимость decamelize как версию 3.0.0.

Отключение гранулярных рабочих пространств

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

Для ускорения времени сборки плагин Kotlin/JS Gradle устанавливает только зависимости, необходимые для конкретной задачи Gradle. Например, пакет webpack-dev-server устанавливается только при выполнении одной из задач *Run, а не при выполнении задачи assemble. Такое поведение может потенциально создавать проблемы при одновременном запуске нескольких процессов Gradle. При конфликте требований зависимостей два установленных npm пакета могут вызвать ошибки.

Для решения этой проблемы Kotlin 1.4.20 включает возможность отключения этих так называемых гранулярных рабочих пространств. Эта функция в настоящее время доступна через YarnRootExtension внутри YarnPlugin в Gradle. Для использования добавьте следующий фрагмент в ваш build.gradle.kts файл:

rootProject.plugins.withType<YarnPlugin> {
    rootProject.the<YarnRootExtension>().disableGranularWorkspaces()
}

Новые шаблоны мастера

Чтобы предоставить вам более удобные способы кастомизации проекта во время создания, мастер проектов Kotlin поставляется с новыми шаблонами для приложений Kotlin/JS:

  • Приложение браузера - минимальный проект Kotlin/JS Gradle, работающий в браузере.

  • React приложение - приложение React, использующее соответствующие kotlin-wrappers. Предоставляет опции для включения интеграций стилей, навигационных компонентов или контейнеров состояния.

  • Приложение Node.js - минимальный проект для работы в среде исполнения Node.js. Поставляется с возможностью непосредственного включения экспериментального пакета kotlinx-nodejs.

Узнайте, как создать приложения Kotlin/JS из шаблонов.

Игнорирование ошибок компиляции с помощью компилятора IR

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

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

Существуют две политики толерантности для этого режима:

  • SEMANTIC: компилятор примет код, который синтаксически корректен, но не имеет смысла семантически, например, val x: String = 3.

  • SYNTAX: компилятор примет любой код, даже если он содержит синтаксические ошибки.

Чтобы разрешить компиляцию с ошибками, добавьте опцию компилятора -Xerror-tolerance-policy= со значениями, указанными выше.

Узнайте больше о игнорировании ошибок компиляции с помощью компилятора Kotlin/JS IR.

END_OF_DOCUMENT_MARKER

Kotlin/Native

Приоритетами Kotlin/Native в версии 1.4.20 являются производительность и доработка существующих функций. Вот заметные улучшения:

  • Анализ утечек

  • Улучшения производительности и исправления ошибок

  • Включение оборачивания исключений Objective-C

  • Улучшения плагина CocoaPods

  • Поддержка библиотек Xcode 12

Анализ утечек

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

Kotlin/Native получает прототип нового механизма анализа утечек. Он повышает производительность выполнения, размещая некоторые объекты в стеке вместо кучи. Этот механизм демонстрирует среднее увеличение производительности на 10% по нашим бенчмаркам, и мы продолжаем его улучшать, чтобы ещё больше ускорять программу.

Анализ утечек выполняется в отдельной фазе компиляции для релизных сборок (с опцией компилятора -opt).

Если вы хотите отключить фазу анализа утечек, используйте опцию компилятора -Xdisable-phases=EscapeAnalysis.

Улучшения производительности и исправления ошибок

Kotlin/Native получает улучшения производительности и исправления ошибок в различных компонентах, включая добавленные в 1.4.0, например, механизм обмена кодом между платформами.

Включение оборачивания исключений Objective-C

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

Kotlin/Native теперь может обрабатывать исключения, сгенерированные кодом Objective-C, во время выполнения, чтобы избежать аварий программы.

Вы можете включить оборачивание исключений NSException в Kotlin-исключения типа ForeignException. Они хранят ссылки на исходные NSException. Это позволяет получить информацию об источнике ошибки и корректно обработать её.

Для включения оборачивания исключений Objective-C, укажите опцию -Xforeign-exception-mode objc-wrap в вызове cinterop или добавьте свойство foreignExceptionMode = objc-wrap в файл .def. Если вы используете интеграцию CocoaPods, укажите опцию в блоке скрипта сборки pod {} зависимости, например:

pod("foo") {
   extraOpts = listOf("-Xforeign-exception-mode”, “objc-wrap")
}

По умолчанию поведение не меняется: программа завершается при возникновении исключения из Objective-C кода.

Улучшения плагина CocoaPods

Kotlin 1.4.20 продолжает набор улучшений в интеграции с CocoaPods. Теперь доступны следующие новые возможности:

  • Улучшенное выполнение задач

  • Расширенный DSL

  • Обновленная интеграция с Xcode

Улучшенное выполнение задач

Плагин CocoaPods получает улучшенный поток выполнения задач. Например, если вы добавляете новую зависимость CocoaPods, существующие зависимости не перестраиваются. Добавление дополнительного целевого объекта также не влияет на перестройку зависимостей для уже существующих.

Расширенный DSL

DSL для добавления зависимостей CocoaPods в ваш Kotlin-проект получил новые возможности.

В дополнение к локальным Pods и Pods из репозитория CocoaPods, вы можете добавить зависимости к следующим типам библиотек:

  • Библиотека из пользовательского репозитория спецификаций.

  • Удаленная библиотека из Git-репозитория.

  • Библиотека из архива (также доступна по произвольному HTTP-адресу).

  • Статическая библиотека.

  • Библиотека с пользовательскими опциями cinterop.

Подробнее о добавлении зависимостей CocoaPods в Kotlin-проекты. Примеры вы найдете в примере Koltin с CocoaPods.

Обновленная интеграция с Xcode

Для корректной работы с Xcode, Kotlin требует некоторых изменений в Podfile:

  • Если у вашего Kotlin Pod есть Git, HTTP или specRepo зависимость, вы должны указать её в Podfile.

  • При добавлении библиотеки из пользовательской спецификации, также укажите местоположение спецификаций в начале вашего Podfile.

Теперь ошибки интеграции имеют подробное описание в IDEA. Поэтому, если у вас есть проблемы с Podfile, вы сразу узнаете, как их исправить.

Узнайте больше о создании Kotlin Pods.

Поддержка библиотек Xcode 12

Мы добавили поддержку новых библиотек, поставляемых с Xcode 12. Теперь вы можете использовать их из Kotlin-кода.

Kotlin Multiplatform

Обновлённая структура публикаций многоплатформенных библиотек

Начиная с Kotlin 1.4.20, отдельной публикации метаданных больше нет. Метаданные теперь включены в основную публикацию (корневую), которая представляет всю библиотеку и автоматически разрешается до соответствующих платформенных артефактов, когда добавляется в качестве зависимости к общему набору источников.

Узнайте больше о публикации многоплатформенной библиотеки.

Совместимость с предыдущими версиями

Это изменение структуры нарушает совместимость между проектами с иерархической структурой проекта. Если многоплатформенный проект и библиотека, от которой он зависит, оба имеют иерархическую структуру проекта, то вам нужно обновить их до Kotlin 1.4.20 или выше одновременно. Библиотеки, опубликованные с Kotlin 1.4.20, недоступны для использования из проекта, опубликованного с более ранними версиями.

Проекты и библиотеки без иерархической структуры проекта остаются совместимыми.

END_OF_DOCUMENT_MARKER ```

Стандартная библиотека

Стандартная библиотека Kotlin 1.4.20 предлагает новые расширения для работы с файлами и улучшенную производительность.

  • Расширения для java.nio.file.Path

  • Улучшенная производительность функции String.replace

Расширения для java.nio.file.Path

Расширения для java.nio.file.Path являются Экспериментальными. Они могут быть удалены или изменены в любое время. Требуется включение (см. подробности ниже). Используйте их только для оценочных целей. Мы ценим ваши отзывы о них в YouTrack.

Теперь стандартная библиотека предоставляет экспериментальные расширения для java.nio.file.Path. Работа с современным API файлов JVM в стиле Kotlin теперь похожа на работу с java.io.File расширениями из пакета kotlin.io.

// construct path with the div (/) operator
val baseDir = Path("/base")
val subDir = baseDir / "subdirectory" 

// list files in a directory
val kotlinFiles: List<Path> = Path("/home/user").listDirectoryEntries("*.kt")

Эти расширения доступны в пакете kotlin.io.path в модуле kotlin-stdlib-jdk7. Чтобы использовать эти расширения, включите аннотацию @ExperimentalPathApi (см. требования).

Улучшенная производительность функции String.replace

Новая реализация String.replace() ускоряет выполнение функции. Чувствительная к регистру версия использует цикл замены вручную, основанный на indexOf, в то время как нечувствительная к регистру использует сопоставление с регулярными выражениями.

Kotlin Android Extensions

В версии 1.4.20 плагин Kotlin Android Extensions устарел, а генератор реализации Parcelable переместился в отдельный плагин.

  • Устаревание синтетических представлений

  • Новый плагин для генератора реализации Parcelable

Устаревание синтетических представлений

Синтетические представления были представлены в плагине Kotlin Android Extensions некоторое время назад, чтобы упростить взаимодействие с элементами пользовательского интерфейса и сократить объём кода. Теперь Google предлагает родной механизм, который выполняет то же самое - связывание представлений Android Jetpack, и мы устареваем синтетические представления в пользу их.

Мы вынесли генератор реализаций Parcelable из kotlin-android-extensions и начали цикл устаревания для остальной части — синтетических представлений. Пока они будут работать с предупреждением об устаревании. В будущем вам нужно будет переключить свой проект на другое решение. Вот руководство, которое поможет вам мигрировать свой Android-проект от синтетики к связыванию представлений.

Новый плагин для генератора реализации Parcelable

Генератор реализации Parcelable теперь доступен в новом плагине kotlin-parcelize. Используйте этот плагин вместо kotlin-android-extensions.

kotlin-parcelize и kotlin-android-extensions не могут быть применены вместе в одном модуле.

Аннотация @Parcelize перемещена в пакет kotlinx.parcelize.

Узнайте больше о генераторе реализаций Parcelable в документации Android.

Последнее изменение: 07 апреля 2022
Что нового в Kotlin 1.4.30 Что нового в Kotlin 1.4

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

Spec-Zone.ru

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