Kotlin / kotlinx.serialization

Kotlin multiplatform / multi-format serialization
Apache License 2.0
5.33k stars 618 forks source link

Compiler Error when working with Jetpack Compose for Web #1454

Open marks0mmers opened 3 years ago

marks0mmers commented 3 years ago

Describe the bug When working with Serialization within the new Compose for Web library, I get a Compiler Error on trying to define Serializable data classes to interact with the public Pokemon API

To Reproduce Attach a code snippet or test data if possible.

models.kt

@Serializable
data class PokemonAPIResponse<T>(
    val count: Int,
    val next: String?,
    val previous: String?,
    val results: T
)

@Serializable
data class Pokemon(
    val id: Int,
    val name: String
)

build.gradle.kts

plugins {
    kotlin("plugin.serialization") version "1.4.32"
    kotlin("multiplatform") version "1.4.32"
    id("org.jetbrains.compose") version "0.0.0-web-dev-11"
}

group = "org.marks0mmers"
version = "1.0-SNAPSHOT"

repositories {
    mavenCentral()
    maven("https://maven.pkg.jetbrains.space/public/p/compose/dev")
}

kotlin {
    js(IR) {
        browser()
        binaries.executable()
    }
    sourceSets {
        val jsMain by getting {
            dependencies {
                implementation(compose.web.web)
                implementation(compose.runtime)
                implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.2.0")
            }
        }
    }
}

Expected behavior Program to compile and be able to properly serialize these two classes

Environment

marks0mmers commented 3 years ago

Here is the stack trace from compiler error

java.lang.IllegalStateException: IdSignature clash: public org.marks0mmers.models/PokemonAPIResponse|null[0]; Existed declaration CLASS CLASS name:PokemonAPIResponse modality:FINAL visibility:public [data] superTypes:[kotlin.Any] clashed with new CLASS CLASS name:PokemonAPIResponse modality:FINAL visibility:public [data] superTypes:[kotlin.Any]
    at org.jetbrains.kotlin.ir.backend.js.lower.serialization.ir.JsUniqIdClashTracker.commit(JsDeclarationTable.kt:35)
    at org.jetbrains.kotlin.backend.common.serialization.GlobalDeclarationTable.computeSignatureByDeclaration(DeclarationTable.kt:46)
    at org.jetbrains.kotlin.backend.common.serialization.DeclarationTable.computeSignatureByDeclaration(DeclarationTable.kt:74)
    at org.jetbrains.kotlin.backend.common.serialization.DeclarationTable.signatureByDeclaration(DeclarationTable.kt:83)
    at org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer.composeContainerIdSignature(IdSignatureSerializer.kt:105)
    at org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer.access$composeContainerIdSignature(IdSignatureSerializer.kt:19)
    at org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer$composeFileLocalIdSignature$2.invoke(IdSignatureSerializer.kt:152)
    at org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer$composeFileLocalIdSignature$2.invoke(IdSignatureSerializer.kt:120)
    at org.jetbrains.kotlin.backend.common.serialization.DeclarationTable.privateDeclarationSignature(DeclarationTable.kt:79)
    at org.jetbrains.kotlin.backend.common.serialization.signature.IdSignatureSerializer.composeFileLocalIdSignature(IdSignatureSerializer.kt:120)
    at org.jetbrains.kotlin.backend.common.serialization.DeclarationTable.computeSignatureByDeclaration(DeclarationTable.kt:73)
    at org.jetbrains.kotlin.backend.common.serialization.DeclarationTable.signatureByDeclaration(DeclarationTable.kt:83)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.protoIdSignature(IrFileSerializer.kt:237)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeIrSymbol(IrFileSerializer.kt:291)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeSimpleType(IrFileSerializer.kt:320)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeIrTypeData(IrFileSerializer.kt:355)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeIrType(IrFileSerializer.kt:417)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeIrTypeProjection(IrFileSerializer.kt:307)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeTypeArgument(IrFileSerializer.kt:312)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeSimpleType(IrFileSerializer.kt:326)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeIrTypeData(IrFileSerializer.kt:355)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeIrType(IrFileSerializer.kt:417)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeExpression(IrFileSerializer.kt:924)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeReturn(IrFileSerializer.kt:666)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeExpression(IrFileSerializer.kt:952)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeStatement(IrFileSerializer.kt:987)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeBlockBody(IrFileSerializer.kt:426)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeStatement(IrFileSerializer.kt:990)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeIrStatementBody(IrFileSerializer.kt:163)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeIrFunctionBase(IrFileSerializer.kt:1062)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeIrFunction(IrFileSerializer.kt:1074)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeDeclaration(IrFileSerializer.kt:1206)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeIrClass(IrFileSerializer.kt:1144)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeDeclaration(IrFileSerializer.kt:1214)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeIrClass(IrFileSerializer.kt:1144)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeDeclaration(IrFileSerializer.kt:1214)
    at org.jetbrains.kotlin.backend.common.serialization.IrFileSerializer.serializeIrFile(IrFileSerializer.kt:1304)
    at org.jetbrains.kotlin.backend.common.serialization.IrModuleSerializer.serializeIrFile(IrModuleSerializer.kt:28)
    at org.jetbrains.kotlin.backend.common.serialization.IrModuleSerializer.serializedIrModule(IrModuleSerializer.kt:35)
    at org.jetbrains.kotlin.ir.backend.js.KlibKt.serializeModuleIntoKlib(klib.kt:496)
    at org.jetbrains.kotlin.ir.backend.js.KlibKt.generateKLib(klib.kt:184)
    at org.jetbrains.kotlin.cli.js.K2JsIrCompiler.doExecute(K2JsIrCompiler.kt:194)
    at org.jetbrains.kotlin.cli.js.K2JSCompiler.doExecute(K2JSCompiler.java:181)
    at org.jetbrains.kotlin.cli.js.K2JSCompiler.doExecute(K2JSCompiler.java:74)
    at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:88)
    at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:44)
    at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:98)
    at org.jetbrains.kotlin.incremental.IncrementalJsCompilerRunner.runCompiler(IncrementalJsCompilerRunner.kt:178)
    at org.jetbrains.kotlin.incremental.IncrementalJsCompilerRunner.runCompiler(IncrementalJsCompilerRunner.kt:75)
    at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileIncrementally(IncrementalCompilerRunner.kt:286)
    at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl$rebuild(IncrementalCompilerRunner.kt:99)
    at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:114)
    at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:74)
    at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile$default(IncrementalCompilerRunner.kt:65)
    at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execJsIncrementalCompiler(CompileServiceImpl.kt:550)
    at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execJsIncrementalCompiler(CompileServiceImpl.kt:96)
    at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1747)
MrPowerGamerBR commented 3 years ago

Can confirm the same issue, any class marked as @Serializable will cause the exception.

@Serializable
class SerializationBug(val value: String)
MrPowerGamerBR commented 3 years ago

A workaround for now is creating a module without Compose that has your serializable classes, and then the Compose module without the Kotlinx Serialization plugin can depend on that module.

I haven't tested everything yet, but it works for simple serialization/deserialization. 7wB7mttZHk

rnett commented 3 years ago

I've had issues with Compose removing things added by my compiler plugin, as well as breaking symbol and IdSignature comparison, see https://issuetracker.google.com/issues/185609826?pli=1

brianguertin commented 3 years ago

I'm still having this issue with latest versions: Jetbrains Compose 0.5.0-build222 Kotlin 1.5.10 kotlinx.serialization 1.2.1

ewaldhorn commented 3 years ago

And I just bumped into this as well.

@Serializable data class UpdateStatistics(val urlString: String, val updateNumber: Int = 0)

Leads to java.lang.IllegalStateException: IdSignature clash: public domain/UpdateStatistics.$serializer|null[0]; Existed declaration CLASS OBJECT name:$serializer modality:FINAL visibility:public superTypes:[kotlinx.serialization.internal.GeneratedSerializer<domain.UpdateStatistics>] clashed with new CLASS OBJECT name:$serializer modality:FINAL visibility:public superTypes:[kotlinx.serialization.internal.GeneratedSerializer<domain.UpdateStatistics>]

I'm on:

Jetbrains Compose 0.5.0-build222 Kotlin 1.5.10 kotlinx.serialization 1.2.1

JimeFuture commented 3 years ago

Still having the same issue:

Jetbrains Compose 0.5.0-build243 Kotlin:1.5.10 kotlinx.serialization 1.2.1

Is there any plan to fix this soon?

brianguertin commented 3 years ago

Looks like this is a longstanding issue, also filed over at the compose repo: https://github.com/JetBrains/compose-jb/issues/738

sandwwraith commented 1 year ago

I think most compose-related issues should be fixed with 1.8.0, but I'm not entirely sure