Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Kotlin/Native compiler crashes, ‘Expecting descriptor for SuspendCallback.Companion.Adapter’ #751

Closed
swankjesse opened this issue Nov 22, 2022 · 5 comments

Comments

@swankjesse
Copy link
Contributor

swankjesse commented Nov 22, 2022

I’ve been puzzling over this crash for almost 24 hours...

Problem: Generated Code Can’t Reliably See Generated Declarations in Kotlin/Native

When generated code in one module refers to generated code in another module, that can cause exceptions when deserializing the two modules together.

java.lang.IllegalStateException: Expecting descriptor for app.cash.zipline.internal.bridge/SuspendCallback.Companion.Adapter|null[0])
18:28:11 e: java.lang.IllegalStateException: Expecting descriptor for app.cash.zipline.internal.bridge/SuspendCallback.Companion.Adapter|null[0]
18:28:11 	at org.jetbrains.kotlin.backend.konan.serialization.KonanIrLinker$KonanCachedLibraryModuleDeserializer.tryDeserializeIrSymbol(KonanIrlinker.kt:644)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.BasicIrModuleDeserializer.deserializeIrSymbol(BasicIrModuleDeserializer.kt:111)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.FileDeserializationState$symbolDeserializer$3.invoke(IrFileDeserializer.kt:88)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.FileDeserializationState$symbolDeserializer$3.invoke(IrFileDeserializer.kt:77)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrSymbolDeserializer.deserializeIrSymbolData(IrSymbolDeserializer.kt:67)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrSymbolDeserializer.deserializeIrSymbol(IrSymbolDeserializer.kt:84)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeIrSymbolAndRemap$ir_serialization_common(IrDeclarationDeserializer.kt:211)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeSimpleType(IrDeclarationDeserializer.kt:122)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeIrTypeData(IrDeclarationDeserializer.kt:181)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeIrType(IrDeclarationDeserializer.kt:97)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeIrVariable(IrDeclarationDeserializer.kt:622)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeDeclaration(IrDeclarationDeserializer.kt:791)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeDeclaration$default(IrDeclarationDeserializer.kt:782)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrBodyDeserializer.deserializeStatement$ir_serialization_common(IrBodyDeserializer.kt:136)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrBodyDeserializer.deserializeBlockBody(IrBodyDeserializer.kt:95)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrBodyDeserializer.deserializeStatement$ir_serialization_common(IrBodyDeserializer.kt:130)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeStatementBody(IrDeclarationDeserializer.kt:547)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer$withDeserializedIrFunctionBase$1$1$1$1.invoke(IrDeclarationDeserializer.kt:575)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer$withDeserializedIrFunctionBase$1$1$1$1.invoke(IrDeclarationDeserializer.kt:564)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.withBodyGuard(IrDeclarationDeserializer.kt:509)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.access$withBodyGuard(IrDeclarationDeserializer.kt:64)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeIrFunction$ir_serialization_common(IrDeclarationDeserializer.kt:1099)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeDeclaration(IrDeclarationDeserializer.kt:788)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeDeclaration$default(IrDeclarationDeserializer.kt:782)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeIrClass(IrDeclarationDeserializer.kt:375)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeDeclaration(IrDeclarationDeserializer.kt:787)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeDeclaration$default(IrDeclarationDeserializer.kt:782)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeIrClass(IrDeclarationDeserializer.kt:375)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeDeclaration(IrDeclarationDeserializer.kt:787)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeDeclaration$default(IrDeclarationDeserializer.kt:782)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeIrClass(IrDeclarationDeserializer.kt:375)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeDeclaration(IrDeclarationDeserializer.kt:787)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrDeclarationDeserializer.deserializeDeclaration$default(IrDeclarationDeserializer.kt:782)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.IrFileDeserializer.deserializeDeclaration(IrFileDeserializer.kt:40)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.FileDeserializationState.deserializeAllFileReachableTopLevel(IrFileDeserializer.kt:135)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.BasicIrModuleDeserializer$ModuleDeserializationState.deserializeReachableDeclarations(BasicIrModuleDeserializer.kt:190)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.BasicIrModuleDeserializer.deserializeReachableDeclarations(BasicIrModuleDeserializer.kt:158)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.KotlinIrLinker.deserializeAllReachableTopLevels(KotlinIrLinker.kt:111)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.KotlinIrLinker.findDeserializedDeclarationForSymbol(KotlinIrLinker.kt:129)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.KotlinIrLinker.deserializeOrResolveDeclaration(KotlinIrLinker.kt:169)
18:28:11 	at org.jetbrains.kotlin.backend.common.serialization.KotlinIrLinker.getDeclaration(KotlinIrLinker.kt:158)
18:28:11 	at org.jetbrains.kotlin.ir.util.ExternalDependenciesGeneratorKt.getDeclaration(ExternalDependenciesGenerator.kt:57)
18:28:11 	at org.jetbrains.kotlin.ir.util.ExternalDependenciesGenerator.generateUnboundSymbolsAsDependencies(ExternalDependenciesGenerator.kt:44)
18:28:11 	at org.jetbrains.kotlin.psi2ir.generators.ModuleGenerator.generateUnboundSymbolsAsDependencies(ModuleGenerator.kt:52)
18:28:11 	at org.jetbrains.kotlin.psi2ir.Psi2IrTranslator.generateModuleFragment(Psi2IrTranslator.kt:92)
18:28:11 	at org.jetbrains.kotlin.psi2ir.Psi2IrTranslator.generateModuleFragment$default(Psi2IrTranslator.kt:75)
18:28:11 	at org.jetbrains.kotlin.backend.konan.PsiToIrKt.psiToIr(PsiToIr.kt:187)
18:28:11 	at org.jetbrains.kotlin.backend.konan.ToplevelPhasesKt$psiToIrPhase$1.invoke(ToplevelPhases.kt:120)
18:28:11 	at org.jetbrains.kotlin.backend.konan.ToplevelPhasesKt$psiToIrPhase$1.invoke(ToplevelPhases.kt:118)
18:28:11 	at org.jetbrains.kotlin.backend.common.phaser.PhaseBuildersKt$namedOpUnitPhase$1.invoke(PhaseBuilders.kt:96)
18:28:11 	at org.jetbrains.kotlin.backend.common.phaser.PhaseBuildersKt$namedOpUnitPhase$1.invoke(PhaseBuilders.kt:94)
18:28:11 	at org.jetbrains.kotlin.backend.common.phaser.NamedCompilerPhase.invoke(CompilerPhase.kt:96)
18:28:11 	at org.jetbrains.kotlin.backend.common.phaser.CompositePhase.invoke(PhaseBuilders.kt:29)
18:28:11 	at org.jetbrains.kotlin.backend.common.phaser.NamedCompilerPhase.invoke(CompilerPhase.kt:96)
18:28:11 	at org.jetbrains.kotlin.backend.common.phaser.CompilerPhaseKt.invokeToplevel(CompilerPhase.kt:43)
18:28:11 	at org.jetbrains.kotlin.backend.konan.KonanDriverKt.runTopLevelPhases(KonanDriver.kt:40)
18:28:11 	at org.jetbrains.kotlin.cli.bc.K2Native.doExecute(K2Native.kt:94)
18:28:11 	at org.jetbrains.kotlin.cli.bc.K2Native.doExecute(K2Native.kt:37)
18:28:11 	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:99)
18:28:11 	at org.jetbrains.kotlin.cli.common.CLICompiler.execImpl(CLICompiler.kt:47)
18:28:11 	at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:101)
18:28:11 	at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:79)
18:28:11 	at org.jetbrains.kotlin.cli.common.CLITool.exec(CLITool.kt:43)
18:28:11 	at org.jetbrains.kotlin.cli.common.CLITool$Companion.doMainNoExit(CLITool.kt:179)
18:28:11 	at org.jetbrains.kotlin.cli.bc.K2Native$Companion$mainNoExitWithGradleRenderer$1.invoke(K2Native.kt:412)
18:28:11 	at org.jetbrains.kotlin.cli.bc.K2Native$Companion$mainNoExitWithGradleRenderer$1.invoke(K2Native.kt:411)
18:28:11 	at org.jetbrains.kotlin.util.UtilKt.profileIf(Util.kt:22)
18:28:11 	at org.jetbrains.kotlin.util.UtilKt.profile(Util.kt:16)
18:28:11 	at org.jetbrains.kotlin.cli.bc.K2Native$Companion.mainNoExitWithGradleRenderer(K2Native.kt:411)
18:28:11 	at org.jetbrains.kotlin.cli.bc.K2NativeKt.mainNoExitWithGradleRenderer(K2Native.kt:666)
18:28:11 	at org.jetbrains.kotlin.cli.utilities.MainKt$daemonMain$1$1.invoke(main.kt:70)
18:28:11 	at org.jetbrains.kotlin.cli.utilities.MainKt$daemonMain$1$1.invoke(main.kt:70)
18:28:11 	at org.jetbrains.kotlin.cli.utilities.MainKt.mainImpl(main.kt:19)
18:28:11 	at org.jetbrains.kotlin.cli.utilities.MainKt.daemonMain(main.kt:70)
18:28:11 	at jdk.internal.reflect.GeneratedMethodAccessor492.invoke(Unknown Source)
18:28:11 	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
18:28:11 	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
18:28:11 	at org.jetbrains.kotlin.compilerRunner.KotlinToolRunner.runInProcess(KotlinToolRunner.kt:140)
18:28:11 	at org.jetbrains.kotlin.compilerRunner.KotlinToolRunner.run(KotlinToolRunner.kt:82)
18:28:11 	at org.jetbrains.kotlin.gradle.tasks.KotlinNativeLink.compile(KotlinNativeTasks.kt:660)
18:28:11 	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
18:28:11 	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
18:28:11 	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
18:28:11 	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
18:28:11 	at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104)
18:28:11 	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)
18:28:11 	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)
18:28:11 	at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)
18:28:11 	at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:242)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)
18:28:11 	at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:227)
18:28:11 	at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:210)
18:28:11 	at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:193)
18:28:11 	at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:171)
18:28:11 	at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89)
18:28:11 	at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40)
18:28:11 	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53)
18:28:11 	at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
18:28:11 	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:50)
18:28:11 	at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:40)
18:28:11 	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68)
18:28:11 	at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38)
18:28:11 	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
18:28:11 	at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36)
18:28:11 	at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)
18:28:11 	at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)
18:28:11 	at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)
18:28:11 	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
18:28:11 	at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29)
18:28:11 	at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:61)
18:28:11 	at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:42)
18:28:11 	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60)
18:28:11 	at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:27)
18:28:11 	at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:180)
18:28:11 	at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)
18:28:11 	at org.gradle.internal.Either$Right.fold(Either.java:175)
18:28:11 	at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59)
18:28:11 	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)
18:28:11 	at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)
18:28:11 	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:36)
18:28:11 	at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:25)
18:28:11 	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36)
18:28:11 	at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22)
18:28:11 	at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:110)
18:28:11 	at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:56)
18:28:11 	at java.base/java.util.Optional.orElseGet(Optional.java:369)
18:28:11 	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:56)
18:28:11 	at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
18:28:11 	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:73)
18:28:11 	at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:44)
18:28:11 	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)
18:28:11 	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)
18:28:11 	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:89)
18:28:11 	at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:50)
18:28:11 	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:114)
18:28:11 	at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:57)
18:28:11 	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:76)
18:28:11 	at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:50)
18:28:11 	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNoEmptySources(SkipEmptyWorkStep.java:249)
18:28:11 	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.executeWithNoEmptySources(SkipEmptyWorkStep.java:204)
18:28:11 	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:83)
18:28:11 	at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:54)
18:28:11 	at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:32)
18:28:11 	at org.gradle.internal.execution.steps.RemoveUntrackedExecutionStateStep.execute(RemoveUntrackedExecutionStateStep.java:21)
18:28:11 	at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)
18:28:11 	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:43)
18:28:11 	at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:31)
18:28:11 	at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40)
18:28:11 	at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:287)
18:28:11 	at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40)
18:28:11 	at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30)
18:28:11 	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37)
18:28:11 	at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27)
18:28:11 	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44)
18:28:11 	at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33)
18:28:11 	at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76)
18:28:11 	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:144)
18:28:11 	at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:133)
18:28:11 	at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77)
18:28:11 	at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
18:28:11 	at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)
18:28:11 	at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
18:28:11 	at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
18:28:11 	at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
18:28:11 	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)
18:28:11 	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)
18:28:11 	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)
18:28:11 	at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)
18:28:11 	at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)
18:28:11 	at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74)
18:28:11 	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:333)
18:28:11 	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:320)
18:28:11 	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:313)
18:28:11 	at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:299)
18:28:11 	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:143)
18:28:11 	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:227)
18:28:11 	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:218)
18:28:11 	at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:140)
18:28:11 	at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)
18:28:11 	at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48)
18:28:11 	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
18:28:11 	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
18:28:11 	at java.base/java.lang.Thread.run(Thread.java:834)

Exploration of the cause

I’ve learned that the Kotlin/Native compiler is working against us somewhat. Here’s what it does:

  1. Reads source code in as a PSI model.
  2. Converts it to an IR model
  3. Runs transforms on the IR model
  4. Emits mostly all IR, but some symbols still as the original PSI

To confirm this, set these breakpoints:

  1. LazyClassDescriptor.init(), to capture the compilation of SuspendCallback. (Breakpoint condition is name.asString().contains("Callback").)
  2. ZiplineIrGenerationExtension.generate(), to capture generating an adapter for SuspendCallback. (Breakpoint condition is "Callback" in declaration.name.asString())
  3. DescriptorSerializer.classProto() to capture serializing a Klib for SuspendCallback. (Breakpoint condition is "SuspendCallback" in classDescriptor.name.asString())

Next, execute zipline:macosArm64Test in a debugger. This is easy enough to do in the Gradle sidebar.

The breakpoints hit in the order above. On the first breakpoint, the unsubstitutedInnerClassesScope.invoke() function does not include a Companion member because it won’t be generated until breakpoint 2. That means the companion remains missing when serializing the Klib in step 3.

This is a problem because our Kotlin compiler-generated code (the nested Companion and Adapter) refers to other generated code to lookup required serializers. But since the klib doesn’t include these declarations, compilation crashes with the exception above.

Mitigation for Zipline

Referring to generated code from generated code is super convenient! And losing that is very annoying for our model.

But I think I can mitigate by looking up serializers with contextual serialization, rather than having them available statically. This will change generated code from emitting something like this:

To emitting something like this:

  val adapter: MyService<String> = MyService.Companion.Adapter(String.serializer())

to this:

  val adapter: MyService<String> = SerializersModule.requireContextual(MyService::class, String.serializer())

We already do this for certain types, so it’s not a particularly big change. The biggest drawback is we’ll need to decide which adapters to preregister as available contextual ones. Hopefully not everything.

@swankjesse
Copy link
Contributor Author

I posted an FYI on the Kotlin slack.

@JakeWharton
Copy link
Member

So for Compose we have to put this cacheKind=none Gradle property to make it work for native and JetBrains couldn't remember why and didn't remember exactly what it did. Maybe try adding that? See Redwood or Molecule repos for the exact property.

@JakeWharton
Copy link
Member

Oh but my point is when you forget to include that property it manifests in errors exactly like this one.

@swankjesse
Copy link
Contributor Author

Holy cow, that worked. I’m impressed, delighted, horrified, and grateful. Thanks homie!

@swankjesse
Copy link
Contributor Author

No further action on this in the Zipline project.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants