Spec-Zone.ru › Kotlin 1.7

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

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

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

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

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

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

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

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

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

Язык

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

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

Компонент: Ядро языка

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

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

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

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

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

  • 1.7.0: тип результата безопасного вызова изменяется на нетипизированный,
    -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: повышает это предупреждение до ошибки

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

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

Компонент: Ядро языка

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

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

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

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

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

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

Компонент: Ядро языка

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

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

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

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

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

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

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

Компонент: Ядро языка

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

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

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

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

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

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

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

Компонент: Ядро языка

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

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

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

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

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

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

Улучшения повышения надежности типов

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

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

Вопрос: KT-46329

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

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

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

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

  • 1.6.20: введение предупреждения об использовании режимов enabled и 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 для коллекций на не-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.0: повторное введение затронутого API, но с типом возвращаемого значения не-null

Устаревание функций массивов с плавающей точкой: 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, используемое для выбора стратегии выполнения компилятора. Вместо этого использовать use the Gradle propertykotlin.compiler.execution.strategyor the compile task propertycompilerExecutionStrategy`

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

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

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

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

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

Компонент: Gradle

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

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

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

  • 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 июня 2022 г.
Руководство по совместимости для Kotlin 1.7.20 Руководство по совместимости для Kotlin 1.6

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

Spec-Zone.ru

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