Spec-Zone.ru › Kotlin 1.9

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

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

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

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

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

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

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

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

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

Язык и stdlib

Запрет использования оператора spread в вызовах с сигнатурной полиморфией

Вопрос: KT-35226

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

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

Краткое описание: Kotlin 1.5 запретит использование оператора spread (*) в вызовах с сигнатурной полиморфией

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

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

  • >= 1.5: преобразовать это предупреждение в ошибку, -XXLanguage:-ProhibitSpreadOnSignaturePolymorphicCall можно использовать для временного возврата к поведению версии до 1.5

Запрет неабстрактных классов, содержащих абстрактные члены, невидимые из внутреннего пакета класса

Вопрос: KT-27825

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

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

Краткое описание: Kotlin 1.5 запретит неабстрактные классы, содержащие абстрактные члены, невидимые из внутреннего пакета класса

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

  • < 1.5: вывести предупреждение для проблемных классов

  • >= 1.5: преобразовать это предупреждение в ошибку, -XXLanguage:-ProhibitInvisibleAbstractMethodsInSuperclasses можно использовать для временного возврата к поведению версии до 1.5

Запрет использования массивов, основанных на нереализованных параметрах типа, в качестве реифицированных аргументов типа на JVM

Вопрос: KT-31227

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

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

Краткое описание: Kotlin 1.5 запретит использование массивов, основанных на нереализованных параметрах типа, в качестве реифицированных аргументов типа на JVM

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

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

  • >= 1.5: преобразовать это предупреждение в ошибку, -XXLanguage:-ProhibitNonReifiedArraysAsReifiedTypeArguments можно использовать для временного возврата к поведению версии до 1.5

Запрет вторичных конструкторов перечислений, которые не делегируют первичному конструктору

Вопрос: KT-35870

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

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

Краткое описание: Kotlin 1.5 запретит вторичные конструкторы классов перечислений, которые не делегируют первичному конструктору

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

  • < 1.5: вывести предупреждение для проблемных конструкторов

  • >= 1.5: преобразовать это предупреждение в ошибку, -XXLanguage:-RequiredPrimaryConstructorDelegationCallInEnums можно использовать для временного возврата к поведению версии до 1.5

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

Вопрос: KT-33917

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

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

Краткое описание: Kotlin 1.5 запретит экспонирование анонимных типов из приватных инлайновых функций

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

  • < 1.5: вывести предупреждение для проблемных конструкторов

  • >= 1.5: преобразовать это предупреждение в ошибку, -XXLanguage:-ApproximateAnonymousReturnTypesInPrivateInlineFunctions можно использовать для временного возврата к поведению версии до 1.5

Запрет передачи нераскрывных массивов после аргументов с SAM-преобразованием

Вопрос: KT-35224

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

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

Краткое описание: Kotlin 1.5 запретит передачу нераскрывных массивов после аргументов с SAM-преобразованием

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

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

  • >= 1.5: преобразовать это предупреждение в ошибку, -XXLanguage:-ProhibitVarargAsArrayAfterSamArgument можно использовать для временного возврата к поведению версии до 1.5

Поддержка специальной семантики для параметров блоков catch с именем подчерк

Вопрос: KT-31567

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

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

Краткое описание: Kotlin 1.5 запретит ссылки на символ подчеркивания (_), используемый для пропуска имени параметра исключения в блоке catch

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

  • 1.4.20: вывести предупреждение для проблемных ссылок

  • >= 1.5: преобразовать это предупреждение в ошибку, -XXLanguage:-ForbidReferencingToUnderscoreNamedParameterOfCatchBlock можно использовать для временного возврата к поведению версии до 1.5

Изменение стратегии реализации SAM-преобразования с основанной на анонимных классах на invokedynamic

Вопрос: KT-44912

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

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

Краткое описание: Начиная с Kotlin 1.5, стратегия реализации SAM (single abstract method) преобразования будет изменена с генерации анонимного класса на использование инструкции JVM invokedynamic

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

  • 1.5: изменение стратегии реализации SAM-преобразования, -Xsam-conversions=class можно использовать для возврата к схеме реализации, которая использовалась ранее

Проблемы производительности с JVM IR-бекендом

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

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

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

Краткое описание: Kotlin 1.5 по умолчанию использует IR-бекенд для компилятора Kotlin/JVM. Старый бекенд по умолчанию используется для более ранних версий языка.

При использовании новой компиляции в Kotlin 1.5 могут возникнуть проблемы с производительностью. Мы работаем над исправлением таких случаев.

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

  • < 1.5: по умолчанию используется старый JVM бекенд

  • >= 1.5: по умолчанию используется IR-бекенд. Если вам нужно использовать старый бекенд в Kotlin 1.5, добавьте следующие строки в конфигурационный файл проекта, чтобы временно вернуться к поведению до версии 1.5:

В Gradle:

tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile> {
  kotlinOptions.useOldBackend = true
}
tasks.withType(org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile) {
  kotlinOptions.useOldBackend = true
}

В Maven:

<configuration>
    <args>
        <arg>-Xuse-old-backend</arg>
    </args>
</configuration>

Поддержка этого флага будет удалена в одной из будущих версий.

Новая сортировка полей в JVM IR-бекенде

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

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

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

Краткое описание: Начиная с версии 1.5, Kotlin использует IR-бекенд, который сортирует JVM байткод по-другому: он генерирует поля, объявленные в конструкторе, перед полями, объявленными в теле класса, в то время как в старом бекенде порядок обратный. Новая сортировка может изменить поведение программ, использующих фреймворки сериализации, которые зависят от порядка полей, таких как Java сериализация.

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

  • < 1.5: по умолчанию используется старый JVM бекенд. Он имеет поля, объявленные в теле класса, перед полями, объявленными в конструкторе.

  • >= 1.5: по умолчанию используется новый IR-бекенд. Поля, объявленные в конструкторе, генерируются перед полями, объявленными в теле. Для временного переключения на старый бекенд в Kotlin 1.5 добавьте следующие строки в конфигурационный файл проекта:

В Gradle:

tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile> {
  kotlinOptions.useOldBackend = true
}
tasks.withType(org.jetbrains.kotlin.gradle.dsl.KotlinJvmCompile) {
  kotlinOptions.useOldBackend = true
}

В Maven:

<configuration>
    <args>
        <arg>-Xuse-old-backend</arg>
    </args>
</configuration>

Поддержка этого флага будет удалена в одной из будущих версий.

Генерация утверждений о непустоте для делегированных свойств с универсальным вызовом в выражении делегата

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

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

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

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

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

  • 1.5: генерировать утверждения о непустоте для делегированных свойств (подробности см. в задаче), -Xuse-old-backend или -language-version 1.4 можно использовать для временного возврата к поведению до версии 1.5

Преобразование предупреждений в ошибки для вызовов с параметрами типа, помеченными аннотацией @OnlyInputTypes

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

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

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

Краткое описание: В Kotlin 1.5 будут запрещены вызовы, такие как contains, indexOf, и assertEquals с бессмысленными аргументами для повышения безопасности типов

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

  • 1.4.0: введение предупреждения для проблемных конструкторов

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

Использование правильного порядка выполнения аргументов в вызовах с именованным vararg

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

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

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

Краткое описание: В Kotlin 1.5 будет изменён порядок выполнения аргументов в вызовах с именованным vararg

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

  • < 1.5: введение предупреждения для проблемных конструкторов

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

Использование значения по умолчанию параметра в операторных функциональных вызовах

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

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

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

Краткое описание: Kotlin 1.5 будет использовать значение по умолчанию параметра в операторных вызовах

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

  • < 1.5: старое поведение (см. подробности в задаче)

  • >= 1.5: поведение изменено, -XXLanguage:-JvmIrEnabledByDefault можно использовать для временного возврата к поведению до версии 1.5

Генерация пустых обратных последовательностей в циклах for, если обычная последовательность также пуста

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

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

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

Краткое описание: В Kotlin 1.5 будут генерироваться пустые обратные последовательности в циклах for, если обычная последовательность также пуста

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

  • < 1.5: старое поведение (см. подробности в задаче)

  • >= 1.5: поведение изменено, -XXLanguage:-JvmIrEnabledByDefault можно использовать для временного возврата к поведению до версии 1.5

Устранение преобразований Char в код и Char в цифру

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

Компонент: kotlin-stdlib

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

Краткое описание: Начиная с Kotlin 1.5, преобразования Char в числовые типы будут устаревшими

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

  • 1.5: устаревание Char.toInt()/toShort()/toLong()/toByte()/toDouble()/toFloat() и обратных функций, таких как Long.toChar(), и предлагается замена

Несогласованное сравнение символов без учета регистра в функциях kotlin.text

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

Компонент: kotlin-stdlib

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

Краткое описание: Начиная с Kotlin 1.5, Char.equals будет улучшена в сравнении без учета регистра, сначала сравнивая верхние регистры символов, а затем нижние регистры этих верхних регистров (в отличие от самих символов)

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

  • < 1.5: старое поведение (см. подробности в проблеме)

  • 1.5: изменение поведения для функции Char.equals

Удаление API преобразования регистра с учетом локали по умолчанию

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

Компонент: kotlin-stdlib

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

Краткое описание: Начиная с Kotlin 1.5, функции преобразования регистра с учетом локали по умолчанию, такие как String.toUpperCase(), будут устаревшими.

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

  • 1.5: устаревание функций преобразования регистра с использованием локали по умолчанию (см. подробности в проблеме), и предлагается замена

Постепенное изменение типа возвращаемого значения функций min и max для коллекций на нессылочный тип

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

Компонент: kotlin-stdlib (JVM)

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

Краткое описание: тип возвращаемого значения функций min и max для коллекций будет изменен на нессылочный в 1.6.

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

  • 1.4: введение функций ...OrNull в качестве синонимов и устаревание затронутого API (см. подробности в проблеме)

  • 1.5.0: повышение уровня устаревания затронутого API до ошибки

  • >=1.6: повторное введение затронутого API, но с нессылочным типом возвращаемого значения

Повышение уровня устаревания преобразований типов с плавающей запятой в Short и Byte

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

Компонент: kotlin-stdlib (JVM)

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

Краткое описание: Преобразования типов с плавающей запятой в Short и Byte устаревшие в Kotlin 1.4 с уровнем WARNING, приведут к ошибкам начиная с Kotlin 1.5.0.

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

  • 1.4: устаревание Double.toShort()/toByte() и Float.toShort()/toByte() и предложение замены

  • 1.5.0: повышение уровня устаревания до ошибки

Инструменты

Не следует смешивать несколько вариантов JVM kotlin-test в одном проекте

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

Компонент: Gradle

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

Краткое описание: несколько взаимно исключающих kotlin-test вариантов для разных фреймворков тестирования могли находиться в проекте, если один из них был добавлен зависимостью. Начиная с 1.5.0, Gradle не будет разрешать наличие взаимно исключающих kotlin-test вариантов для разных фреймворков тестирования.

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

  • < 1.5: разрешается иметь несколько взаимно исключающих kotlin-test вариантов для разных фреймворков тестирования

  • >= 1.5: поведение изменено,
    Gradle генерирует исключение типа "Невозможно выбрать модуль с конфликтом по возможности...". Возможные решения:

    • используйте тот же kotlin-test вариант и соответствующий фреймворк тестирования, что и зависимость.

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

    • найдите другую версию зависимости, которая добавляет другой kotlin-test вариант как транзитивную зависимость, который использует тот же фреймворк тестирования, который вы хотите использовать.

    • исключите фреймворк тестирования, который добавляется транзитивной зависимостью. Следующий пример для исключения JUnit 4:

      configurations { 
          testImplementation.get().exclude("org.jetbrains.kotlin", "kotlin-test-junit")
      }
      

      После исключения фреймворка тестирования протестируйте ваше приложение. Если оно перестало работать, откатайте изменения по исключению, используйте тот же фреймворк тестирования, что и библиотека, и исключите свой фреймворк тестирования.

Последнее изменение: 15 октября 2021
Руководство по совместимости для Kotlin 1.6 Руководство по совместимости для Kotlin 1.4

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

Spec-Zone.ru

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