Skip to content

Commit d20d49d

Browse files
committed
Generate kotlinc options from kotlin-compiler-arguments-description
Implement automatic generation of kotlinc options using the official kotlin-compiler-arguments-description artifact from JetBrains. This addresses several long-standing issues: 1. **Tristate boolean options**: Boolean flags now use string type with values ["true", "false"]. Unset means "use kotlinc default", avoiding the problem where rules_kotlin defaults conflicted with kotlinc version-specific defaults (e.g., x_lambdas, x_sam_conversions changed defaults in Kotlin 2.0). 2. **Escape hatch for new flags**: Added `extra_kotlinc_args` attribute to pass arbitrary flags directly to kotlinc without waiting for rules_kotlin updates. Useful for experimental flags or flags introduced in recent Kotlin versions. 3. **Auto-generated options**: WriteKotlincCapabilities now generates both capabilities.bzl (flag existence) and generated_opts.bzl (full typed Starlark options) from the compiler metadata artifact. 4. **Simplified maintenance**: Manual _KOPTS dict replaced with GENERATED_KOPTS import, with _MANUAL_KOPTS for special cases only. Changes: - Add kotlin-compiler-arguments-description dependency - Rewrite WriteKotlincCapabilities to use the new artifact - Generate generated_opts_X.Y.bzl with tristate booleans - Simplify opts.kotlinc.bzl to merge generated + manual options - Add comprehensive tests for tristate and passthrough behavior
1 parent 89fd270 commit d20d49d

File tree

12 files changed

+1815
-432
lines changed

12 files changed

+1815
-432
lines changed

MODULE.bazel

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ maven.install(
7979
"com.squareup.moshi:moshi-kotlin:1.15.1",
8080
"com.squareup.moshi:moshi-kotlin-codegen:1.15.1",
8181
"org.codehaus.plexus:plexus-utils:3.0.24",
82+
# kotlin-compiler-arguments-description provides JSON schema of all compiler options
83+
# Used by generator to produce capabilities.bzl with stability metadata
84+
"org.jetbrains.kotlin:kotlin-compiler-arguments-description:2.2.20",
85+
"org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:1.7.3",
8286
],
8387
fail_if_repin_required = True,
8488
fetch_sources = True,

kotlin_rules_maven_install.json

Lines changed: 78 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": "THERE_IS_NO_DATA_ONLY_ZUUL",
3-
"__INPUT_ARTIFACTS_HASH": -129239194,
4-
"__RESOLVED_ARTIFACTS_HASH": -667872389,
3+
"__INPUT_ARTIFACTS_HASH": -493818073,
4+
"__RESOLVED_ARTIFACTS_HASH": -1179498461,
55
"conflict_resolution": {
66
"com.google.guava:guava:27.1-jre": "com.google.guava:guava:33.2.1-jre"
77
},
@@ -398,6 +398,13 @@
398398
},
399399
"version": "1.3"
400400
},
401+
"org.jetbrains.kotlin:kotlin-compiler-arguments-description": {
402+
"shasums": {
403+
"jar": "6873cad5decf70502064a1b67c7d138e0e81b425142eff25636d35a5a61dba02",
404+
"sources": "2a55b5384dc7e5b57af2c8b3dd24a5c663372f39bfbb9cce955982efc8a0bb49"
405+
},
406+
"version": "2.2.20"
407+
},
401408
"org.jetbrains.kotlin:kotlin-reflect": {
402409
"shasums": {
403410
"jar": "a65166445bb85ef816cde127279fe0017d2b7cc439b3b972390e1b736d64e94c",
@@ -407,10 +414,10 @@
407414
},
408415
"org.jetbrains.kotlin:kotlin-stdlib": {
409416
"shasums": {
410-
"jar": "f31cc53f105a7e48c093683bbd5437561d1233920513774b470805641bedbc09",
411-
"sources": "5995c780c3ac742fb277ced561ebd7b0739227ea7c93a6bd9c7cee6593493fce"
417+
"jar": "8836ccffd3585fadda9901244b20d42901d2f3cd581058d8434e2ffabcf3a3e7",
418+
"sources": "27b9b8672ef33ae9c345b3e57d39b705560e7eca9ca2bf6485f323f612276c26"
412419
},
413-
"version": "2.0.21"
420+
"version": "2.2.20"
414421
},
415422
"org.jetbrains.kotlin:kotlin-stdlib-jdk7": {
416423
"shasums": {
@@ -426,6 +433,20 @@
426433
},
427434
"version": "1.8.21"
428435
},
436+
"org.jetbrains.kotlinx:kotlinx-serialization-core-jvm": {
437+
"shasums": {
438+
"jar": "f0adde45864144475385cf4aa7e0b7feb27f61fcf9472665ed98cc971b06b1eb",
439+
"sources": "d084ce9bf130919d4b899db09896531440d1e330919187c7932d7fe0fa5257b8"
440+
},
441+
"version": "1.7.3"
442+
},
443+
"org.jetbrains.kotlinx:kotlinx-serialization-json-jvm": {
444+
"shasums": {
445+
"jar": "b1e9138499ed8d20375edda3f2b1c95f3103a258eff6af9edc5ea07100f2b29c",
446+
"sources": "fddb3c7e3c92692769285476308dd7a39009aed1e8ae80112169d72d75a275ab"
447+
},
448+
"version": "1.7.3"
449+
},
429450
"org.jetbrains:annotations": {
430451
"shasums": {
431452
"jar": "ace2a10dc8e2d5fd34925ecac03e4988b2c0f851650c94b8cef49ba1bd111478",
@@ -627,6 +648,10 @@
627648
"org.codehaus.plexus:plexus-utils",
628649
"org.eclipse.sisu:org.eclipse.sisu.inject"
629650
],
651+
"org.jetbrains.kotlin:kotlin-compiler-arguments-description": [
652+
"org.jetbrains.kotlin:kotlin-stdlib",
653+
"org.jetbrains.kotlinx:kotlinx-serialization-json-jvm"
654+
],
630655
"org.jetbrains.kotlin:kotlin-reflect": [
631656
"org.jetbrains.kotlin:kotlin-stdlib"
632657
],
@@ -640,6 +665,13 @@
640665
"org.jetbrains.kotlin:kotlin-stdlib",
641666
"org.jetbrains.kotlin:kotlin-stdlib-jdk7"
642667
],
668+
"org.jetbrains.kotlinx:kotlinx-serialization-core-jvm": [
669+
"org.jetbrains.kotlin:kotlin-stdlib"
670+
],
671+
"org.jetbrains.kotlinx:kotlinx-serialization-json-jvm": [
672+
"org.jetbrains.kotlin:kotlin-stdlib",
673+
"org.jetbrains.kotlinx:kotlinx-serialization-core-jvm"
674+
],
643675
"org.ow2.asm:asm-analysis": [
644676
"org.ow2.asm:asm-tree"
645677
],
@@ -1314,6 +1346,15 @@
13141346
"org.hamcrest.core",
13151347
"org.hamcrest.internal"
13161348
],
1349+
"org.jetbrains.kotlin:kotlin-compiler-arguments-description": [
1350+
"org.jetbrains.kotlin.arguments.description",
1351+
"org.jetbrains.kotlin.arguments.dsl",
1352+
"org.jetbrains.kotlin.arguments.dsl.base",
1353+
"org.jetbrains.kotlin.arguments.dsl.types",
1354+
"org.jetbrains.kotlin.arguments.serialization.json",
1355+
"org.jetbrains.kotlin.arguments.serialization.json.base",
1356+
"org.jetbrains.kotlin.cli.common.arguments"
1357+
],
13171358
"org.jetbrains.kotlin:kotlin-reflect": [
13181359
"kotlin.reflect.full",
13191360
"kotlin.reflect.jvm",
@@ -1388,6 +1429,8 @@
13881429
"kotlin.collections.unsigned",
13891430
"kotlin.comparisons",
13901431
"kotlin.concurrent",
1432+
"kotlin.concurrent.atomics",
1433+
"kotlin.concurrent.internal",
13911434
"kotlin.contracts",
13921435
"kotlin.coroutines",
13931436
"kotlin.coroutines.cancellation",
@@ -1425,6 +1468,18 @@
14251468
"kotlin.time.jdk8",
14261469
"kotlin.uuid"
14271470
],
1471+
"org.jetbrains.kotlinx:kotlinx-serialization-core-jvm": [
1472+
"kotlinx.serialization",
1473+
"kotlinx.serialization.builtins",
1474+
"kotlinx.serialization.descriptors",
1475+
"kotlinx.serialization.encoding",
1476+
"kotlinx.serialization.internal",
1477+
"kotlinx.serialization.modules"
1478+
],
1479+
"org.jetbrains.kotlinx:kotlinx-serialization-json-jvm": [
1480+
"kotlinx.serialization.json",
1481+
"kotlinx.serialization.json.internal"
1482+
],
14281483
"org.jetbrains:annotations": [
14291484
"org.intellij.lang.annotations",
14301485
"org.jetbrains.annotations"
@@ -1564,6 +1619,8 @@
15641619
"org.eclipse.sisu:org.eclipse.sisu.plexus:jar:sources",
15651620
"org.hamcrest:hamcrest-core",
15661621
"org.hamcrest:hamcrest-core:jar:sources",
1622+
"org.jetbrains.kotlin:kotlin-compiler-arguments-description",
1623+
"org.jetbrains.kotlin:kotlin-compiler-arguments-description:jar:sources",
15671624
"org.jetbrains.kotlin:kotlin-reflect",
15681625
"org.jetbrains.kotlin:kotlin-reflect:jar:sources",
15691626
"org.jetbrains.kotlin:kotlin-stdlib",
@@ -1572,6 +1629,10 @@
15721629
"org.jetbrains.kotlin:kotlin-stdlib-jdk8",
15731630
"org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources",
15741631
"org.jetbrains.kotlin:kotlin-stdlib:jar:sources",
1632+
"org.jetbrains.kotlinx:kotlinx-serialization-core-jvm",
1633+
"org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:jar:sources",
1634+
"org.jetbrains.kotlinx:kotlinx-serialization-json-jvm",
1635+
"org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:jar:sources",
15751636
"org.jetbrains:annotations",
15761637
"org.jetbrains:annotations:jar:sources",
15771638
"org.jspecify:jspecify",
@@ -1699,6 +1760,8 @@
16991760
"org.eclipse.sisu:org.eclipse.sisu.plexus:jar:sources",
17001761
"org.hamcrest:hamcrest-core",
17011762
"org.hamcrest:hamcrest-core:jar:sources",
1763+
"org.jetbrains.kotlin:kotlin-compiler-arguments-description",
1764+
"org.jetbrains.kotlin:kotlin-compiler-arguments-description:jar:sources",
17021765
"org.jetbrains.kotlin:kotlin-reflect",
17031766
"org.jetbrains.kotlin:kotlin-reflect:jar:sources",
17041767
"org.jetbrains.kotlin:kotlin-stdlib",
@@ -1707,6 +1770,10 @@
17071770
"org.jetbrains.kotlin:kotlin-stdlib-jdk8",
17081771
"org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources",
17091772
"org.jetbrains.kotlin:kotlin-stdlib:jar:sources",
1773+
"org.jetbrains.kotlinx:kotlinx-serialization-core-jvm",
1774+
"org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:jar:sources",
1775+
"org.jetbrains.kotlinx:kotlinx-serialization-json-jvm",
1776+
"org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:jar:sources",
17101777
"org.jetbrains:annotations",
17111778
"org.jetbrains:annotations:jar:sources",
17121779
"org.jspecify:jspecify",
@@ -1834,6 +1901,8 @@
18341901
"org.eclipse.sisu:org.eclipse.sisu.plexus:jar:sources",
18351902
"org.hamcrest:hamcrest-core",
18361903
"org.hamcrest:hamcrest-core:jar:sources",
1904+
"org.jetbrains.kotlin:kotlin-compiler-arguments-description",
1905+
"org.jetbrains.kotlin:kotlin-compiler-arguments-description:jar:sources",
18371906
"org.jetbrains.kotlin:kotlin-reflect",
18381907
"org.jetbrains.kotlin:kotlin-reflect:jar:sources",
18391908
"org.jetbrains.kotlin:kotlin-stdlib",
@@ -1842,6 +1911,10 @@
18421911
"org.jetbrains.kotlin:kotlin-stdlib-jdk8",
18431912
"org.jetbrains.kotlin:kotlin-stdlib-jdk8:jar:sources",
18441913
"org.jetbrains.kotlin:kotlin-stdlib:jar:sources",
1914+
"org.jetbrains.kotlinx:kotlinx-serialization-core-jvm",
1915+
"org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:jar:sources",
1916+
"org.jetbrains.kotlinx:kotlinx-serialization-json-jvm",
1917+
"org.jetbrains.kotlinx:kotlinx-serialization-json-jvm:jar:sources",
18451918
"org.jetbrains:annotations",
18461919
"org.jetbrains:annotations:jar:sources",
18471920
"org.jspecify:jspecify",

src/main/kotlin/io/bazel/kotlin/generate/BUILD.bazel

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ kt_jvm_library(
1919
deps = [
2020
":kotlinc_jar",
2121
"//kotlin/compiler:kotlin-reflect",
22+
"@kotlin_rules_maven//:org_jetbrains_kotlin_kotlin_compiler_arguments_description",
23+
"@kotlin_rules_maven//:org_jetbrains_kotlinx_kotlinx_serialization_json_jvm",
2224
],
2325
)
2426

0 commit comments

Comments
 (0)