Spec-Zone.ru › Kotlin 1.8
Руководство по совместимости для Kotlin 1.5 Поддержание актуальности языка и Комфортные обновления относятся к основным принципам разработки языка Kotlin. Первый принцип гласит, что конструкции, препятствующие развитию языка, должны быть удалены, а второй – что об этом удалении необходимо сообщить заранее, чтобы минимизировать сложности при миграции кода.
Хотя большинство изменений языка уже были объявлены через другие каналы, такие как журналы обновлений или предупреждения компилятора, данный документ обобщает все изменения, предоставляя полную справку по миграции с Kotlin 1.4 на Kotlin 1.5.
Основные термины
В данном документе мы вводим несколько видов совместимости:
исходный код : изменение, несовместимое с исходным кодом, останавливает компиляцию кода, который ранее компилировался без ошибок или предупреждений
бинарный код : два бинарных артефакта считаются бинарно-совместимыми, если их взаимозамена не приводит к ошибкам загрузки или компоновки
поведенческая : изменение считается поведенчески несовместимым, если один и тот же программный код демонстрирует различное поведение до и после применения изменения
Обратите внимание, что эти определения применимы только к чистому Kotlin. Совместимость Kotlin-кода с точки зрения других языков (например, Java) выходит за рамки данного документа.
Язык и стандартная библиотека
Запрет оператора spread в вызовах с полиморфными сигнатурами
Задача : KT-35226
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.5 запретит использование оператора spread (*) в вызовах с полиморфными сигнатурами
Цикл устаревания :
< 1.5: вывести предупреждение для проблемного оператора в месте вызова
>= 1.5: преобразовать предупреждение в ошибку, -XXLanguage:-ProhibitSpreadOnSignaturePolymorphicCall может использоваться для временного возврата к поведению до 1.5
Запрет неабстрактных классов, содержащих абстрактные члены, невидимые из внутреннего пакета (internal/package-private)
Задача : KT-27825
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.5 запретит неабстрактные классы, содержащие абстрактные члены, невидимые из внутреннего пакета (internal/package-private)
Цикл устаревания :
< 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) преобразования будет изменена с генерации анонимного класса на использование invokedynamic JVM инструкции
Цикл устаревания :
Проблема : 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-to-code и Char-to-digit
Проблема : 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 для коллекций на не-nullable
Проблема : KT-38854
Компонент : kotlin-stdlib (JVM)
Тип несовместимого изменения : исходный код
Краткое описание : тип возврата функций для коллекций min и max будет изменён на non-nullable в версии 1.6
Цикл устаревания :
1.4: введение функций ...OrNull в качестве синонимов и устаревание затронутого API (см. подробности в задаче)
1.5.0: повышение уровня устаревания затронутого API до ошибки
>=1.6: повторное введение затронутого API, но с типом возврата non-nullable
Повышение уровня устаревания преобразований чисел с плавающей точкой в 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")
}
После исключения фреймворка тестирования, протестируйте своё приложение. Если оно перестало работать, верните исключающие изменения, используйте тот же фреймворк тестирования, что и библиотека, и исключите свой фреймворк тестирования.
Последнее изменение: 10 января 2023