Spec-Zone.ru › Kotlin 1.7

Что нового в 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-проектах. Найдите примеры в примере Kotlin с CocoaPods.

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

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

  • Если у вашего Kotlin Pod есть зависимость Git, HTTP или specRepo Pod, вы также должны указать ее в 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, недоступны для использования из проекта, опубликованного с более ранних версий.

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

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

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

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

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

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

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

Теперь стандартная библиотека предоставляет экспериментальные расширения для java.nio.file.Path. Работа с современной JVM API файлов по-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, а нечувствительная к регистру — соответствие регулярному выражению.

END_OF_DOCUMENT_MARKER

Kotlin Android Extensions

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

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

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

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

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

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

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

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

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

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

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

Последнее изменение: 06 сентября 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