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 запретит доступ к неинициализированным элементам перечисления из блока статической инициализации перечисления, когда эти элементы квалифицируются именем перечисления
Цикл устаревания :
Запрет вычисления константных значений сложных булевых выражений в ветвях условия 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
Цикл устаревания :
Запрет вызовов функций с именем 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
Цикл устаревания :
Удаление параметра компилятора 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, используемое для выбора стратегии выполнения компилятора. Вместо этого использовать use the Gradle propertykotlin.compiler.execution.strategyor the compile task propertycompilerExecutionStrategy`
Цикл устаревания:
Удаление параметра компилятора kotlinOptions.jdkHome
Проблема : KT-46541
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : удалить параметр компилятора kotlinOptions.jdkHome, используемый для включения пользовательского JDK из указанного местоположения в classpath вместо стандартного 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 устарело.
Цикл устаревания:
Последнее изменение: 10 июня 2022 г.