Spec-Zone.ru › Kotlin 1.8
Руководство по совместимости для Kotlin 1.6 Поддержание языка в актуальном состоянии и Комфортные обновления относятся к основным принципам проектирования языка Kotlin. Первый принцип гласит, что конструкции, препятствующие развитию языка, должны быть удалены, а второй — что такое удаление должно быть должным образом сообщено заранее, чтобы минимизировать сложности при миграции кода.
Хотя большинство изменений в языке уже были объявлены другими каналами, такими как журналы обновлений или предупреждения компилятора, этот документ обобщает их все, предоставляя полную справку по миграции с Kotlin 1.5 на Kotlin 1.6.
Основные термины
В данном документе мы вводим несколько видов совместимости:
исходная : изменение, несовместимое с исходным кодом, приводит к тому, что код, который раньше компилировался без ошибок или предупреждений, больше не может быть скомпилирован
бинарная : два бинарных артефакта считаются бинарно совместимыми, если их обмен не приводит к ошибкам загрузки или компоновки
поведенческая : изменение считается поведенчески несовместимым, если один и тот же программный код демонстрирует разное поведение до и после применения изменения
Обратите внимание, что эти определения приведены только для чистого Kotlin. Совместимость кода Kotlin с точки зрения других языков (например, Java) выходит за рамки этого документа.
Язык
Делайте операторы when с перечислениями, запечатанными типами и булевыми значениями исчерпывающими по умолчанию
Проблема : KT-47709
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.6 будет предупреждать о том, что оператор when с перечислением, запечатанным типом или булевым значением не является исчерпывающим
Цикл устаревания :
1.6.0: вводятся предупреждения, когда оператор when с перечислением, запечатанным типом или булевым значением не исчерпывает все возможные варианты (ошибка в режиме постепенного улучшения)
1.7.0: эти предупреждения преобразуются в ошибки
Устаревание запутанной грамматики в операторах when
Проблема : KT-48385
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.6 устареет несколько запутанных грамматических конструкций в выражениях условия when
Цикл устаревания :
1.6.20: вводятся предупреждения об устаревании для затронутых выражений
1.8.0: эти предупреждения преобразуются в ошибки
>= 1.8: некоторые устаревшие конструкции будут переназначены для новых языковых функций
Запрет доступа к членам класса в вызове суперконструктора его компаньон-объектов и вложенных объектов
Проблема : KT-25289
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.6 будет сообщать об ошибке для аргументов вызова суперконструктора компаньон-объектов и обычных объектов, если получатель таких аргументов ссылается на содержащую декларацию
Цикл устаревания :
1.5.20: вводятся предупреждения о проблематичных аргументах
1.6.0: эти предупреждения преобразуются в ошибки, -XXLanguage:-ProhibitSelfCallsInNestedObjects можно использовать для временного возврата к поведению до 1.6
Улучшения в расширении нуллируемости типов
Проблема : 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.6.20: исправлено поведение приведения типа в других затронутых случаях
Запрет объявления повторяемых аннотаций, контейнерная аннотация которых нарушает JLS
Проблема : KT-47928
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.6 будет проверять, что контейнерная аннотация повторяемой аннотации удовлетворяет тем же требованиям, что и в JLS 9.6.3 : метод с массивом значений, удержание и целевое использование
Цикл устаревания :
1.5.30: вводятся предупреждения об объявлениях повторяемых контейнерных аннотаций, нарушающих требования JLS (ошибка в режиме постепенного улучшения)
1.6.0: эти предупреждения преобразуются в ошибки, -XXLanguage:-RepeatableAnnotationContainerConstraints можно использовать для временного отключения сообщений об ошибках
Запрет объявления вложенного класса с именем Container в классе повторяемой аннотации
Проблема : KT-47971
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.6 будет проверять, что в объявленной в Kotlin повторяемой аннотации нет вложенного класса с предопределенным именем Container
Цикл устаревания :
1.5.30: вводятся предупреждения об объявлениях вложенных классов с именем Container в классе Kotlin-повторяемой аннотации (ошибка в режиме постепенного улучшения)
1.6.0: эти предупреждения преобразуются в ошибки, -XXLanguage:-RepeatableAnnotationContainerConstraints можно использовать для временного отключения сообщений об ошибках
Запрет @JvmField для свойств в первичном конструкторе, переопределяющих свойства интерфейса
Проблема : KT-32753
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.6 запретит аннотирование свойства, объявленного в первичном конструкторе и переопределяющего свойство интерфейса, аннотацией @JvmField
Цикл устаревания :
1.5.20: вводятся предупреждения об аннотации @JvmField для таких свойств в первичном конструкторе
1.6.0: эти предупреждения преобразуются в ошибки, -XXLanguage:-ProhibitJvmFieldOnOverrideFromInterfaceInPrimaryConstructor можно использовать для временного отключения сообщений об ошибках
Устаревание режимов enable и compatibility опции компилятора -Xjvm-default
Вопрос : KT-46329
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.6.20 будет выводить предупреждение об использовании режимов enable и compatibility опции компилятора -Xjvm-default
Цикл устаревания :
Запрет вызовов super из публичных inline-функций public-abi
Вопрос : KT-45379
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.6 запретит вызовы функций с квалификатором super из публичных или защищенных inline-функций и свойств
Цикл устаревания :
1.5.0: ввести предупреждение о вызовах super из публичных или защищенных inline-функций или аксессоров свойств
1.6.0: повысить это предупреждение до ошибки, -XXLanguage:-ProhibitSuperCallsFromPublicInline может быть использован для временного отключения выдачи сообщений об ошибках
Запрет вызовов защищенных конструкторов из публичных inline-функций
Вопрос : KT-48860
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.6 запретит вызовы защищенных конструкторов из публичных или защищенных inline-функций и свойств
Цикл устаревания :
1.4.30: ввести предупреждение о вызовах защищенных конструкторов из публичных или защищенных inline-функций или аксессоров свойств
1.6.0: повысить это предупреждение до ошибки, -XXLanguage:-ProhibitProtectedConstructorCallFromPublicInline может быть использован для временного отключения выдачи сообщений об ошибках
Запрет экспорта приватных вложенных типов из приватных типов в файле
Вопрос : KT-20094
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.6 запретит экспорт приватных вложенных типов и внутренних классов из приватных типов в файле
Цикл устаревания :
1.5.0: ввести предупреждение об экспонировании приватных типов из приватных типов в файле
1.6.0: повысить это предупреждение до ошибки, -XXLanguage:-PrivateInFileEffectiveVisibility может быть использован для временного отключения выдачи сообщений об ошибках
Целевой объект аннотации не анализируется в нескольких случаях для аннотаций на типе
Вопрос : KT-28449
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.6 больше не будет допускать аннотаций на типах, которые не должны применяться к типам
Цикл устаревания :
1.5.20: введение ошибки в пошаговом режиме
1.6.0: введение ошибки, -XXLanguage:-ProperCheckAnnotationsTargetInTypeUsePositions может быть использован для временного отключения выдачи сообщений об ошибках
Запрет вызовов функций с именем suspend с заключительной лямбдой
Вопрос : KT-22562
Компонент : Язык Kotlin
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.6 больше не будет разрешать вызовы функций с именем suspend, которые имеют единственный аргумент функционального типа, переданный в качестве заключительной лямбды
Цикл устаревания :
1.3.0: введение предупреждения о таких вызовах функций
1.6.0: повышение этого предупреждения до ошибки
>= 1.7.0: внесение изменений в грамматику языка, так что suspend перед { будет распознаваться как ключевое слово
Стандартная библиотека
Удаление хрупкой оптимизации contains в minus/removeAll/retainAll
Вопрос : KT-45438
Компонент : kotlin-stdlib
Тип несовместимого изменения : поведенческое
Краткое описание : Kotlin 1.6 больше не будет выполнять преобразование в множество для аргумента функций и операторов, удаляющих несколько элементов из коллекции/итерируемого объекта/массива/последовательности.
Цикл устаревания :
< 1.6: старое поведение: аргумент преобразуется в множество в некоторых случаях
1.6.0: если аргумент функции — коллекция, она больше не преобразуется в Set. Если это не коллекция, она может быть преобразована в List вместо этого. Старое поведение временно можно включить на JVM, установив системную переменную kotlin.collections.convert_arg_to_set_in_removeAll=true
>= 1.7: системная переменная выше больше не будет иметь эффекта
Изменение алгоритма генерации значений в Random.nextLong
Вопрос : KT-47304
Компонент : kotlin-stdlib
Тип несовместимого изменения : поведенческое
Краткое описание : Kotlin 1.6 изменяет алгоритм генерации значений в функции Random.nextLong, чтобы избежать создания значений, выходящих за заданный диапазон.
Цикл устаревания :
Постепенное изменение типа возвращаемого значения функций 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: повторное введение затронутого API, но с типом возвращаемого значения не-null
Устаревание функций массивов с плавающей точкой: contains, indexOf, lastIndexOf
Вопрос : KT-28753
Компонент : kotlin-stdlib
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin устаревает функции массивов с плавающей точкой contains, indexOf, lastIndexOf, которые сравнивают значения с использованием порядка IEEE-754 вместо полного порядка
Цикл устаревания :
1.4.0: устаревание затронутых функций с предупреждением
1.6.0: повышение уровня устаревания до ошибки
>= 1.7: скрытие устаревших функций от публичного 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.7: удаление устаревших функций из stdlib
>= 1.7: перемещение API в пакетах kotlinx.* в отдельную библиотеку
Функция Regex.replace не будет инлайновой в Kotlin/JS
Вопрос : KT-27738
Компонент : kotlin-stdlib (JS)
Тип несовместимого изменения : исходный код
Краткое описание : функция Regex.replace с функциональным параметром transform больше не будет инлайновой в Kotlin/JS
Цикл устаревания :
Разное поведение функции Regex.replace в JVM и JS, когда строка замены содержит ссылку на группу
Вопрос : KT-28378
Компонент : kotlin-stdlib (JS)
Тип несовместимого изменения : поведенческое
Краткое описание : функция Regex.replace в Kotlin/JS со строкой шаблона замены будет следовать той же синтаксике шаблона, что и в Kotlin/JVM
Цикл устаревания :
Использование Unicode преобразования регистра в JS Regex
Вопрос : KT-45928
Компонент : kotlin-stdlib (JS)
Тип несовместимого изменения : поведенческое
Краткое описание : класс Regex в Kotlin/JS будет использовать флаг unicode , когда вызывается базовый движок JS регулярных выражений для поиска и сравнения символов в соответствии с правилами Unicode. Это требует определённых версионных ограничений для JS среды и приводит к более жёсткой валидации ненужного экранирования в строке шаблона регулярного выражения.
Цикл устаревания :
Устаревание некоторых API, доступных только в JS
Вопрос : KT-48587
Компонент : kotlin-stdlib (JS)
Тип несовместимого изменения : исходный код
Краткое описание : ряд функций, доступных только в JS, в stdlib устарели и будут удалены. К ним относятся: String.concat(String), String.match(regex: String), String.matches(regex: String), а также функции массивов, принимающие функцию сравнения, например, Array<out T>.sort(comparison: (a: T, b: T) -> Int)
Цикл устаревания :
1.6.0: устаревание затронутых функций с предупреждением
1.7.0: уровень устаревания повышен до ошибки
1.8.0: удаление устаревших функций из публичного API
Скрытие функций, специфичных для реализации и взаимодействия, из публичного API классов в Kotlin/JS
Вопрос : KT-48587
Компонент : kotlin-stdlib (JS)
Тип несовместимого изменения : исходный код, бинарный
Краткое описание : функции HashMap.createEntrySet и AbstactMutableCollection.toJSON изменят свою видимость на internal
Цикл устаревания :
Устаревание класса KotlinGradleSubplugin
Вопрос : KT-48830
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : класс KotlinGradleSubplugin будет устаревшим в пользу KotlinCompilerPluginSupportPlugin
Цикл устаревания :
Удаление параметра сборки kotlin.useFallbackCompilerSearch
Вопрос : KT-46719
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : удаление устаревшего параметра сборки 'kotlin.useFallbackCompilerSearch'
Цикл устаревания :
Удаление нескольких параметров компилятора
Вопрос : KT-48847
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : удаление устаревших параметров компилятора noReflect и includeRuntime
Цикл устаревания :
Устаревание параметра компилятора useIR
Вопрос : KT-48847
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : скрытие устаревшего параметра компилятора useIR
Цикл устаревания :
Устаревание свойства Gradle kapt.use.worker.api
Вопрос : KT-48826
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : устаревание свойства kapt.use.worker.api, позволявшего запускать kapt через Gradle Workers API (по умолчанию: true)
Цикл устаревания :
Удаление свойства Gradle kotlin.parallel.tasks.in.project
Вопрос : KT-46406
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : удаление свойства kotlin.parallel.tasks.in.project
Цикл устаревания :
Устаревание Gradle DSL параметра kotlin.experimental.coroutines и свойства kotlin.coroutines
Вопрос : KT-50369
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : устаревание Gradle DSL параметра kotlin.experimental.coroutines и свойства kotlin.coroutines
Цикл устаревания :
Последнее изменение: 10 января 2023