Что нового в Kotlin 1.5.0
Kotlin 1.5.0 включает новые возможности языка, стабильный IR-базированный компилятор JVM-бекенд, улучшения производительности и эволюционные изменения, такие как стабилизация экспериментальных функций и устаревание устаревших.
Обзор изменений также можно найти в статье в блоге о выпуске.
Возможности языка
Kotlin 1.5.0 предоставляет стабильные версии новых возможностей языка, представленных в виде предварительной версии в 1.4.30:
Подробные описания этих функций доступны в этой статье в блоге и на соответствующих страницах документации Kotlin.
Поддержка JVM-записей
Java быстро развивается, и чтобы Kotlin оставался совместимым с ним, мы внедрили поддержку одной из его последних функций — классов-записей.
Поддержка Kotlin для JVM-записей включает двустороннюю совместимость:
В коде Kotlin вы можете использовать классы-записи Java так же, как и типичные классы со свойствами.
Чтобы использовать класс Kotlin в качестве записи в Java-коде, сделайте его классом
dataи отметьте его аннотацией@JvmRecord.
@JvmRecord data class User(val name: String, val age: Int)
Дополнительную информацию об использовании JVM-записей в Kotlin см. здесь.
Запечатанные интерфейсы
Теперь интерфейсы Kotlin могут иметь модификатор sealed, который работает с интерфейсами так же, как и с классами: все реализации запечатанного интерфейса известны на этапе компиляции.
sealed interface Polygon
Вы можете использовать этот факт, например, для написания исчерпывающих when выражений.
fun draw(polygon: Polygon) = when (polygon) {
is Rectangle -> // ...
is Triangle -> // ...
// else is not needed - all possible implementations are covered
}
Кроме того, запечатанные интерфейсы позволяют использовать более гибкие ограниченные иерархии классов, поскольку класс может напрямую наследоваться от более одного запечатанного интерфейса.
class FilledRectangle: Polygon, Fillable
Дополнительную информацию о запечатанных интерфейсах см. здесь.
Иерархии запечатанных классов по всему пакету
Запечатанные классы теперь могут иметь подклассы во всех файлах одного модуля компиляции и одного пакета. Раньше все подклассы должны были находиться в одном файле.
Прямые подклассы могут быть уровня верхнего уровня или вложены внутри любого количества других именованных классов, именованных интерфейсов или именованных объектов.
Подклассы запечатанного класса должны иметь правильное имя — они не могут быть локальными или анонимными объектами.
Дополнительную информацию об иерархиях запечатанных классов см. здесь.
Встроенные классы
Встроенные классы — это подмножество классов на основе значений, которые содержат только значения. Вы можете использовать их в качестве оберток для значения определенного типа без дополнительной нагрузки, связанной с выделением памяти.
Встроенные классы могут быть объявлены с модификатором value перед именем класса:
value class Password(val s: String)
JVM-бекенд также требует специальной аннотации @JvmInline.
@JvmInline value class Password(val s: String)
Модификатор inline теперь устарел и сопровождается предупреждением.
Kotlin/JVM
Kotlin/JVM получил ряд улучшений, как внутренних, так и направленных на пользователя. Вот самые заметные из них:
Стабильный JVM IR бэкенд
Бэкенд на основе IR для компилятора Kotlin/JVM теперь стабилен и включен по умолчанию.
Начиная с Kotlin 1.4.0, предварительные версии IR-бэкенда были доступны для предварительного просмотра, и теперь он стал по умолчанию для версии языка 1.5. Старый бэкенд по-прежнему используется по умолчанию для более ранних версий языка.
Дополнительные сведения о преимуществах IR-бэкенда и его дальнейшей разработке можно найти в этой статье блога.
Если вам необходимо использовать старый бэкенд в Kotlin 1.5.0, добавьте следующие строки в конфигурационный файл проекта:
В 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: 1.8 по умолчанию
Целевая версия для компиляций Kotlin/JVM по умолчанию теперь 1.8. Цель 1.6 устарела.
Если вам нужна сборка для JVM 1.6, вы всё ещё можете переключиться на эту цель. Узнайте как:
SAM адаптеры через invokedynamic
Kotlin 1.5.0 теперь использует динамические вызовы (invokedynamic) для компиляции преобразований SAM (Single Abstract Method):
Над любым выражением, если тип SAM — интерфейс Java
Над лямбдой, если тип SAM — Kotlin функциональный интерфейс
Новая реализация использует LambdaMetafactory.metafactory(), и вспомогательные оберточные классы больше не генерируются во время компиляции. Это уменьшает размер JAR приложения, что улучшает производительность запуска JVM.
Чтобы вернуться к старой схеме реализации на основе генерации анонимных классов, добавьте опцию компилятора -Xsam-conversions=class.
Узнайте, как добавлять опции компилятора в Gradle, Maven и командной строке компилятора.
Лямбды через invokedynamic
Kotlin 1.5.0 вводит экспериментальную поддержку компиляции обычных Kotlin лямбд (которые не преобразуются в экземпляр функционального интерфейса) в динамические вызовы (invokedynamic). Реализация создаёт более компактные двоичные файлы, используя LambdaMetafactory.metafactory(), что эффективно генерирует необходимые классы во время выполнения. В настоящее время у неё есть три ограничения по сравнению с обычной компиляцией лямбд:
Лямбда, скомпилированная в invokedynamic, не сериализуема.
Вызов
toString()на такой лямбде даёт менее удобочитаемое строковое представление.Экспериментальный
reflectAPI не поддерживает лямбды, созданные сLambdaMetafactory.
Чтобы попробовать эту функцию, добавьте опцию компилятора -Xlambdas=indy. Мы будем благодарны, если вы поделитесь своими отзывами, используя этот YouTrack тикет.
Узнайте, как добавлять опции компилятора в Gradle, Maven и командной строке компилятора.
Устаревание @JvmDefault и старых режимов Xjvm-default
До Kotlin 1.4.0 существовала аннотация @JvmDefault наряду с режимами -Xjvm-default=enable и -Xjvm-default=compatibility. Они служили для создания JVM метода по умолчанию для любого конкретного не абстрактного члена в Kotlin интерфейсе.
В Kotlin 1.4.0 мы ввели новые режимы Xjvm-default, которые включают генерацию методов по умолчанию для всего проекта.
В Kotlin 1.5.0 мы устареваем @JvmDefault и старые режимы Xjvm-default: -Xjvm-default=enable и -Xjvm-default=compatibility.
Улучшения обработки аннотаций нулевых значений
Kotlin поддерживает обработку информации о нулевых значениях типов из Java с помощью аннотаций нулевых значений. Kotlin 1.5.0 вносит ряд улучшений для этой функции:
Он считывает аннотации нулевых значений для аргументов типов в скомпилированных Java библиотеках, используемых в качестве зависимостей.
-
Он поддерживает аннотации нулевых значений с целевой версией
TYPE_USEдля:Массивов
Varargs
Полей
Параметров типа и их границ
Аргументов типа базовых классов и интерфейсов
Если аннотация нулевого значения имеет несколько целевых типов, применимых к типу, и одна из этих целей —
TYPE_USE, тоTYPE_USEимеет приоритет. Например, подпись метода@Nullable String[] f()становитсяfun f(): Array<String?>!если@Nullableподдерживает какTYPE_USE, так иMETHODв качестве целей.
Для этих вновь поддерживаемых случаев использование неправильного типа нулевого значения при вызове Java из Kotlin приводит к предупреждениям. Используйте опцию компилятора -Xtype-enhancement-improvements-strict-mode для включения строгих режимов для этих случаев (с сообщением об ошибке).
Узнайте больше о безопасности нулевых значений и платформных типах.
Kotlin/Native
Kotlin/Native теперь обладает большей производительностью и стабильностью. Отличительные изменения следующие:
Улучшения производительности
В версии 1.5.0 Kotlin/Native получило набор улучшений производительности, ускоряющих как компиляцию, так и выполнение.
В режиме отладки теперь поддерживаются кэши компилятора для linuxX64 (только на хостах Linux) и iosArm64 целей. При включённых кэшах компилятора, большинство отладочных компиляций завершаются намного быстрее, за исключением первой. Измерения показали увеличение скорости примерно на 200% в наших тестовых проектах.
Чтобы использовать кэши компилятора для новых целей, включите их, добавив следующие строки в gradle.properties проекта:
Для
linuxX64:kotlin.native.cacheKind.linuxX64=staticДля
iosArm64:kotlin.native.cacheKind.iosArm64=static
Если у вас возникнут проблемы после включения кэшей компилятора, пожалуйста, сообщите о них в наш отслеживатель проблем YouTrack.
Другие улучшения ускоряют выполнение кода Kotlin/Native:
Тривиальные аксессоры свойств инлайнят.
trimIndent()для строковых литералов вычисляется во время компиляции.
Отключение проверки утечек памяти
Встроенная проверка утечек памяти Kotlin/Native отключена по умолчанию.
Изначально она была разработана для внутреннего использования, и способна обнаруживать утечки только в ограниченном числе случаев, а не во всех. Более того, позже выяснилось, что она может вызывать сбои приложения. Поэтому мы решили отключить проверку утечек памяти.
Проверка утечек памяти может быть полезной в определенных случаях, например, при тестировании модулей. В таких случаях вы можете включить её, добавив следующую строку кода:
Platform.isMemoryLeakCheckerActive = true
Обратите внимание, что включение проверки утечек памяти для выполнения приложения не рекомендуется.
Kotlin/JS
Kotlin/JS в версии 1.5.0 получает эволюционные изменения. Мы продолжаем работу по переходу компилятора JS IR к стабильной версии и внедряем другие обновления:
Обновление до webpack 5
Плагин Kotlin/JS Gradle теперь использует webpack 5 для целей браузера вместо webpack 4. Это существенное обновление webpack, которое вносит несовместимые изменения. Если вы используете пользовательскую конфигурацию webpack, обязательно проверьте примечания к выпуску webpack 5.
Фреймворки и библиотеки для компилятора IR
Вместе с работой над IR-подобным бэкендом компилятора Kotlin/JS мы поощряем и помогаем авторам библиотек создавать свои проекты в both режиме. Это означает, что они могут генерировать артефакты для обоих компиляторов Kotlin/JS, тем самым расширяя экосистему нового компилятора.
Многие известные фреймворки и библиотеки уже доступны для IR бэкенда: KVision, fritz2, doodle, и другие. Если вы используете их в своём проекте, вы уже можете его собрать с IR бэкендом и увидеть преимущества, которые он несёт.
Если вы пишете собственную библиотеку, скомпилируйте её в режиме "both", чтобы ваши клиенты также могли использовать её с новым компилятором.
Kotlin Multiplatform
В Kotlin 1.5.0 выбор зависимости для тестирования на каждой платформе был упрощён, и теперь выполняется автоматически плагином Gradle.
Новый API для получения категории символа теперь доступен в проектах multiplatform.
Стандартная библиотека
Стандартная библиотека получила ряд изменений и улучшений, от стабилизации экспериментальных частей до добавления новых функций:
Стабильный API, не зависящий от локали, для перевода текста в верхний/нижний регистр
Новый API для получения категории символа теперь доступен в многоплатформенном коде
Вы можете узнать больше об изменениях в стандартной библиотеке в этом сообщении в блоге.
Стабильные беззнаковые целочисленные типы
Беззнаковые целочисленные типы UInt, ULong, UByte, UShort теперь стабильны. То же самое относится к операциям над этими типами, диапазонами и прогрессиями. Беззнаковые массивы и операции над ними остаются в бета-версии.
Стабильный API, не зависящий от локали, для перевода текста в верхний/нижний регистр
Этот релиз включает новый API, не зависящий от локали, для преобразования текста в верхний/нижний регистр. Он предоставляет альтернативу функциям API toLowerCase(), toUpperCase(), capitalize() и decapitalize(), которые зависят от локали. Новый API помогает избежать ошибок из-за различных настроек локали.
Kotlin 1.5.0 предоставляет следующие полностью стабильные альтернативы:
-
Для функций
String:Более ранние версии
Альтернатива 1.5.0
String.toUpperCase()String.uppercase()String.toLowerCase()String.lowercase()String.capitalize()String.replaceFirstChar { it.uppercase() }String.decapitalize()String.replaceFirstChar { it.lowercase() } -
Для функций
Char:Более ранние версии
Альтернатива 1.5.0
Char.toUpperCase()Char.uppercaseChar(): Char,Char.uppercase(): StringChar.toLowerCase()Char.lowercaseChar(): Char,Char.lowercase(): StringChar.toTitleCase()Char.titlecaseChar(): Char,Char.titlecase(): String
Старые функции API помечены как устаревшие и будут удалены в будущих выпусках.
См. полный список изменений в функциях обработки текста в KEEP.
Стабильный API преобразования char в целое число
Начиная с Kotlin 1.5.0, новые функции преобразования char в код и char в цифру являются стабильными. Эти функции заменяют текущие функции API, которые часто путали с похожим преобразованием строки в Int.
Новый API устраняет эту путаницу в именовании, делая поведение кода более прозрачным и однозначным.
Этот релиз представляет преобразования Char, которые разделены на следующие наборы функций с четкими именами:
Функции для получения целочисленного кода
Charи для созданияCharиз заданного кода:
fun Char(code: Int): Char fun Char(code: UShort): Char val Char.code: Int
Функции для преобразования
Charв числовое значение цифры, которую он представляет:
fun Char.digitToInt(radix: Int): Int fun Char.digitToIntOrNull(radix: Int): Int?
Функция-расширение для
Intдля преобразования представляемой им неотрицательной однозначной цифры в соответствующее представлениеChar:
fun Int.digitToChar(radix: Int): Char
Старые API преобразования, включая Number.toChar() с его реализациями (все, кроме Int.toChar()) и расширения Char для преобразования в числовой тип, такой как Char.toInt(), теперь устарели.
Узнать больше об API преобразования char в целое число в KEEP.
Стабильный API пути
Экспериментальный API пути с расширениями для java.nio.file.Path теперь стабилен.
// construct path with the div (/) operator
val baseDir = Path("/base")
val subDir = baseDir / "subdirectory"
// list files in a directory
val kotlinFiles: List<Path> = Path("/home/user").listDirectoryEntries("*.kt")
Операция деления с округлением вниз и оператор mod
В стандартную библиотеку были добавлены новые операции для модульной арифметики:
floorDiv()возвращает результат деления с округлением вниз. Он доступен для целочисленных типов.mod()возвращает остаток от деления с округлением вниз (модуль). Он доступен для всех числовых типов.
Эти операции очень похожи на существующие деление целых чисел и функцию rem() (или оператор %), но они работают по-разному с отрицательными числами:
a.floorDiv(b)отличается от обычного/тем, чтоfloorDivокругляет результат вниз (к меньшему целому числу), тогда как/усекает результат до целого числа, ближайшего к 0.a.mod(b)- это разница междуaиa.floorDiv(b) * b. Она либо равна нулю, либо имеет тот же знак, что иb, тогда какa % bможет иметь другой.
fun main() {
//sampleStart
println("Floored division -5/3: ${(-5).floorDiv(3)}")
println( "Modulus: ${(-5).mod(3)}")
println("Truncated division -5/3: ${-5 / 3}")
println( "Remainder: ${-5 % 3}")
//sampleEnd
}
Изменения в API Duration
Существует экспериментальный класс Duration для представления продолжительности во времени в различных единицах измерения. В версии 1.5.0 API Duration претерпел следующие изменения:
Внутреннее представление значений теперь использует
LongвместоDoubleдля повышения точности.Новый API для преобразования в определённую единицу измерения времени в
Long. Он призван заменить старый API, работающий сDoubleзначениями, который теперь устарел. Например,Duration.inWholeMinutesвозвращает значение продолжительности, выраженное вLongи заменяетDuration.inMinutes.Новые вспомогательные функции для создания
Durationиз числа. Например,Duration.seconds(Int)создаёт объектDurationпредставляющий целое количество секунд. Старые расширяющие свойства, такие какInt.seconds, теперь устарели.
import kotlin.time.Duration
import kotlin.time.ExperimentalTime
@ExperimentalTime
fun main() {
//sampleStart
val duration = Duration.milliseconds(120000)
println("There are ${duration.inWholeSeconds} seconds in ${duration.inWholeMinutes} minutes")
//sampleEnd
}
Новый API для получения категории символа, доступный в многоплатформенном коде
Kotlin 1.5.0 вводит новый API для получения категории символа в соответствии с Unicode в многоплатформенных проектах. Несколько функций теперь доступны на всех платформах и в общем коде.
Функции для проверки, является ли символ буквой или цифрой:
fun main() {
//sampleStart
val chars = listOf('a', '1', '+')
val (letterOrDigitList, notLetterOrDigitList) = chars.partition { it.isLetterOrDigit() }
println(letterOrDigitList) // [a, 1]
println(notLetterOrDigitList) // [+]
//sampleEnd
}
Функции для проверки регистра символа:
fun main() {
//sampleStart
val chars = listOf('Dž', 'Lj', 'Nj', 'Dz', '1', 'A', 'a', '+')
val (titleCases, notTitleCases) = chars.partition { it.isTitleCase() }
println(titleCases) // [Dž, Lj, Nj, Dz]
println(notTitleCases) // [1, A, a, +]
//sampleEnd
}
Другие функции:
Свойство Char.category и его тип перечисления CharCategory, указывающий общую категорию символа в соответствии с Unicode, теперь также доступны в многоплатформенных проектах.
Новая функция для коллекций firstNotNullOf()
Новые функции firstNotNullOf() и firstNotNullOfOrNull() объединяют mapNotNull() с first() или firstOrNull(). Они отображают исходную коллекцию с помощью пользовательской функции-селектора и возвращают первое не-null значение. Если такого значения нет, firstNotNullOf() выбрасывает исключение, а firstNotNullOfOrNull() возвращает null.
fun main() {
//sampleStart
val data = listOf("Kotlin", "1.5")
println(data.firstNotNullOf(String::toDoubleOrNull))
println(data.firstNotNullOfOrNull(String::toIntOrNull))
//sampleEnd
}
Строгая версия String?.toBoolean()
Две новые функции вводят регистронезависимые строгие версии существующей String?.toBoolean():
String.toBooleanStrict()выбрасывает исключение для всех входных данных, кроме литераловtrueиfalse.String.toBooleanStrictOrNull()возвращает null для всех входных данных, кроме литераловtrueиfalse.
fun main() {
//sampleStart
println("true".toBooleanStrict())
println("1".toBooleanStrictOrNull())
// println("1".toBooleanStrict()) // Exception
//sampleEnd
}
Библиотека kotlin-test
Библиотека kotlin-test вводит некоторые новые возможности:
Упрощенное использование зависимостей тестов в многоплатформенных проектах
Автоматический выбор фреймворка тестирования для наборов исходных кодов Kotlin/JVM
Упрощенное использование зависимостей тестов в многоплатформенных проектах
Теперь вы можете использовать зависимость kotlin-test, чтобы добавить зависимости для тестирования в набор исходных кодов commonTest, и плагин Gradle выведет соответствующие платформенные зависимости для каждого набора исходных кодов тестов:
kotlin-test-junitдля наборов исходных кодов JVM, см. автоматический выбор фреймворка тестирования для наборов исходных кодов Kotlin/JVMkotlin-test-jsдля наборов исходных кодов Kotlin/JSkotlin-test-commonиkotlin-test-annotations-commonдля общих наборов исходных кодовДополнительный артефакт для наборов исходных кодов Kotlin/Native не требуется
Кроме того, вы можете использовать зависимость kotlin-test в любом общем или платформенно-специфическом наборе исходных кодов.
Существующая настройка kotlin-test с явными зависимостями будет по-прежнему работать как в Gradle, так и в Maven.
Узнайте больше о установке зависимостей от библиотек тестов.
Автоматический выбор фреймворка тестирования для наборов исходных кодов Kotlin/JVM
Плагин Gradle теперь автоматически выбирает и добавляет зависимость от фреймворка тестирования. Все, что вам нужно сделать, это добавить зависимость kotlin-test в общий набор исходных кодов.
По умолчанию Gradle использует JUnit 4. Поэтому зависимость kotlin("test") разрешается до варианта для JUnit 4, а именно kotlin-test-junit.
kotlin {
sourceSets {
val commonTest by getting {
dependencies {
implementation(kotlin("test")) // This brings the dependency
// on JUnit 4 transitively
}
}
}
}
kotlin {
sourceSets {
commonTest {
dependencies {
implementation kotlin("test") // This brings the dependency
// on JUnit 4 transitively
}
}
}
}
Вы можете выбрать JUnit 5 или TestNG, вызвав useJUnitPlatform() или useTestNG() в задаче тестирования:
tasks {
test {
// enable TestNG support
useTestNG()
// or
// enable JUnit Platform (a.k.a. JUnit 5) support
useJUnitPlatform()
}
}
Вы можете отключить автоматический выбор фреймворка тестирования, добавив строку kotlin.test.infer.jvm.variant=false в gradle.properties проекта.
Узнайте больше о установке зависимостей от библиотек тестов.
Обновления функций утверждений
Этот выпуск содержит новые функции утверждений и улучшения существующих.
Библиотека kotlin-test теперь имеет следующие возможности:
-
Проверка типа значения
Вы можете использовать новые
assertIs<T>иassertIsNot<T>для проверки типа значения:@Test fun testFunction() { val s: Any = "test" assertIs<String>(s) // throws AssertionError mentioning the actual type of s if the assertion fails // can now print s.length because of contract in assertIs println("${s.length}") }Из-за стирания типов эта функция утверждения проверяет только, является ли
valueтипаListв следующем примере, и не проверяет, является ли это списком определенного типаStringэлемента:assertIs<List<String>>(value). -
Сравнение содержимого контейнера для массивов, последовательностей и произвольных итерируемых объектов
Есть новый набор перегруженных функций
assertContentEquals()для сравнения содержимого для различных коллекций, которые не реализуют структурное равенство:@Test fun test() { val expectedArray = arrayOf(1, 2, 3) val actualArray = Array(3) { it + 1 } assertContentEquals(expectedArray, actualArray) } -
Новые перегрузки для
assertEquals()иassertNotEquals()дляDoubleиFloatчиселЕсть новые перегрузки для функции
assertEquals(), которые позволяют сравнивать дваDoubleилиFloatчисла с абсолютной точностью. Значение точности задается как третий параметр функции:@Test fun test() { val x = sin(PI) // precision parameter val tolerance = 0.000001 assertEquals(0.0, x, tolerance) } -
Новые функции для проверки содержимого коллекций и элементов
Теперь вы можете проверить, содержит ли коллекция или элемент что-то с помощью функции
assertContains(). Вы можете использовать ее с коллекциями Kotlin и элементами, имеющими операторcontains(), такие какIntRange,String, и другие:@Test fun test() { val sampleList = listOf<String>("sample", "sample2") val sampleString = "sample" assertContains(sampleList, sampleString) // element in collection assertContains(sampleString, "amp") // substring in string } -
assertTrue(),assertFalse(),expect()функции теперь inlineТеперь вы можете использовать их как inline функции, поэтому можно вызывать подвешенные функции внутри лямбда-выражения:
@Test fun test() = runBlocking<Unit> { val deferred = async { "Kotlin is nice" } assertTrue("Kotlin substring should be present") { deferred.await() .contains("Kotlin") } }
Библиотеки kotlinx
Вместе с Kotlin 1.5.0 мы выпускаем новые версии библиотек kotlinx:
Coroutines 1.5.0-RC
kotlinx.coroutines 1.5.0-RC доступен с:
Стабильные реактивные интеграции
И многое другое
Начиная с Kotlin 1.5.0, экспериментальные coroutines отключены, а флаг -Xcoroutines=experimental больше не поддерживается.
Узнайте больше в блоге изменений и в kotlinx.coroutines блоге о релизе 1.5.0.
Serialization 1.2.1
kotlinx.serialization 1.2.1 доступен с:
Улучшения производительности JSON сериализации
Поддержка нескольких имен в JSON сериализации
Экспериментальная генерация схемы .proto из
@SerializableклассовИ многое другое
Узнайте больше в блоге изменений и в kotlinx.serialization блоге о релизе 1.2.1.
dateTime 0.2.0
kotlinx-datetime 0.2.0 доступен с:
@SerializableОбъекты даты и времениНормализованная API
DateTimePeriodиDatePeriodИ многое другое
Узнайте больше в блоге изменений и в kotlinx-datetime блоге о релизе 0.2.0.
Миграция на Kotlin 1.5.0
IntelliJ IDEA и Android Studio предложат обновить плагин Kotlin до 1.5.0, как только он станет доступен.
Чтобы мигрировать существующие проекты на Kotlin 1.5.0, просто измените версию Kotlin на 1.5.0 и повторно импортируйте свой проект Gradle или Maven. Узнайте, как обновить до Kotlin 1.5.0.
Чтобы начать новый проект с Kotlin 1.5.0, обновите плагин Kotlin и запустите мастер проектов из Файл | Новый | Проект.
Новый компилятор командной строки доступен для загрузки на странице выпуска GitHub.
Kotlin 1.5.0 является релизом с новыми функциями и поэтому может содержать несовместимые изменения в языке. Подробный список таких изменений можно найти в Руководстве по совместимости для Kotlin 1.5.
© 2010–2023 JetBrains s.r.o. and Kotlin Programming Language contributors
Licensed under the Apache License, Version 2.0.
https://kotlinlang.org/docs/whatsnew15.html