TGViewer
Kotlin Multiplatform Broadcast Kotlin Multiplatform Broadcast @kotlin_broadcast · 9.55K subscribers
Post #2155 1.89K
🏝 Kotlin 2.5.0: раздельная компиляция common и платформенного кода в KMP

Сталкивались с багом IDE, когда подсвечивает вызов в commonMain красным, а сборка проходит. Это не баг IDE, так устроена текущая схема компиляции KMP.

Когда собирается, например, JVM-таргет, код из commonMain компилируется вместе с jvmMain против платформенных артефактов зависимостей, то есть против JAR. Поэтому common код может незаметно зарезолвиться в платформенную декларацию библиотеки. IDE же анализирует commonMain только по metadata KLIB, где есть лишь common-декларации.

Из-за этого возникают три класса проблем.

❌ Красный код в IDE компилируется
// lib/jvmMain
class Foo
// app/commonMain
Foo() // IDE: Unresolved reference, сборка: ок

То же самое с commonTest: тесты могут вызывать код из jvmMain вместо commonMain.

❌ Выбирается другая перегрузка
// lib/commonMain
fun foo(x: Any) = "common"
// lib/jvmMain
fun foo(x: String) = "platform"
// app/commonMain
println(foo("")) // IDE ведёт в common, в рантайме печатается "platform"


❌ Вывод типов ломается только на одной платформе
Если actual-классы на JVM добавляют лишний супертип (например, Serializable), то if (...) ClickEvent() else ScrollEvent() на JVM выводится в Any вместо Event. В итоге .name не резолвится, хотя IDE ошибок не видит.

Что меняется с раздельной компиляцией в Kotlin 2.5.0
✔️ 1. Common-код ведёт себя одинаково на всех платформах Сейчас один и тот же вызов из commonMain может выбрать разные перегрузки на разных таргетах:
// lib/commonMain
fun foo(x: Any) = "common"
// lib/jvmMain
fun foo(x: String) = "platform"
// app/commonMain
println(foo("")) // JVM: "platform", остальные таргеты: "common"

С тем же связан вывод типов. Если actual-класс на JVM добавляет супертип (например, Serializable), то if (...) ClickEvent() else ScrollEvent() на JVM выводится в Any, и код не собирается только там. В новом режиме common-код резолвится один раз и одинаково для всех.

✔️ 2. Common-код по-настоящему common Сейчас commonMain может случайно вызвать платформенный класс зависимости, и всё соберётся. Проблема всплывёт, когда добавите iOS или Wasm, и чинить придётся задним числом. Новый режим ловит это сразу, а исправление явное: через expect/actual.

✔️ 3. Тесты проверяют то, что заявлено commonTest сейчас может вызвать код из jvmMain вместо commonMain. Тест зелёный на JVM, хотя common-контракт он не проверяет. В новом режиме тесты видят только common API.

✔️ 4. Задел для ускорения сборки Если common source sets компилируются отдельно, их можно будет собирать инкрементально. JetBrains прямо называет это следующим шагом. Для больших KMP-модулей это потенциально заметный выигрыш.

✔️ 5. Согласованность IDE и компилятор Красный код в IDE больше не будет собираться, а Go to declaration будет вести туда, что реально вызовется.

✔️ Как включить (experimental, по умолчанию выключено):
# gradle.properties
kotlin.kmp.separateCompilation=true


Перед включением важно учесть:
👉 Авторам библиотек нужно публиковать metadata KLIB. KMP Gradle plugin делает это по умолчанию, но теперь без них работать не будет
👉 С cinterop пока есть проблемы коммонизации (KT-88178, KT-41509), так что включайте осторожно
👉 Модули с единственным таргетом пока не затронуты
👉 После включения часть старого кода может перестать собираться. Это места, где common-код случайно опирался на платформенные API

Совет: включите флаг на ветке и посмотрите, что упадёт. Каждая такая ошибка показывает место, где common-код на самом деле не был common.

🔗 Подробнее в блоге Kotlin

#Kotlin #KMP #IDEA
  • 🔥 16
  • 👍 5
  • ❤ 1
More from @kotlin_broadcast
  1. Oct 8, 2026🏝 Вышел Kotlin 2.4.21 с исправлениями багов Это патч к Kotlin 2.4.20: 12 фиксов и никаких…
  2. Oct 7, 2026🏝 Kotlin от IntelliJ IDEA теперь в VS Code и Cursor JetBrains выпустила Release Candidate…
  3. Oct 7, 2026🏝 State of Kotlin 2026: главное из отчёта JetBrains к 15-летию языка 👥 Kotlin знают 8,1…
  4. Oct 6, 2026🏝 JetBrains убирает поддержку Swift из KMP-плагина Начиная с IntelliJ IDEA 2026.3 и Andro…
  5. Sep 29, 2026🐱 KtorMonitor — библиотека для инспекции запросов Ktor прямо на клиенте. ‼️ ВАЖНО! Не под…
  6. Sep 28, 2026Опрос разработчиков на Kotlin от JetBrains - потратьте немного своего времени, чтобы помоч…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →