Spec-Zone.ru › Kotlin 2
Руководство по совместимости для Kotlin 1.7.0 Поддержание современности языка и удобство обновлений — одни из фундаментальных принципов проектирования языка Kotlin. Первый гласит, что конструкции, препятствующие развитию языка, следует удалять, а второй — что об удалении необходимо заранее сообщать, чтобы упростить миграцию кода.
Хотя об изменениях языка уже сообщалось в других источниках, например в журналах изменений обновлений или предупреждениях компилятора, в этом документе собраны все изменения. Он представляет собой полное руководство по миграции с Kotlin 1.6 на Kotlin 1.7.
Основные термины
В этом документе рассматриваются несколько видов совместимости:
исходная : изменение, несовместимое с исходным кодом, не позволяет компилировать код, который ранее компилировался без ошибок и предупреждений
бинарная : два бинарных артефакта считаются бинарно совместимыми, если их взаимная замена не приводит к ошибкам загрузки или связывания
поведенческая : изменение считается поведенчески несовместимым, если одна и та же программа работает по-разному до и после его применения
Обратите внимание: эти определения даны только для Kotlin. Совместимость кода Kotlin с точки зрения других языков (например, Java) выходит за рамки этого документа.
Язык
Результат безопасного вызова всегда будет nullable
Проблема : KT-46860
Компонент : основной язык
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.7 тип результата безопасного вызова всегда будет считаться nullable, даже если получатель безопасного вызова не допускает null
Цикл устаревания :
<1.3: выдавать предупреждение при ненужном безопасном вызове для получателей, не допускающих null
1.6.20: дополнительно предупреждать, что тип результата ненужного безопасного вызова изменится в следующей версии
1.7.0: изменить тип результата безопасного вызова на nullable, -XXLanguage:-SafeCallsAreAlwaysNullable можно использовать для временного возврата к поведению до версии 1.7
Запретить делегирование вызовов super абстрактному члену суперкласса
Проблемы : KT-45508 , KT-49017 , KT-38078
Компонент : основной язык
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin будет выдавать ошибку компиляции, если явный или неявный вызов super делегируется абстрактному члену суперкласса, даже если в суперинтерфейсе есть реализация по умолчанию
Цикл устаревания :
1.5.20: выдавать предупреждение при использовании неабстрактных классов, которые не переопределяют все абстрактные члены
1.7.0: выдавать ошибку, если вызов super фактически обращается к абстрактному члену суперкласса
1.7.0: выдавать ошибку, если включены режимы совместимости -Xjvm-default=all или -Xjvm-default=all-compatibility; в прогрессивном режиме выдавать ошибку
>=1.8.0: выдавать ошибку во всех случаях
Запретить раскрытие непубличных типов через публичные свойства, объявленные в непубличном первичном конструкторе
Проблема : KT-28078
Компонент : основной язык
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin запретит объявлять публичные свойства с непубличными типами в приватном первичном конструкторе. Доступ к таким свойствам из другого пакета может привести к IllegalAccessError
Цикл устаревания :
1.3.20: выдавать предупреждение для публичного свойства с непубличным типом, объявленного в непубличном конструкторе
1.6.20: в прогрессивном режиме повысить уровень этого предупреждения до ошибки
1.7.0: повысить уровень этого предупреждения до ошибки
Запретить доступ к неинициализированным элементам enum с указанием имени enum
Проблема : KT-41124
Компонент : основной язык
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.7 будет запрещен доступ к неинициализированным элементам enum из блока статической инициализации enum, если они указаны с именем enum
Цикл устаревания :
Запретить вычисление константных значений сложных логических выражений в ветвях условий when и условиях циклов
Проблема : KT-39883
Компонент : основной язык
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin больше не будет делать предположения об исчерпывающем разборе и потоке управления на основании константных логических выражений, кроме литералов true и false
Цикл устаревания :
1.5.30: выдавать предупреждение, если исчерпывающий разбор when или достижимость потока управления определяется на основании сложного константного логического выражения в условии ветви или цикла when
1.7.0: повысить уровень этого предупреждения до ошибки
По умолчанию требовать исчерпывающий разбор в выражениях when с типами enum, sealed и Boolean
Проблема : KT-47709
Компонент : основной язык
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.7 будет выдаваться ошибка, если выражение when с типом enum, sealed или Boolean не является исчерпывающим
Цикл устаревания :
1.6.0: выдавать предупреждение, если выражение when с типом enum, sealed или Boolean не является исчерпывающим (в прогрессивном режиме — ошибку)
1.7.0: повысить уровень этого предупреждения до ошибки
Устаревание неоднозначных грамматических конструкций в when с выражением subject
Проблема : KT-48385
Компонент : основной язык
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.6 устарели несколько неоднозначных грамматических конструкций в выражениях условий when
Цикл устаревания :
1.6.20: выдавать предупреждение об устаревании для затронутых выражений
1.8.0: повысить уровень этого предупреждения до ошибки
>= 1.8: использовать некоторые устаревшие конструкции для новых языковых возможностей
Улучшения расширения nullability типов
Проблема : KT-48623
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.7 изменится загрузка и интерпретация аннотаций nullability типов в коде Java
Цикл устаревания :
1.4.30: выдавать предупреждения в случаях, когда более точное определение nullability типа может привести к ошибке
1.7.0: точнее определять nullability типов Java; -XXLanguage:-TypeEnhancementImprovementsInStrictMode можно использовать для временного возврата к поведению до версии 1.7
Запретить неявные преобразования между различными числовыми типами
Проблема : KT-48645
Компонент : Kotlin/JVM
Тип несовместимого изменения : поведенческий
Краткое описание : Kotlin перестанет автоматически преобразовывать числовые значения в примитивный числовой тип, когда по смыслу требовалось только приведение к этому типу
Цикл устаревания :
< 1.5.30: прежнее поведение во всех затронутых случаях
1.5.30: исправить поведение приведения в сгенерированных аксессорах делегатов свойств; -Xuse-old-backend можно использовать для временного возврата к поведению до исправления в версии 1.5.30
>= 1.7.20: исправить поведение приведения в других затронутых случаях
Устаревание режимов enable и compatibility параметра компилятора -Xjvm-default
Проблема : KT-46329
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.6.20 выдается предупреждение об использовании режимов enable и compatibility параметра компилятора -Xjvm-default
Цикл устаревания :
Запретить вызовы функций с именем suspend и завершающей лямбдой
Проблема : KT-22562
Компонент : основной язык
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.6 больше нельзя вызывать пользовательские функции с именем suspend, если их единственный аргумент функционального типа передается в виде завершающей лямбды
Цикл устаревания :
1.3.0: выдавать предупреждение при вызове таких функций
1.6.0: повысить уровень этого предупреждения до ошибки
1.7.0: изменить грамматику языка, чтобы suspend перед { разбиралось как ключевое слово
Запретить умное приведение свойства базового класса, если базовый класс находится в другом модуле
Проблема : KT-52629
Компонент : основной язык
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.7 больше нельзя будет выполнять умное приведение свойств суперкласса, если этот класс находится в другом модуле
Цикл устаревания :
1.6.0: выдавать предупреждение при умном приведении свойства, объявленного в суперклассе из другого модуля
1.7.0: повысить уровень этого предупреждения до ошибки; -XXLanguage:-ProhibitSmartcastsOnPropertyFromAlienBaseClass можно использовать для временного возврата к поведению до версии 1.7
Не игнорировать значимые ограничения при выводе типов
Проблема : KT-52668
Компонент : основной язык
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.4–1.6 некоторые ограничения типов игнорировались при выводе типов из-за некорректной оптимизации. Это могло позволить написать некорректный код и привести к ClassCastException во время выполнения. Kotlin 1.7 учитывает эти ограничения и тем самым запрещает такой код
Цикл устаревания :
1.5.20: выдавать предупреждение для выражений, в которых при учете всех ограничений вывода типов возникло бы несоответствие типов
1.7.0: учитывать все ограничения и повысить уровень этого предупреждения до ошибки; -XXLanguage:-ProperTypeInferenceConstraintsProcessing можно использовать для временного возврата к поведению до версии 1.7
Стандартная библиотека
Постепенно изменить тип возвращаемого значения функций min и max для коллекций на non-nullable
Проблема : KT-38854
Компонент : kotlin-stdlib
Тип несовместимого изменения : исходный код
Краткое описание : в Kotlin 1.7 тип возвращаемого значения функций min и max для коллекций будет изменен на non-nullable
Цикл устаревания :
1.4.0: добавить функции ...OrNull как синонимы и объявить затронутый API устаревшим (подробности см. в описании проблемы)
1.5.0: повысить уровень устаревания затронутого API до ошибки
1.6.0: скрыть устаревшие функции из публичного API
1.7.0: повторно добавить затронутый API, но с типом возвращаемого значения non-nullable
Устаревание функций для массивов с плавающей точкой: contains, indexOf, lastIndexOf
Проблема : KT-28753
Компонент : kotlin-stdlib
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin объявляет устаревшими функции для массивов с плавающей точкой contains, indexOf, lastIndexOf, которые сравнивают значения в соответствии с порядком IEEE-754, а не полным порядком
Цикл устаревания :
1.4.0: объявить затронутые функции устаревшими с предупреждением
1.6.0: повысить уровень устаревания до ошибки
1.7.0: скрыть устаревшие функции из публичного 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.8: удалить устаревшие функции из stdlib
>= 1.8: переместить API из пакетов kotlinx.* в отдельную библиотеку
Устаревание некоторых API, доступных только в JS
Проблема : KT-48587
Компонент : kotlin-stdlib (JS)
Тип несовместимого изменения : исходный код
Краткое описание : ряд функций stdlib, доступных только в JS, объявляются устаревшими и будут удалены. Среди них: String.concat(String), String.match(regex: String), String.matches(regex: String), а также функции sort для массивов, принимающие функцию сравнения, например Array<out T>.sort(comparison: (a: T, b: T) -> Int)
Цикл устаревания :
1.6.0: объявить затронутые функции устаревшими с предупреждением
1.8.0: повысить уровень устаревания до ошибки
1.9.0: удалить устаревшие функции из публичного API
Удаление класса KotlinGradleSubplugin
Проблема : KT-48831
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : удалить класс KotlinGradleSubplugin. Вместо него используйте класс KotlinCompilerPluginSupportPlugin
Цикл устаревания :
Удаление параметра компилятора useIR
Проблема : KT-48847
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : удалить устаревший и скрытый параметр компилятора useIR
Цикл устаревания :
Устаревание свойства Gradle kapt.use.worker.api
Проблема : KT-48826
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : признать устаревшим свойство kapt.use.worker.api, которое позволяло запускать kapt через Gradle Workers API (значение по умолчанию: true)
Цикл устаревания :
Удаление параметра Gradle DSL kotlin.experimental.coroutines и свойства Gradle kotlin.coroutines
Проблема : KT-50494
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : удалить параметр Gradle DSL kotlin.experimental.coroutines и свойство kotlin.coroutines
Цикл устаревания :
1.6.20: повысить уровень устаревания до предупреждения
1.7.0: удалить параметр DSL, содержащий его блок experimental и свойство
Устаревание параметра компилятора useExperimentalAnnotation
Проблема : KT-47763
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : удалить скрытую функцию Gradle useExperimentalAnnotation(), которая использовалась для включения возможности использовать API в модуле. Вместо неё можно использовать функцию optIn()
Цикл устаревания:
Устаревание системного свойства kotlin.compiler.execution.strategy
Проблема : KT-51830
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : признать устаревшим системное свойство kotlin.compiler.execution.strategy, используемое для выбора стратегии выполнения компилятора. Вместо него используйте свойство Gradle kotlin.compiler.execution.strategy или свойство задачи компиляции compilerExecutionStrategy
Цикл устаревания:
Удаление параметра компилятора kotlinOptions.jdkHome
Проблема : KT-46541
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : удалить параметр компилятора kotlinOptions.jdkHome, который использовался для добавления пользовательского JDK из указанного расположения в classpath вместо JDK по умолчанию JAVA_HOME. Вместо него используйте цепочки инструментов Java
Цикл устаревания:
Удаление параметра компилятора noStdlib
Проблема : KT-49011
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : удалить параметр компилятора noStdlib. Плагин Gradle использует свойство kotlin.stdlib.default.dependency=true, чтобы управлять наличием стандартной библиотеки Kotlin
Цикл устаревания:
Удаление плагинов kotlin2js и kotlin-dce-plugin
Проблема : KT-48276
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : удалить плагины kotlin2js и kotlin-dce-plugin. Вместо kotlin2js используйте новый плагин org.jetbrains.kotlin.js. Удаление неиспользуемого кода (DCE) работает при правильной настройке плагина Kotlin/JS для Gradle
Изменения в задачах компиляции
Проблема : KT-32805
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : задачи компиляции Kotlin больше не наследуют задачу Gradle AbstractCompile, поэтому входные данные sourceCompatibility и targetCompatibility больше недоступны в скриптах пользователей Kotlin. Входные данные SourceTask.stableSources больше недоступны. Входные данные sourceFilesExtensions удалены. Устаревший выходной параметр Gradle destinationDir: File заменён выходным параметром destinationDirectory: DirectoryProperty. Свойство classpath задачи KotlinCompile признано устаревшим
Цикл устаревания:
26 мая 2025 г.