Spec-Zone.ru › Kotlin 1.6

Руководство по совместимости для Kotlin 1.6

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

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

Основные термины

В этом документе мы вводим несколько видов совместимости:

  • исходный код: изменение, несовместимое с исходным кодом, останавливает компиляцию кода, который раньше компилировался без ошибок или предупреждений.

  • бинарный: два бинарных артефакта считаются бинарно совместимыми, если их обмен не приводит к ошибкам загрузки или компоновки.

  • поведенческий: изменение считается поведенчески несовместимым, если одна и та же программа демонстрирует разное поведение до и после применения изменения.

Обратите внимание, что эти определения приведены только для чистого Kotlin. Совместимость кода Kotlin с точки зрения других языков (например, Java) выходит за рамки данного документа.

Язык

Сделать операторы when с перечислениями, запечатанными типами и булевыми значениями исчерпывающими по умолчанию

Вопрос: KT-47709

Компонент: Язык Kotlin

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin 1.6 будет предупреждать о том, что оператор when с перечислением, запечатанным типом или булевым значением является неисчерпывающим

Цикл устаревания:

  • 1.6.0: ввести предупреждение, если оператор when с перечислением, запечатанным типом или булевым значением является неисчерпывающим (ошибка в режиме пошагового выполнения)

  • 1.7.0: сделать это предупреждение ошибкой

Устаревание запутанной грамматики в операторах when с объектом

Вопрос: KT-48385

Компонент: Язык Kotlin

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin 1.6 устареет несколько запутанных грамматических конструкций в when выражениях условия

Цикл устаревания:

  • 1.6.20: ввести предупреждение об устаревании для затронутых выражений

  • 1.8.0: сделать это предупреждение ошибкой

  • >= 1.8: использовать некоторые устаревшие конструкции для новых функций языка

Запрет доступа к членам класса в вызове суперконструктора его компаньонов и вложенных объектов

Вопрос: KT-25289

Компонент: Язык Kotlin

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin 1.6 будет сообщать об ошибке для аргументов вызова суперконструктора компаньонов и обычных объектов, если получатель таких аргументов ссылается на содержащую декларацию

Цикл устаревания:

  • 1.5.20: ввести предупреждение о проблемных аргументах

  • 1.6.0: повысить это предупреждение до ошибки, -XXLanguage:-ProhibitSelfCallsInNestedObjects может быть использовано для временного возврата к поведению до версии 1.6

Улучшения повышения ясности типов с учётом возможности null

Вопрос: KT-48623

Компонент: Kotlin/JVM

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin 1.7 изменит способ загрузки и интерпретации аннотаций типов с учётом возможности null в Java-коде

Цикл устаревания:

  • 1.4.30: ввести предупреждения для случаев, когда более точная ясность типов может привести к ошибке

  • 1.7.0: вывести более точную ясность типов Java-типов, -XXLanguage:-TypeEnhancementImprovementsInStrictMode может быть использовано для временного возврата к поведению до версии 1.7

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

Вопрос: KT-48645

Компонент: Kotlin/JVM

Тип несовместимого изменения: поведенческое

Краткое описание: Kotlin будет избегать автоматического преобразования числовых значений в примитивный числовой тип, когда семантически требовалось только приведение типа

Цикл устаревания:

  • < 1.5.30: старое поведение во всех затронутых случаях

  • 1.5.30: исправление поведения приведения в генерируемых делегатах доступа к свойствам, -Xuse-old-backend может быть использовано для временного возврата к поведению до исправления 1.5.30

  • >= 1.6.20: исправление поведения приведения в других затронутых случаях

Запрет объявления повторяемых аннотаций, контейнерная аннотация которых нарушает JLS

Вопрос: KT-47928

Компонент: Kotlin/JVM

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin 1.6 будет проверять, что контейнерная аннотация повторяемой аннотации удовлетворяет тем же требованиям, что и в JLS 9.6.3: метод с массивом в качестве значения, сохранение и целевой объект

Цикл устаревания:

  • 1.5.30: введение предупреждения для объявлений повторяемых контейнерных аннотаций, нарушающих требования JLS (ошибка в режиме пошагового выполнения)

  • 1.6.0: повышение этого предупреждения до ошибки, -XXLanguage:-RepeatableAnnotationContainerConstraints может быть использовано для временного отключения отчёта об ошибках

Запрет объявления вложенного класса с именем Container в классе повторяемой аннотации

Вопрос: KT-47971

Компонент: Kotlin/JVM

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin 1.6 будет проверять, что объявленная в Kotlin повторяемая аннотация не имеет вложенного класса с предопределённым именем Container

Цикл устаревания:

  • 1.5.30: введение предупреждения для вложенных классов с именем Container в классе Kotlin-повторяемой аннотации (ошибка в режиме пошагового выполнения)

  • 1.6.0: повышение этого предупреждения до ошибки, -XXLanguage:-RepeatableAnnotationContainerConstraints может быть использовано для временного отключения отчёта об ошибках

Запрет @JvmField на свойство в первичном конструкторе, переопределяющем свойство интерфейса

Вопрос: KT-32753

Компонент: Kotlin/JVM

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin 1.6 запретит аннотирование свойства, объявленного в первичном конструкторе, переопределяющего свойство интерфейса, аннотацией @JvmField

Цикл устаревания:

  • 1.5.20: введение предупреждения об аннотации @JvmField для таких свойств в первичном конструкторе

  • 1.6.0: повышение этого предупреждения до ошибки, -XXLanguage:-ProhibitJvmFieldOnOverrideFromInterfaceInPrimaryConstructor может быть использовано для временного отключения отчёта об ошибках

Устаревание режимов enabled и compatibility параметра компилятора -Xjvm-default

Вопрос: KT-46329

Компонент: Kotlin/JVM

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin 1.6.20 будет выводить предупреждение об использовании режимов enabled и compatibility параметра компилятора -Xjvm-default

Цикл устаревания:

  • 1.6.20: введение предупреждения об использовании режимов enabled и compatibility параметра компилятора -Xjvm-default

  • >= 1.8.0: это предупреждение будет преобразовано в ошибку

Запрет вызовов super из публичных inline-функций с ABI

Вопрос: KT-45379

Компонент: Язык Kotlin

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin 1.6 запретит вызов функций с квалификатором super из публичных или защищенных inline-функций и свойств.

Цикл устаревания:

  • 1.5.0: введение предупреждения о вызовах super из публичных или защищенных inline-функций или аксессоров свойств

  • 1.6.0: это предупреждение будет преобразовано в ошибку, -XXLanguage:-ProhibitSuperCallsFromPublicInline может быть использовано для временного отключения выдачи сообщений об ошибках

Запрет вызовов защищенных конструкторов из публичных inline-функций

Вопрос: KT-48860

Компонент: Язык Kotlin

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin 1.6 запретит вызов защищенных конструкторов из публичных или защищенных inline-функций и свойств.

Цикл устаревания:

  • 1.4.30: введение предупреждения о вызовах защищенных конструкторов из публичных или защищенных inline-функций или аксессоров свойств

  • 1.6.0: это предупреждение будет преобразовано в ошибку, -XXLanguage:-ProhibitProtectedConstructorCallFromPublicInline может быть использовано для временного отключения выдачи сообщений об ошибках

Запрет экспорта приватных вложенных типов из приватных типов в файле

Вопрос: KT-20094

Компонент: Язык Kotlin

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin 1.6 запретит экспорт приватных вложенных типов и внутренних классов из типов, приватных в файле.

Цикл устаревания:

  • 1.5.0: введение предупреждения об экспорте приватных типов из типов, приватных в файле

  • 1.6.0: это предупреждение будет преобразовано в ошибку, -XXLanguage:-PrivateInFileEffectiveVisibility может быть использовано для временного отключения выдачи сообщений об ошибках

Целевой объект аннотации не анализируется в нескольких случаях для аннотаций на типе

Вопрос: KT-28449

Компонент: Язык Kotlin

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin 1.6 больше не будет разрешать аннотации на типах, которые не должны применяться к типам.

Цикл устаревания:

  • 1.5.20: введение ошибки в поэтапном режиме

  • 1.6.0: введение ошибки, -XXLanguage:-ProperCheckAnnotationsTargetInTypeUsePositions может быть использовано для временного отключения выдачи сообщений об ошибках

Запрет вызовов функций с именем suspend с последующим лямбда-выражением

Вопрос: KT-22562

Компонент: Язык Kotlin

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin 1.6 больше не будет разрешать вызовы функций с именем suspend, которые принимают единственный аргумент функционального типа в виде последующего лямбда-выражения.

Цикл устаревания:

  • 1.3.0: введение предупреждения о таких вызовах функций

  • 1.6.0: это предупреждение будет преобразовано в ошибку

  • >= 1.7.0: внесение изменений в грамматику языка, чтобы suspend перед { интерпретировался как ключевое слово

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

Устранение хрупкой оптимизации contains в minus/removeAll/retainAll

Проблема: KT-45438

Компонент: kotlin-stdlib

Тип несовместимого изменения: поведенческое

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

Цикл устаревания:

  • < 1.6: старое поведение: аргумент преобразуется в множество в некоторых случаях

  • 1.6.0: если аргумент функции — коллекция, она больше не преобразуется в Set. Если это не коллекция, она может быть преобразована в List вместо этого.
    Старое поведение временно можно вернуть на JVM, установив системную переменную kotlin.collections.convert_arg_to_set_in_removeAll=true

  • >= 1.7: вышеуказанная системная переменная больше не будет иметь эффекта

Изменение алгоритма генерации значений в Random.nextLong

Проблема: KT-47304

Компонент: kotlin-stdlib

Тип несовместимого изменения: поведенческое

Краткое описание: Kotlin 1.6 изменяет алгоритм генерации значений в функции Random.nextLong, чтобы избежать создания значений за пределами заданного диапазона.

Цикл устаревания:

  • 1.6.0: поведение исправлено немедленно

Постепенное изменение типа возвращаемого значения функций min и max коллекций на не-nullable

Проблема: KT-38854

Компонент: kotlin-stdlib

Тип несовместимого изменения: исходный код

Краткое описание: тип возвращаемого значения функций коллекций min и max будет изменён на не-nullable в Kotlin 1.7

Цикл устаревания:

  • 1.4.0: вводятся функции ...OrNull, как синонимы, и устаревает затронутый API (см. подробности в проблеме)

  • 1.5.0: уровень устаревания затронутого API повышается до ошибки

  • 1.6.0: устаревшие функции скрываются из публичного API

  • >= 1.7: повторное введение затронутого API, но с типом возвращаемого значения non-nullable

Устаревание функций массивов с плавающей точкой: contains, indexOf, lastIndexOf

Проблема: KT-28753

Компонент: kotlin-stdlib

Тип несовместимого изменения: исходный код

Краткое описание: Kotlin устаревает функции массивов с плавающей точкой contains, indexOf, lastIndexOf, которые сравнивают значения, используя порядок IEEE-754 вместо полного порядка

Цикл устаревания:

  • 1.4.0: устаревают затронутые функции с предупреждением

  • 1.6.0: уровень устаревания повышается до ошибки

  • >= 1.7: устаревшие функции скрываются из публичного API

Перенос объявлений из пакетов kotlin.dom и kotlin.browser в kotlinx.*

Проблема: KT-39330

Компонент: kotlin-stdlib (JS)

Тип несовместимого изменения: исходный код

Краткое описание: Объявления из пакетов kotlin.dom и kotlin.browser перемещаются в соответствующие пакеты kotlinx.*, чтобы подготовиться к их извлечению из stdlib

Цикл устаревания:

  • 1.4.0: вводятся замены API в пакетах kotlinx.dom и kotlinx.browser

  • 1.4.0: устаревают API в пакетах kotlin.dom и kotlin.browser и предлагается вышеупомянутый новый API в качестве замены

  • 1.6.0: уровень устаревания повышается до ошибки

  • >= 1.7: удаление устаревших функций из stdlib

  • >= 1.7: перемещение API в пакеты kotlinx.* в отдельную библиотеку

Функция Regex.replace не будет инлайниться в Kotlin/JS

Проблема: KT-27738

Компонент: kotlin-stdlib (JS)

Тип несовместимого изменения: исходный код

Краткое описание: функция Regex.replace с функциональным аргументом transform больше не будет инлайниться в Kotlin/JS

Цикл устаревания:

  • 1.6.0: удалён модификатор inline из затронутой функции

Разное поведение функции Regex.replace на JVM и JS, когда строка замены содержит ссылку на группу

Проблема: KT-28378

Компонент: kotlin-stdlib (JS)

Тип несовместимого изменения: поведенческое

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

Цикл устаревания:

  • 1.6.0: изменение обработки шаблона замены в Regex.replace Kotlin/JS stdlib

Использование Unicode преобразования регистра в JS Regex

Проблема: KT-45928

Компонент: kotlin-stdlib (JS)

Тип несовместимого изменения: поведенческое

Краткое описание: класс Regex в Kotlin/JS будет использовать флаг unicode, когда вызывается базовый движок JS регулярных выражений для поиска и сравнения символов в соответствии с правилами Юникода. Это требует определенных версионных требований к среде JS и приводит к более строгой валидации ненужного экранирования в строке шаблона регулярного выражения.

Цикл устаревания:

  • 1.5.0: включение Unicode преобразования регистра в большинстве функций класса JS Regex

  • 1.6.0: включение Unicode преобразования регистра в функцию Regex.replaceFirst

Устаревание некоторых API, доступных только в JS

Задача: KT-48587

Компонент: kotlin-stdlib (JS)

Тип несовместимого изменения: исходный код

Краткое описание: ряд функций, доступных только в JS, в stdlib устарели и будут удалены. К ним относятся: String.concat(String), String.match(regex: String), String.matches(regex: String), а также функции массивов, принимающие функцию сравнения, например, Array<out T>.sort(comparison: (a: T, b: T) -> Int)

Цикл устаревания:

  • 1.6.0: функции, на которые это повлияло, устарели с предупреждением

  • 1.7.0: уровень устаревания повышен до ошибки

  • 1.8.0: устаревшие функции удалены из публичного API

Скрытие функций, специфичных для реализации и взаимодействия, из публичного API классов в Kotlin/JS

Задача: KT-48587

Компонент: kotlin-stdlib (JS)

Тип несовместимого изменения: исходный код, бинарный

Краткое описание: функции HashMap.createEntrySet и AbstactMutableCollection.toJSON изменят видимость на internal

Цикл устаревания:

  • 1.6.0: функции станут internal, тем самым удаляя их из публичного API

Инструменты

Устаревание класса KotlinGradleSubplugin

Задача: KT-48830

Компонент: Gradle

Тип несовместимого изменения: исходный код

Краткое описание: класс KotlinGradleSubplugin будет устаревшим в пользу KotlinCompilerPluginSupportPlugin

Цикл устаревания:

  • 1.6.0: уровень устаревания повышен до ошибки

  • >= 1.7.0: устаревший класс будет удален

Удаление параметра сборки kotlin.useFallbackCompilerSearch

Задача: KT-46719

Компонент: Gradle

Тип несовместимого изменения: исходный код

Краткое описание: удаление устаревшего параметра сборки 'kotlin.useFallbackCompilerSearch'

Цикл устаревания:

  • 1.5.0: уровень устаревания повышен до предупреждения

  • 1.6.0: удаление устаревшего параметра

Удаление нескольких параметров компилятора

Задача: KT-48847

Компонент: Gradle

Тип несовместимого изменения: исходный код

Краткое описание: удаление устаревших параметров компилятора noReflect и includeRuntime

Цикл устаревания:

  • 1.5.0: уровень устаревания повышен до ошибки

  • 1.6.0: удаление устаревших параметров

Устаревание параметра компилятора useIR

Задача: KT-48847

Компонент: Gradle

Тип несовместимого изменения: исходный код

Краткое описание: скрытие устаревшего параметра компилятора useIR

Цикл устаревания:

  • 1.5.0: уровень устаревания повышен до предупреждения

  • 1.6.0: параметр скрыт

  • >= 1.7.0: устаревший параметр удален

Устаревание свойства kapt.use.worker.api Gradle

Задача: KT-48826

Компонент: Gradle

Тип несовместимого изменения: исходный код

Краткое описание: устаревание свойства kapt.use.worker.api, которое позволяло запускать kapt через Gradle Workers API (по умолчанию: true)

Цикл устаревания:

  • 1.6.20: уровень устаревания повышен до предупреждения

  • >= 1.8.0: это свойство будет удалено

Удаление свойства kotlin.parallel.tasks.in.project Gradle

Задача: KT-46406

Компонент: Gradle

Тип несовместимого изменения: исходный код

Краткое описание: удаление свойства kotlin.parallel.tasks.in.project

Цикл устаревания:

  • 1.5.20: уровень устаревания повышен до предупреждения

  • 1.6.20: это свойство будет удалено

Устаревание параметров kotlin.experimental.coroutines Gradle DSL и kotlin.coroutines

Задача: KT-50369

Компонент: Gradle

Тип несовместимого изменения: исходный код

Краткое описание: устаревание параметра kotlin.experimental.coroutines Gradle DSL и свойства kotlin.coroutines

Цикл устаревания:

  • 1.6.20: уровень устаревания повышен до предупреждения

  • >= 1.7.0: удаление параметра DSL и свойства

Последнее изменение: 07 апреля 2022
Стабильность компонентов Kotlin (до 1.4) Руководство по совместимости для Kotlin 1.5

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

Spec-Zone.ru

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