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 d157acb65cc..cf0136eb5ad 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 @@ -8,6 +8,10 @@ package org.jetbrains.kotlin.gradle import org.gradle.util.GradleVersion import org.jetbrains.kotlin.gradle.testbase.* import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.io.TempDir +import java.nio.file.Path +import kotlin.io.path.listDirectoryEntries +import kotlin.test.assertTrue @OtherGradlePluginTests class K2KotlinxSerializationIT : KGPBaseTest() { @@ -32,4 +36,23 @@ class K2KotlinxSerializationIT : KGPBaseTest() { } } } + + @DisplayName("Compile code with kotlinx.serialization K2 against old K1 library without enum factory support (KT-57704).") + @GradleTest + fun `test kotlinx serialization K2 against K1 library`(gradleVersion: GradleVersion, @TempDir tempDir: Path) { + project("kotlinxSerializationK2AgainstK1Lib/lib", gradleVersion, localRepoDir = tempDir) { + build(":publish") { + assertTasksExecuted(":publish") + val publishedLib = tempDir.resolve("com/example/serialization_lib/serialization_lib/1.0") + assertDirectoryExists(publishedLib) + assertTrue(publishedLib.listDirectoryEntries().isNotEmpty()) + } + } + + project("kotlinxSerializationK2AgainstK1Lib/app", gradleVersion, localRepoDir = tempDir) { + build(":run") { + assertTasksExecuted(":run") + } + } + } } diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/app/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/app/build.gradle.kts new file mode 100644 index 00000000000..cbc7393f94d --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/app/build.gradle.kts @@ -0,0 +1,33 @@ +import org.jetbrains.kotlin.gradle.tasks.KotlinCompile +import org.jetbrains.kotlin.gradle.dsl.KotlinVersion + +plugins { + kotlin("jvm") + kotlin("plugin.serialization") + `maven-publish` + application +} + +repositories { + mavenLocal() + maven("") + mavenCentral() +} + +group = "com.example.serialization_app" +version = "1.0" + +dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1") + implementation("com.example.serialization_lib:serialization_lib:1.0") +} + +val compileKotlin: KotlinCompile by tasks + +compileKotlin.compilerOptions { + languageVersion.set(KotlinVersion.KOTLIN_2_0) +} + +application { + mainClass.set("com.example.serialization_app.MainKt") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/app/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/app/settings.gradle.kts new file mode 100644 index 00000000000..c1f73a03971 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/app/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "serialization_app" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/app/src/main/kotlin/Main.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/app/src/main/kotlin/Main.kt new file mode 100644 index 00000000000..1872a48f087 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/app/src/main/kotlin/Main.kt @@ -0,0 +1,19 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ +package com.example.serialization_app + +import com.example.serialization_lib.* +import kotlinx.serialization.json.* +import kotlinx.serialization.* + +@Serializable +class EnumUsage(val access: Access) + +fun main() { + val s = Json.encodeToString(EnumUsage.serializer(), EnumUsage(Access.ReadWrite)) + if (s != """{"access":"rw"}""") throw AssertionError("Unexpected serialized form: $s") + val usage = Json.decodeFromString(s) + if (usage.access != Access.ReadWrite) throw AssertionError("Unexpected deserialized result: ${usage.access}") +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/lib/build.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/lib/build.gradle.kts new file mode 100644 index 00000000000..78810170f27 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/lib/build.gradle.kts @@ -0,0 +1,29 @@ +plugins { + kotlin("jvm") version "1.7.20" + kotlin("plugin.serialization") version "1.7.20" + `maven-publish` +} + +repositories { + mavenLocal() + mavenCentral() +} + +group = "com.example.serialization_lib" +version = "1.0" + +dependencies { + implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.4.1") +} + +publishing { + repositories { + maven("") + } + + publications { + create("Maven") { + from(components["java"]) + } + } +} diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/lib/settings.gradle.kts b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/lib/settings.gradle.kts new file mode 100644 index 00000000000..299ac5a24a7 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/lib/settings.gradle.kts @@ -0,0 +1 @@ +rootProject.name = "serialization_lib" diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/lib/src/main/kotlin/Base.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/lib/src/main/kotlin/Base.kt new file mode 100644 index 00000000000..71e0e7a8871 --- /dev/null +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/resources/testProject/kotlinxSerializationK2AgainstK1Lib/lib/src/main/kotlin/Base.kt @@ -0,0 +1,13 @@ +/* + * Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ +package com.example.serialization_lib + +import kotlinx.serialization.* + +@Serializable +enum class Access { + Read, Write, @SerialName("rw") ReadWrite, Unknown +} + diff --git a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt index 6acdd139c6d..80a38e436bd 100644 --- a/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt +++ b/plugins/kotlinx-serialization/kotlinx-serialization.k2/src/org/jetbrains/kotlinx/serialization/compiler/fir/checkers/FirSerializationPluginClassChecker.kt @@ -536,7 +536,7 @@ object FirSerializationPluginClassChecker : FirClassChecker() { } checkTypeArguments(type, source, reporter) } else { - if (!type.isEnum) { + if (type.toRegularClassSymbol(session)?.isEnumClass != true) { // enums are always serializable reporter.reportOn(source, FirSerializationErrors.SERIALIZER_NOT_FOUND, type) }