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