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 запретит доступ к неинициализированным элементам перечисления из блока статической инициализации перечисления, когда эти элементы квалифицированы именем перечисления
Цикл устаревания :
Запрет вычисления константных значений сложных логических выражений в ветвях условия 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
Цикл устаревания :
Запрет вызовов функций с именем 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
Цикл снятия с поддержки :
Удаление параметра компилятора 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 toolchains вместо этого
Цикл снятия с поддержки:
Удаление параметра компилятора 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 устарело.
Цикл устаревания:
Последнее изменение: 10 января 2023 г.