Skip to content

compiler plugin internal error: unable to transform declaration #2365

Open
@ewaldc

Description

@ewaldc

Describe the bug

org.jetbrains.kotlin.backend.common.CompilationException: Back-end: Please report this problem https://kotl.in/issue
D:/Github/VirtuRun/app/src/main/java/com/eco/virtuRun/data/model/AppSettings.kt:43:1
Problem with `@Deprecated(message = "This synthesized declaration should not be used directly", replaceWith = ReplaceWith(expression = "", imports = []), level = DeprecationLevel.HIDDEN)
@StabilityInferred(parameters = 0)
object $serializer : GeneratedSerializer<AppSettings> {
  private constructor() /* primary */ {
    super/*Any*/()
    /* <init>() */

  }

  /* fake */ override operator fun equals(other: Any?): Boolean
  /* fake */ override fun hashCode(): Int
  /* fake */ override fun toString(): String
  /* fake */ override fun typeParametersSerializers(): Array<KSerializer<*>>
  override val descriptor: PluginGeneratedSerialDescriptor
    override get(): SerialDescriptor {
      return <this>.#descriptor
    }

  override fun childSerializers(): Array<KSerializer<*>>
  override fun deserialize(decoder: Decoder): AppSettings
  override fun serialize(encoder: Encoder, value: AppSettings) {
    val tmp0_desc: SerialDescriptor = <this>.<get-descriptor>()
    val tmp1_output: CompositeEncoder = encoder.beginStructure(descriptor = tmp0_desc)
    write$Self(self = value, output = tmp1_output, serialDesc = tmp0_desc)
    tmp1_output.endStructure(descriptor = tmp0_desc)
  }

  /* static final field */ val $stable: Int = LiveLiterals$AppSettingsKt.Int$class-$serializer$class-AppSettings()
  init {
    val tmp0_serialDesc: PluginGeneratedSerialDescriptor = PluginGeneratedSerialDescriptor(serialName = "com.eco.virtuRun.data.model.AppSettings", generatedSerializer = <this>, elementsCount = 8)
    tmp0_serialDesc.addElement(name = "persistableRepository", isOptional = false)
    tmp0_serialDesc.addElement(name = "settings", isOptional = false)
    tmp0_serialDesc.addElement(name = "userName", isOptional = true)
    tmp0_serialDesc.addElement(name = "vRunName", isOptional = true)
    tmp0_serialDesc.addElement(name = "speedMode", isOptional = true)
    tmp0_serialDesc.addElement(name = "intensity", isOptional = true)
    tmp0_serialDesc.addElement(name = "userList", isOptional = true)
    tmp0_serialDesc.addElement(name = "vRunList", isOptional = true)
    <this>.#descriptor = tmp0_serialDesc
  }

}

`
Details: kotlinx.serialization compiler plugin internal error: unable to transform declaration, see cause
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializerClassLowering.lower(SerializationLoweringExtension.kt:219)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationLoweringExtensionKt$runOnFileInOrder$1.visitClass(SerializationLoweringExtension.kt:51)
	at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitClass(IrElementVisitorVoid.kt:111)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationLoweringExtensionKt$runOnFileInOrder$1.visitClass(SerializationLoweringExtension.kt:45)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationLoweringExtensionKt$runOnFileInOrder$1.visitClass(SerializationLoweringExtension.kt:45)
	at org.jetbrains.kotlin.ir.declarations.IrClass.accept(IrClass.kt:64)
	at org.jetbrains.kotlin.ir.declarations.IrClass.acceptChildren(IrClass.kt:68)
	at org.jetbrains.kotlin.ir.visitors.IrVisitorsKt.acceptChildrenVoid(IrVisitors.kt:15)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationLoweringExtensionKt$runOnFileInOrder$1.visitClass(SerializationLoweringExtension.kt:52)
	at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitClass(IrElementVisitorVoid.kt:111)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationLoweringExtensionKt$runOnFileInOrder$1.visitClass(SerializationLoweringExtension.kt:45)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationLoweringExtensionKt$runOnFileInOrder$1.visitClass(SerializationLoweringExtension.kt:45)
	at org.jetbrains.kotlin.ir.declarations.IrClass.accept(IrClass.kt:64)
	at org.jetbrains.kotlin.ir.declarations.IrFile.acceptChildren(IrFile.kt:36)
	at org.jetbrains.kotlin.ir.visitors.IrVisitorsKt.acceptChildrenVoid(IrVisitors.kt:15)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationLoweringExtensionKt$runOnFileInOrder$1.visitElement(SerializationLoweringExtension.kt:47)
	at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitPackageFragment(IrElementVisitorVoid.kt:190)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationLoweringExtensionKt$runOnFileInOrder$1.visitPackageFragment(SerializationLoweringExtension.kt:45)
	at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitFile(IrElementVisitorVoid.kt:200)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationLoweringExtensionKt$runOnFileInOrder$1.visitFile(SerializationLoweringExtension.kt:45)
	at org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid$DefaultImpls.visitFile(IrElementVisitorVoid.kt:198)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationLoweringExtensionKt$runOnFileInOrder$1.visitFile(SerializationLoweringExtension.kt:45)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationLoweringExtensionKt$runOnFileInOrder$1.visitFile(SerializationLoweringExtension.kt:45)
	at org.jetbrains.kotlin.ir.declarations.IrFile.accept(IrFile.kt:30)
	at org.jetbrains.kotlin.ir.visitors.IrVisitorsKt.acceptVoid(IrVisitors.kt:11)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationLoweringExtensionKt.runOnFileInOrder(SerializationLoweringExtension.kt:45)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializationLoweringExtension.generate(SerializationLoweringExtension.kt:182)
	at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.convertToIr$lambda$0(JvmIrCodegenFactory.kt:190)
	at org.jetbrains.kotlin.psi2ir.Psi2IrTranslator.generateModuleFragment(Psi2IrTranslator.kt:107)
	at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.convertToIr(JvmIrCodegenFactory.kt:224)
	at org.jetbrains.kotlin.backend.jvm.JvmIrCodegenFactory.convertToIr(JvmIrCodegenFactory.kt:57)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.convertToIr(KotlinToJVMBytecodeCompiler.kt:225)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli(KotlinToJVMBytecodeCompiler.kt:102)
	at org.jetbrains.kotlin.cli.jvm.compiler.KotlinToJVMBytecodeCompiler.compileModules$cli$default(KotlinToJVMBytecodeCompiler.kt:47)
	at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:168)
	at org.jetbrains.kotlin.cli.jvm.K2JVMCompiler.doExecute(K2JVMCompiler.kt:53)
	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:100)
	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:46)
	at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101)
	at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:495)
	at org.jetbrains.kotlin.incremental.IncrementalJvmCompilerRunner.runCompiler(IncrementalJvmCompilerRunner.kt:133)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.doCompile(IncrementalCompilerRunner.kt:486)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileImpl(IncrementalCompilerRunner.kt:409)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compileNonIncrementally(IncrementalCompilerRunner.kt:290)
	at org.jetbrains.kotlin.incremental.IncrementalCompilerRunner.compile(IncrementalCompilerRunner.kt:112)
	at org.jetbrains.kotlin.daemon.CompileServiceImplBase.execIncrementalCompiler(CompileServiceImpl.kt:627)
	at org.jetbrains.kotlin.daemon.CompileServiceImplBase.access$execIncrementalCompiler(CompileServiceImpl.kt:101)
	at org.jetbrains.kotlin.daemon.CompileServiceImpl.compile(CompileServiceImpl.kt:1587)
	at jdk.internal.reflect.GeneratedMethodAccessor108.invoke(Unknown Source)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:568)
	at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:360)
	at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
	at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:712)
	at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.IndexOutOfBoundsException: Index 0 out of bounds for length 0
	at java.base/jdk.internal.util.Preconditions.outOfBounds(Preconditions.java:64)
	at java.base/jdk.internal.util.Preconditions.outOfBoundsCheckIndex(Preconditions.java:70)
	at java.base/jdk.internal.util.Preconditions.checkIndex(Preconditions.java:266)
	at java.base/java.util.Objects.checkIndex(Objects.java:361)
	at java.base/java.util.ArrayList.get(ArrayList.java:427)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator$formEncodeDecodePropertyCall$1.invoke(SerializerIrGenerator.kt:340)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator$formEncodeDecodePropertyCall$1.invoke(SerializerIrGenerator.kt:333)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.BaseIrGenerator.serializerInstance(BaseIrGenerator.kt:440)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.BaseIrGenerator.formEncodeDecodePropertyCall(BaseIrGenerator.kt:255)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator.formEncodeDecodePropertyCall(SerializerIrGenerator.kt:333)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator$generateLoad$1.invoke(SerializerIrGenerator.kt:434)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator$generateLoad$1.invoke(SerializerIrGenerator.kt:368)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.IrBuilderWithPluginContext.addFunctionBody(IrBuilderWithPluginContext.kt:41)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator.generateLoad(SerializerIrGenerator.kt:368)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator.generate(SerializerIrGenerator.kt:617)
	at org.jetbrains.kotlinx.serialization.compiler.backend.ir.SerializerIrGenerator$Companion.generate(SerializerIrGenerator.kt:647)
	at org.jetbrains.kotlinx.serialization.compiler.extensions.SerializerClassLowering.lower(SerializationLoweringExtension.kt:135)
	... 63 more

Errors were stored into D:\Github\VirtuRun\.gradle\kotlin\errors\errors-1689520564144.log

To Reproduce

@Serializable
data class AppSettings (
    var userName: String = "System",
    var vRunName: String = "System Run",
    var speedMode: vRunSpeedMode = vRunSpeedMode.VRUN_SPEED,
    var intensity: WorkoutIntensity = WorkoutIntensity.MODERATE,
    @Transient var favDevices: MutableMap<String, ScannedDevice> = mutableMapOf(), // Favorite devices
    var userList: MutableMap<String, User> = mutableMapOf(),
    var vRunList: MutableMap<String, VRun> = mutableMapOf()
) : Persistable<AppSettings>()

@OptIn(ExperimentalSerializationApi::class)
@Serializable
open class Persistable<T: Any> { 
    @EncodeDefault(EncodeDefault.Mode.NEVER) private lateinit var persistableRepository: PersistableRepository<T> //? = null
    @EncodeDefault(EncodeDefault.Mode.NEVER) private lateinit var settings: T //? = null
    operator fun invoke(initialValues: T, persistableRepository: PersistableRepository<T>) : T {
        this.persistableRepository = persistableRepository
        settings = persistableRepository.load() ?: initialValues
        return settings
    }
    fun save(): T = persistableRepository.save(settings)
}

interface PersistableRepository<T> {
    fun save(settings: T): T
    fun load(): T?
}

// Koin 
val appSettingsRepositoryModule = module {
    single { AppSettings()(AppSettings(), PersistableFileRepository(androidContext(), "app_settings.json", AppSettings.serializer())) }
}

removing lateinit by initializing both variables to null and/or removing @EncodeDefault does not change anything.

My objective is to create a "generic settings extension" for data classes which allows to load and save the class data locally and remotely.
Maybe I used the wrong approach and there are better ways to achieve this.

My project is very large, but if needed I can create a "working" project version on my github account.

Expected behavior
Compiles correctly (no lint issues)

Environment

  • Kotlin version: 1.8.21 and 1.8.22
  • Library version: 1.5.0 and 1.5.1
  • Kotlin platforms: Android (JVM)
  • Gradle version: 7.5
  • IDE version: Android Studio Flamingo | 2022.2.1 Patch 2
  • Other relevant context: JAVA 17

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions