Spec-Zone.ru › Kotlin 1.9

Руководство по совместимости для 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: выдавать ошибку во всех случаях

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

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

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

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

Краткое описание: Kotlin запретит объявление public свойств с non-public типами в private первичном конструкторе. Доступ к таким свойствам из другого пакета может привести к IllegalAccessError

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

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

  • 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-with-subject

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

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

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

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

Устаревание режимов включения и совместимости параметра компилятора -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

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

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

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

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

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

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

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

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

Задача: KT-52629

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

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

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

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

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

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

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

Задача: KT-52668

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

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

Краткое описание: 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, но с типом возвращаемого значения 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.* в отдельную библиотеку

Устаревание некоторых JS-только API

Вопрос: 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 и свойства 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 из указанного расположения в пути класса вместо 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 устарело

Последнее изменение: 28 декабря 2022 г.
Руководство по совместимости для 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