Spec-Zone.ru › Kotlin 1.8

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

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

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

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

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

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

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

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

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

Язык

Результат безопасного вызова всегда должен быть nullable

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

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

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

Краткое описание: Kotlin 1.7 будет считать тип результата безопасного вызова всегда nullable, даже если получатель безопасного вызова является non-nullable

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

  • <1.3: выводить предупреждение об ненужном безопасном вызове на non-nullable получатели

  • 1.6.20: дополнительно предупреждать, что тип результата ненужного безопасного вызова изменится в следующей версии

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

Запрет делегирования вызовов super к абстрактному члену суперкласса

Проблемы: KT-45508, KT-49017, KT-38078

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

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

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

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

  • 1.5.20: ввести предупреждение при использовании non-abstract классов, не переопределяющих все абстрактные члены

  • 1.7.0: выводить ошибку, если вызов super, фактически, обращается к абстрактному члену из суперкласса

  • 1.7.0: выводить ошибку, если включены режимы совместимости -Xjvm-default=all или -Xjvm-default=all-compatibility; выводить ошибку в прогрессивном режиме

  • >=1.8.0: выводить ошибку во всех случаях

Запрет экспонирования непубличных типов через публичные свойства, объявленные в непубличном первичном конструкторе

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

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

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

Краткое описание: Kotlin предотвратит объявление публичных свойств, имеющих непубличные типы, в закрытом первичном конструкторе. Доступ к таким свойствам из другого пакета может привести к IllegalAccessError

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

  • 1.3.20: выводить предупреждение о публичном свойстве, имеющем непубличный тип и объявленном в непубличном конструкторе

  • 1.6.20: повысить это предупреждение до ошибки в прогрессивном режиме

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

Запрет доступа к неинициализированным элементам перечисления, квалифицированным именем перечисления

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

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

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

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

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

  • 1.7.0: выводить ошибку при доступе к неинициализированным элементам перечисления из блока статической инициализации перечисления

Запрет вычисления константных значений сложных логических выражений в ветвях условия when и условиях циклов

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

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

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

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

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

  • 1.5.30: выводить предупреждение, когда исчерпываемость when или достижимость потока управления определяется на основе сложного константного логического выражения в ветви when или условии цикла

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

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

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

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

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

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

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

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

  • 1.7.0: повышение этого предупреждения до ошибки

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

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

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

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

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

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

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

  • 1.8.0: повышение этого предупреждения до ошибки

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

Улучшения в повышении точности указания nullable-типов

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

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

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

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

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

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

  • 1.7.0: вывод более точных nullable-типов для 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: исправление поведения приведения в других затронутых случаях

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • 1.6.0: повышение предупреждения до ошибки

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

Запрет интеллектуального приведения к типу свойства базового класса, если базовый класс из другого модуля

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

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

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

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

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

  • 1.6.0: выводится предупреждение об интеллектуальном приведении к типу свойства, объявленного в суперклассе, находящемся в другом модуле

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

Не пренебрегайте значимыми ограничениями при выводе типов

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

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

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

Краткое описание: Kotlin 1.4−1.6 игнорировал некоторые ограничения типов при выводе типов из-за неверной оптимизации. Это могло привести к написанию небезопасного кода, вызывающего ClassCastException во время выполнения. Kotlin 1.7 учитывает эти ограничения, тем самым запрещая небезопасный код

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

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

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

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

Постепенное изменение типа возвращаемого значения функций 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.0: повторное введение затронутого API, но с не-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)

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

Краткое описание: ряд функций, доступных только в JS в stdlib, устарели для удаления. К ним относятся: 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

Цикл снятия с поддержки:

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

  • 1.7.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 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()

Цикл снятия с поддержки:

  • 1.6.0: скрыть параметр снятия с поддержки

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

Снятие с поддержки системного свойства kotlin.compiler.execution.strategy

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

Компонент: Gradle

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

Краткое описание: снять с поддержки системное свойство kotlin.compiler.execution.strategy, используемое для выбора стратегии выполнения компилятора. Вместо этого используйте свойство Gradle kotlin.compiler.execution.strategy или свойство задачи компиляции compilerExecutionStrategy

Цикл снятия с поддержки:

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

  • > 1.7.0: удалить свойство

Удаление параметра компилятора kotlinOptions.jdkHome

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

Компонент: Gradle

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

Краткое описание: удалить параметр компилятора kotlinOptions.jdkHome, используемый для включения пользовательского JDK из указанного местоположения в classpath вместо JDK по умолчанию JAVA_HOME. Используйте Java toolchains вместо этого

Цикл снятия с поддержки:

  • 1.5.30: повысить уровень снятия с поддержки до предупреждения

  • > 1.7.0: удалить параметр

Удаление параметра компилятора noStdlib

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

Компонент: Gradle

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

Краткое описание: удалить параметр компилятора noStdlib. Плагин Gradle использует свойство kotlin.stdlib.default.dependency=true для управления наличием стандартной библиотеки Kotlin

Цикл снятия с поддержки:

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

  • 1.7.0: удалить параметр

Удаление плагинов kotlin2js и kotlin-dce-plugin

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

Компонент: Gradle

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

Краткое описание: удалить плагины kotlin2js и kotlin-dce-plugin. Вместо kotlin2js, используйте новый плагин org.jetbrains.kotlin.js. Удаление неиспользуемого кода (DCE) работает, когда плагин Kotlin/JS Gradle настроен правильно

Цикл снятия с поддержки:

  • 1.4.0: повысить уровень снятия с поддержки до предупреждения

  • 1.7.0: удалить плагины

Изменения в задачах компиляции

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

Компонент: Gradle

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

Краткое описание: Задачи компиляции Kotlin больше не наследуют задачу Gradle AbstractCompile и поэтому ввода sourceCompatibility и targetCompatibility больше недоступны в скриптах пользователей Kotlin. Ввод SourceTask.stableSources больше недоступен. Ввод sourceFilesExtensions был удален. Устаревшее значение вывода Gradle destinationDir: File было заменено на значение вывода destinationDirectory: DirectoryProperty. Свойство classpath задачи KotlinCompile устарело.

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

  • 1.7.0: вводы недоступны, вывод заменен, свойство classpath устарело

Последнее изменение: 10 января 2023 г.
Руководство по совместимости для Kotlin 1.7.20 Руководство по совместимости для Kotlin 1.6

© 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-17.html

Spec-Zone.ru

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