Compile stdlib commonTest with metadata compiler
diff --git a/libraries/stdlib/common-test/build.gradle.kts b/libraries/stdlib/common-test/build.gradle.kts
new file mode 100644
index 0000000..0e58936
--- /dev/null
+++ b/libraries/stdlib/common-test/build.gradle.kts
@@ -0,0 +1,75 @@
+import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinMetadataCompilation
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompileCommon
+
+/*
+ Utility project that compiles stdlib test code to klib metadata for verification purposes
+ */
+plugins {
+ id("kotlin-multiplatform")
+}
+
+val copyTestSourcesTask = tasks.register<Sync>("copyTestSources") {
+ from(projectDir.parentFile.resolve("test"))
+ into(buildDir.resolve("src/test"))
+}
+
+val copyCommonTestSourcesTask = tasks.register<Sync>("copyCommonTestSources") {
+ from(projectDir.parentFile.resolve("common/test"))
+ into(buildDir.resolve("src/commonTest"))
+}
+
+kotlin {
+ jvm()
+ js(IR)
+
+ metadata {
+ compilations.invokeWhenCreated("commonMain") {
+ compileTaskProvider.configure {
+ compilerOptions {
+ freeCompilerArgs.addAll(
+ "-opt-in=kotlin.RequiresOptIn",
+ "-opt-in=kotlin.ExperimentalUnsignedTypes",
+ "-opt-in=kotlin.ExperimentalStdlibApi",
+ "-opt-in=kotlin.io.encoding.ExperimentalEncodingApi",
+ "-XXLanguage:+RangeUntilOperator",
+ )
+ }
+ }
+ }
+ }
+
+ sourceSets {
+ commonMain {
+ kotlin.srcDir(copyCommonTestSourcesTask)
+ kotlin.srcDir(copyTestSourcesTask)
+ dependencies {
+ implementation(project(":kotlin-stdlib"))
+ compileOnly(project(":kotlin-test:kotlin-test-common"))
+ compileOnly(project(":kotlin-test:kotlin-test-annotations-common"))
+ }
+ }
+ }
+}
+
+whenMetadataCompilationIsReady("commonMain") { commonMainMetadatCompilation ->
+ whenCompileCommonMainOutputsOfProjectIsReady(":kotlin-stdlib") { libCommonMainOutputs ->
+ commonMainMetadatCompilation.compilerOptions.configure {
+ freeCompilerArgs.add(provider {
+ "-Xfriend-paths=" + libCommonMainOutputs.files.joinToString(",") { it.absolutePath }
+ })
+ }
+ }
+}
+
+fun Project.whenMetadataCompilationIsReady(name: String, code: (KotlinMetadataCompilation<*>) -> Unit) = kotlin {
+ metadata {
+ compilations.invokeWhenCreated(name, code)
+ }
+}
+
+fun Project.whenCompileCommonMainOutputsOfProjectIsReady(projectName: String, code: (FileCollection) -> Unit) {
+ project(projectName).tasks
+ .withType<KotlinCompileCommon>()
+ .matching { it.name == "compileCommonMainKotlinMetadata" }
+ .all { code(outputs.files) }
+}
diff --git a/settings.gradle b/settings.gradle
index b6a5e3e..8ed661a 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -566,6 +566,7 @@
def stdlibMpp = buildProperties.getBoolean("kotlin.stdlib.mpp", false)
include ":core:builtins",
":kotlin-stdlib-common",
+ ":kotlin-stdlib-common-test",
":kotlin-stdlib",
":kotlin-stdlib-js",
":kotlin-stdlib-js-ir",
@@ -591,6 +592,7 @@
if (!stdlibMpp) include ":kotlin-stdlib-mpp"
project(':kotlin-stdlib-common').projectDir = "$rootDir/libraries/stdlib/common" as File
+ project(':kotlin-stdlib-common-test').projectDir = "$rootDir/libraries/stdlib/common-test" as File
project(':kotlin-stdlib').projectDir = "$rootDir/libraries/stdlib" + (stdlibMpp ? "" : "/jvm") as File
project(':kotlin-stdlib-js').projectDir = "$rootDir/libraries/stdlib/js-v1" as File
project(':kotlin-stdlib-js-ir').projectDir = "$rootDir/libraries/stdlib/js-ir" as File