Spec-Zone.ru › Kotlin 1.6
Руководство по совместимости для 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
Улучшения повышения ясности типов с учётом возможности null
Вопрос : KT-48623
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.7 изменит способ загрузки и интерпретации аннотаций типов с учётом возможности null в 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 может быть использовано для временного отключения отчёта об ошибках
Устаревание режимов enabled и compatibility параметра компилятора -Xjvm-default
Вопрос : KT-46329
Компонент : Kotlin/JVM
Тип несовместимого изменения : исходный код
Краткое описание : Kotlin 1.6.20 будет выводить предупреждение об использовании режимов enabled и compatibility параметра компилятора -Xjvm-default
Цикл устаревания :
Запрет вызовов super из публичных inline-функций с 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 коллекций на не-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: повторное введение затронутого API, но с типом возвращаемого значения non-nullable
Устаревание функций массивов с плавающей точкой: 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 регулярных выражений для поиска и сравнения символов в соответствии с правилами Юникода. Это требует определенных версионных требований к среде 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
Цикл устаревания :
Устаревание свойства kapt.use.worker.api Gradle
Задача : KT-48826
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : устаревание свойства kapt.use.worker.api, которое позволяло запускать kapt через Gradle Workers API (по умолчанию: true)
Цикл устаревания :
Удаление свойства kotlin.parallel.tasks.in.project Gradle
Задача : KT-46406
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : удаление свойства kotlin.parallel.tasks.in.project
Цикл устаревания :
Устаревание параметров kotlin.experimental.coroutines Gradle DSL и kotlin.coroutines
Задача : KT-50369
Компонент : Gradle
Тип несовместимого изменения : исходный код
Краткое описание : устаревание параметра kotlin.experimental.coroutines Gradle DSL и свойства kotlin.coroutines
Цикл устаревания :
Последнее изменение: 07 апреля 2022