From fb1cdf643b8e4dd4bdfb6d460be888dae8bf9b6a Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 4 Apr 2023 16:35:34 +0300 Subject: [PATCH] [FIR] Load kotlin.arrayOf function in IrBuiltInsOverFir from Fir ^KT-57690 Fixed ^KT-57807 Fixed --- .../kotlin/fir/backend/IrBuiltInsOverFir.kt | 34 +++---------------- .../kotlin/gradle/K2KotlinxSerializationIT.kt | 8 +++++ .../build.gradle.kts | 28 +++++++++++++++ .../src/main/kotlin/ErrorResponse.kt | 11 ++++++ 4 files changed, 51 insertions(+), 30 deletions(-) create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2WithJs/build.gradle.kts create mode 100644 libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2WithJs/src/main/kotlin/ErrorResponse.kt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt index ef4a1d3934c..1978d17f77c 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/IrBuiltInsOverFir.kt @@ -533,38 +533,12 @@ class IrBuiltInsOverFir( } } - private class KotlinPackageFuns( - val arrayOf: IrSimpleFunctionSymbol, - ) - - private val kotlinBuiltinFunctions by lazy { - fun IrClassSymbol.addPackageFun( - name: String, - returnType: IrType, - vararg argumentTypes: Pair, - builder: IrSimpleFunction.() -> Unit - ) = - kotlinIrPackage.createFunction(name, returnType, argumentTypes, postBuild = builder).also { - this.owner.declarations.add(it) - }.symbol - - val kotlinKt = kotlinIrPackage.createClass(kotlinPackage.child(Name.identifier("KotlinKt"))) - KotlinPackageFuns( - arrayOf = kotlinKt.addPackageFun("arrayOf", arrayClass.defaultType) arrayOf@{ - val typeParameter = addTypeParameter("T", anyNType) - addValueParameter { - this.name = Name.identifier("elements") - this.type = arrayClass.typeWithParameters(listOf(typeParameter)) - this.varargElementType = typeParameter.defaultType - this.origin = this@arrayOf.origin - } - returnType = arrayClass.typeWithParameters(listOf(typeParameter)) - } - ) + override val arrayOf: IrSimpleFunctionSymbol by lazy { + // distinct() is needed because we can get two Fir symbols for arrayOf function (from builtins and from stdlib) + // with the same IR symbol for them + findFunctions(kotlinPackage, Name.identifier("arrayOf")).distinct().single() } - override val arrayOf: IrSimpleFunctionSymbol get() = kotlinBuiltinFunctions.arrayOf - private fun getFunctionsByKey( name: Name, vararg packageNameSegments: String, diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2KotlinxSerializationIT.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2KotlinxSerializationIT.kt index cf0136eb5ad..5eec882e6eb 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2KotlinxSerializationIT.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/K2KotlinxSerializationIT.kt @@ -55,4 +55,12 @@ class K2KotlinxSerializationIT : KGPBaseTest() { } } } + + @DisplayName("Compile production executable with kotlinx.serialization to JS. KT-57690, KT-57807") + @GradleTest + fun `test kotlinx serialization compile to JS`() { + project("kotlinxSerializationK2WithJs", gradleVersion) { + build(":compileProductionExecutableKotlinJs") + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2WithJs/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2WithJs/build.gradle.kts new file mode 100644 index 00000000000..bd596a90900 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2WithJs/build.gradle.kts @@ -0,0 +1,28 @@ +plugins { + kotlin("js") + kotlin("plugin.serialization") +} + +repositories { + mavenCentral() + mavenLocal() +} + +dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.0") +} + +kotlin { + js { + binaries.executable() + browser {} + } + + sourceSets { + all { + languageSettings.apply { + languageVersion = "2.0" + } + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2WithJs/src/main/kotlin/ErrorResponse.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2WithJs/src/main/kotlin/ErrorResponse.kt new file mode 100644 index 00000000000..f9d8f2c6125 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2WithJs/src/main/kotlin/ErrorResponse.kt @@ -0,0 +1,11 @@ +import kotlinx.serialization.Serializable + +fun callArrayOf(): Array { + return arrayOf("a", "b") +} + +@Serializable +class ErrorResponse( + val code: Int, + val message: String, +)