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
Цикл устаревания :
Проблема : 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 будет генерировать утверждения о непустоте для делегированных свойств с универсальным вызовом в выражении делегата
Цикл устаревания :
Проблема : 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 в числовые типы будут устаревшими
Цикл устаревания :
Несогласованное сравнение символов без учета регистра в функциях kotlin.text
Проблема : KT-45496
Компонент : kotlin-stdlib
Тип несовместимого изменения : поведенческое
Краткое описание : Начиная с Kotlin 1.5, Char.equals будет улучшена в сравнении без учета регистра, сначала сравнивая верхние регистры символов, а затем нижние регистры этих верхних регистров (в отличие от самих символов)
Цикл устаревания :
Удаление API преобразования регистра с учетом локали по умолчанию
Проблема : KT-43023
Компонент : kotlin-stdlib
Тип несовместимого изменения : исходный код
Краткое описание : Начиная с Kotlin 1.5, функции преобразования регистра с учетом локали по умолчанию, такие как String.toUpperCase(), будут устаревшими.
Цикл устаревания :
Постепенное изменение типа возвращаемого значения функций 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.
Цикл устаревания :
Не следует смешивать несколько вариантов 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