[IR] Properly serialize IrDeclarationOrigin.GeneratedByPlugin to klibs

^KT-56911 Fixed
This commit is contained in:
Dmitriy Novozhilov
2023-03-28 12:37:36 +03:00
committed by Space Team
parent 12b11bd034
commit c957a0b43b
14 changed files with 111 additions and 27 deletions
@@ -5,10 +5,9 @@
package org.jetbrains.kotlin.ir.backend.js
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOriginImpl
object JsLoweredDeclarationOrigin : IrDeclarationOrigin {
object JsLoweredDeclarationOrigin {
object JS_INTRINSICS_STUB : IrDeclarationOriginImpl("JS_INTRINSICS_STUB")
object JS_CLOSURE_BOX_CLASS_DECLARATION : IrDeclarationOriginImpl("JS_CLOSURE_BOX_CLASS_DECLARATION")
object BRIDGE_WITH_STABLE_NAME : IrDeclarationOriginImpl("BRIDGE_WITH_STABLE_NAME")
@@ -87,9 +87,24 @@ interface IrDeclarationOrigin {
object SHARED_VARIABLE_IN_EVALUATOR_FRAGMENT : IrDeclarationOriginImpl("SHARED_VARIABLE_IN_EVALUATOR_FRAGMENT", isSynthetic = true)
class GeneratedByPlugin(val pluginKey: GeneratedDeclarationKey) : IrDeclarationOrigin {
/**
* [pluginKey] may be null if declaration with this origin was deserialized from klib
*/
class GeneratedByPlugin private constructor(val pluginId: String, val pluginKey: GeneratedDeclarationKey?) : IrDeclarationOrigin {
constructor(pluginKey: GeneratedDeclarationKey) : this(pluginKey::class.qualifiedName!!, pluginKey)
companion object {
fun fromSerializedString(name: String): GeneratedByPlugin? {
val pluginId = name.removeSurrounding("GENERATED[", "]").takeIf { it != name } ?: return null
return GeneratedByPlugin(pluginId, pluginKey = null)
}
}
override val name: String
get() = "GENERATED[${pluginId}]"
override fun toString(): String {
return "GENERATED[${pluginKey}]"
return name
}
override fun equals(other: Any?): Boolean {
@@ -103,11 +118,12 @@ interface IrDeclarationOrigin {
}
}
val name: String
val isSynthetic: Boolean get() = false
}
abstract class IrDeclarationOriginImpl(
val name: String,
override val name: String,
override val isSynthetic: Boolean = false
) : IrDeclarationOrigin {
override fun toString(): String = name
@@ -124,5 +140,4 @@ abstract class IrDeclarationOriginImpl(
override fun hashCode(): Int {
return name.hashCode()
}
}
@@ -779,9 +779,11 @@ class IrDeclarationDeserializer(
allKnownDeclarationOrigins.mapNotNull { it.objectInstance as? IrDeclarationOriginImpl }.associateBy { it.name }
}
private fun deserializeIrDeclarationOrigin(protoName: Int): IrDeclarationOriginImpl {
private fun deserializeIrDeclarationOrigin(protoName: Int): IrDeclarationOrigin {
val originName = libraryFile.string(protoName)
return declarationOriginIndex[originName] ?: object : IrDeclarationOriginImpl(originName) {}
return IrDeclarationOrigin.GeneratedByPlugin.fromSerializedString(originName)
?: declarationOriginIndex[originName]
?: object : IrDeclarationOriginImpl(originName) {}
}
fun deserializeDeclaration(proto: ProtoDeclaration, setParent: Boolean = true): IrDeclaration {
@@ -183,7 +183,7 @@ open class IrFileSerializer(
/* ------- Common fields ---------------------------------------------------- */
private fun serializeIrDeclarationOrigin(origin: IrDeclarationOrigin): Int = serializeString((origin as IrDeclarationOriginImpl).name)
private fun serializeIrDeclarationOrigin(origin: IrDeclarationOrigin): Int = serializeString(origin.name)
private fun serializeIrStatementOrigin(origin: IrStatementOrigin): Int =
serializeString((origin as? IrStatementOriginImpl)?.debugName ?: error("Unable to serialize origin ${origin.javaClass.name}"))