Перейти к содержимому

Компилятор Kotlin

Компилируйте Kotlin 2.5 с помощью elide kotlinc или при сборке проекта Elide со встроенными плагинами компилятора, такими как serialization и Metro, и создавайте ABI JAR.

На этой странице

Elide включает Kotlin 2.5.0-Beta1. Дистрибутив только со средой выполнения сообщает, что kotlinc нужен полный дистрибутив.

Компиляция исходных файлов

// Hello.kt
fun main() = println("Hello!")
elide kotlinc -- -d out Hello.kt
elide java -- -cp out HelloKt
0:12 / 0:12

Параметры kotlinc указываются после --, параметры Elide — до него. elide kotlinc --help выводит параметры Elide, elide kotlinc -- -help — параметры kotlinc.

elide java не добавляет стандартную библиотеку Kotlin, поэтому код, который её вызывает (listOf, joinToString), там завершается ошибкой:

fun main() = println(listOf("Hello", "Kotlin").joinToString(" "))
КомандаРезультат
elide kotlinc -- -d out Hello.kt, затем elide java -- -cp out HelloKtNoClassDefFoundError: kotlin/collections/CollectionsKt
elide kotlinc -- -include-runtime -d hello.jar Hello.ktКомпиляция завершается ошибкой
elide run Hello.ktHello Kotlin
elide build с артефактом Jvm.JvmApplicationСкрипт запуска со стандартной библиотекой в lib/

Параметры Elide

ПараметрНазначение
--incrementalХранить инкрементальное состояние в .dev/artifacts/kotlinc/incremental/ с ключом по выходному пути.
--incremental-cache-dir DIRХранить инкрементальное состояние в DIR.
--plugins LISTВключить ровно эти встроенные плагины: metro, serialization, atomicfu, power-assert.
--metro, --no-metroПринудительно включить или выключить DI-плагин Metro.
--testsВключить тестовые плагины (power-assert).
--max-errors NСколько ошибок показать; 0 показывает все. Предупреждения дедуплицируются и никогда не ограничиваются.
--report-used-deps PATHЗаписать элементы classpath, на которые ссылается результат (strict deps в Bazel).
--persistent_workerРаботать как постоянный воркер Bazel в режиме singleplex или multiplex.
--abi-onlyЭкспериментально: записать в -d только ABI JAR.

ABI JAR

elide kotlinc --abi-only -- -d header.jar src/**/*.kt

JAR содержит публичные и защищённые сигнатуры, @Metadata, значимые для ABI тела inline, значения const и маркеры аргументов по умолчанию. Неизменённый ABI даёт побайтно идентичный JAR, поэтому правки тел функций сохраняют зависимые модули в кеше.

ELIDE_KOTLINC_ABI_STRIP=1 пропускает генерацию кода тел. Не задавайте эту переменную, если ABI включает объявления, сгенерированные плагинами, например $serializer из kotlinx.serialization. Воркеры учитывают её для каждого запроса отдельно.

Сборка проектов

elide build компилирует наборы исходников Kotlin, найденные по соглашению или объявленные в elide.pkl.

kotlin {
  apiLevel = "auto"
  languageLevel = "auto"
  compilerOptions {
    allWarningsAsErrors = true
    optIn { "kotlin.time.ExperimentalTime" }
    freeCompilerArgs { "-Xcontext-parameters" }
  }
}
СвойствоНазначениеПо умолчанию
kotlin.apiLevel, kotlin.languageLevel"1.9" … "2.5", "latest" или "stable"."auto"
compilerOptions.optInМаркеры, передаваемые как -opt-in.нет
compilerOptions.progressiveMode, .extraWarnings, .allWarningsAsErrors, .suppressWarnings, .verboseСоответствующие переключатели kotlinc.false
compilerOptions.freeCompilerArgsДополнительные аргументы компилятора.нет
compilerOptions.apiVersion, .languageVersion, .jvmTargetВерсии для отдельной компиляции; "auto" следует проекту."auto"
compilerOptions.javaParametersГенерировать метаданные параметров для рефлексии Java.false
compilerOptions.jvmTargetValidationMode"ERROR", "WARNING" или "IGNORE" при несовпадении целевых версий Kotlin и Java."ERROR"
compilerOptions.noStdlib, .noJdkУбрать стандартную библиотеку или JDK из classpath.false
compilerOptions.includeRuntimeНе поддерживается: true приводит к ошибке компиляции Kotlin. Упаковывайте с помощью артефакта Jvm.JvmApplication.false
compilerOptions.incrementalИнкрементальные сборки проекта.true

Каждая компиляция записывает свои аргументы в kotlinc.args рядом с результатом.

Плагины и функции

kotlin.featuresДействиеПо умолчанию
kotlinxБиблиотеки KotlinX в корнях зависимостей Kotlin.true
defaultPluginsНабор встроенных плагинов.true
serializationПлагин и среда выполнения kotlinx.serialization.kotlinx && defaultPlugins
coroutinesСреда выполнения kotlinx.coroutines.kotlinx
atomicfuПлагин и среда выполнения kotlinx.atomicfu.kotlinx && defaultPlugins
powerAssertПлагин Power Assert.defaultPlugins
metroDI-плагин Metro.defaultPlugins
reflectionНеявный kotlin-reflect.true
testingТестовые библиотеки Kotlin в тестовых наборах.true
kotlin {
  features {
    metro = false
  }
  plugins {
    ["org.jetbrains.kotlinx.serialization"] {
      ["mode"] = "json"
    }
  }
}

dependencies {
  maven {
    kotlinPlugins { "com.example:my-compiler-plugin:1.0.0" }
  }
}
  • Каждая запись plugins превращается в -P plugin:<id>:<key>=<value>, с сортировкой по id и ключу.
  • Сторонние плагины указываются в группе kotlinPlugins и требуют ManagedKotlinToolchain или CustomKotlinToolchain. Встроенный компилятор выдаёт предупреждение Custom Kotlin compiler plugins are not supported when using the embedded compiler, plugins will not be applied и компилирует без них.
  • Встроенный плагин, которого нет в дистрибутиве, пропускается вместе с его параметрами, с предупреждением.
  • Неявные библиотеки Kotlin добавляются только в корни зависимостей с исходниками на Kotlin. reflection = false убирает kotlin-reflect; compilerOptions.noStdlib = true убирает его и стандартную библиотеку. Объявленные зависимости остаются.
  • project("core").friend() открывает internal-объявления соседнего проекта; см. Рабочие пространства.
  • Набор исходников видит internal-объявления наборов, от которых он зависит в том же проекте: каждого набора, указанного в его dependsOn (main для тестового набора, где он не указан), а также наборов, от которых зависят они.

Выбор инструментария

import "elide:Kotlin.pkl" as Kotlin

kotlin {
  toolchain = "embedded"                                       // the default
  // toolchain = new Kotlin.ManagedKotlinToolchain { version = "2.4.0" }
  // toolchain = new Kotlin.CustomKotlinToolchain { path = "/opt/kotlinc" }
}
ИнструментарийПоведение
"embedded"Kotlin, входящий в Elide.
ManagedKotlinToolchainЗагружает указанную версию (включая предварительные) с её стандартной библиотекой, reflect, тестовыми библиотеками и плагинами Kotlin. Версии KotlinX, Metro и других сторонних компонентов не меняются; проверьте, что они совместимы.
CustomKotlinToolchainЛокальный дистрибутив Kotlin; отсутствующие в нём встроенные плагины пропускаются.

Инструментарий применяется к сборкам проектов; elide kotlinc всегда использует встроенный компилятор.

KAPT и KSP не поддерживаются. Код на Kotlin, использующий сгенерированные типы Java, должен получать их из вышестоящего набора исходников или проекта.

Примеры

Начните с шаблона:

elide init --template ktjvm       # Kotlin app with a test

Была ли эта страница полезной?