Spec-Zone.ru › Kotlin 1.8

Руководство по совместимости для 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

Улучшения в расширении нуллируемости типов

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

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

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

Краткое описание: Kotlin 1.7 изменит способ загрузки и интерпретации аннотаций нуллируемости типов в коде 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 можно использовать для временного отключения сообщений об ошибках

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

Вопрос: KT-46329

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

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

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

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

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

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

Запрет вызовов super из публичных inline-функций public-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 для коллекций на не-null

Вопрос: KT-38854

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

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

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

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

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

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

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

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

Устаревание функций массивов с плавающей точкой: 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 регулярных выражений для поиска и сравнения символов в соответствии с правилами Unicode. Это требует определённых версионных ограничений для 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: удаление устаревшего параметра

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

Вопрос: KT-48826

Компонент: Gradle

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

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

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

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

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

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

Вопрос: KT-46406

Компонент: Gradle

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

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

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

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

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

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

Вопрос: KT-50369

Компонент: Gradle

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

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

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

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

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

Последнее изменение: 10 января 2023
Руководство по совместимости для Kotlin 1.7 Руководство по совместимости для Kotlin 1.5

© 2010–2023 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