Extract IdSignature serializer from IrFileSerializer
^KT-61642
This commit is contained in:
+113
@@ -0,0 +1,113 @@
|
|||||||
|
/*
|
||||||
|
* 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 org.jetbrains.kotlin.backend.common.serialization
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.AccessorIdSignature as ProtoAccessorIdSignature
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.CommonIdSignature as ProtoCommonIdSignature
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.CompositeSignature as ProtoCompositeSignature
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.FileLocalIdSignature as ProtoFileLocalIdSignature
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.FileSignature as ProtoFileSignature
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IdSignature as ProtoIdSignature
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.LocalSignature as ProtoLocalSignature
|
||||||
|
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||||
|
import java.util.ArrayList
|
||||||
|
|
||||||
|
class IdSignatureSerializer(
|
||||||
|
private val serializeString: (String) -> Int,
|
||||||
|
private val serializeDebugInfo: (String) -> Int,
|
||||||
|
private val protoIdSignatureMap: MutableMap<IdSignature, Int>,
|
||||||
|
private val protoIdSignatureArray: ArrayList<ProtoIdSignature>
|
||||||
|
) {
|
||||||
|
|
||||||
|
private fun serializeFqName(fqName: String): List<Int> = fqName.split(".").map { serializeString(it) }
|
||||||
|
private fun serializePublicSignature(signature: IdSignature.CommonSignature): ProtoCommonIdSignature {
|
||||||
|
val proto = ProtoCommonIdSignature.newBuilder()
|
||||||
|
proto.addAllPackageFqName(serializeFqName(signature.packageFqName))
|
||||||
|
proto.addAllDeclarationFqName(serializeFqName(signature.declarationFqName))
|
||||||
|
|
||||||
|
signature.id?.let { proto.memberUniqId = it }
|
||||||
|
if (signature.mask != 0L) {
|
||||||
|
proto.flags = signature.mask
|
||||||
|
}
|
||||||
|
|
||||||
|
signature.description?.let { proto.debugInfo = serializeDebugInfo(it) }
|
||||||
|
|
||||||
|
return proto.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun serializeAccessorSignature(signature: IdSignature.AccessorSignature): ProtoAccessorIdSignature {
|
||||||
|
val proto = ProtoAccessorIdSignature.newBuilder()
|
||||||
|
|
||||||
|
proto.propertySignature = protoIdSignature(signature.propertySignature)
|
||||||
|
with(signature.accessorSignature) {
|
||||||
|
proto.name = serializeString(shortName)
|
||||||
|
proto.accessorHashId = id ?: error("Expected hash Id")
|
||||||
|
if (mask != 0L) {
|
||||||
|
proto.flags = mask
|
||||||
|
}
|
||||||
|
description?.let { proto.debugInfo = serializeDebugInfo(it) }
|
||||||
|
}
|
||||||
|
|
||||||
|
return proto.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun serializePrivateSignature(signature: IdSignature.FileLocalSignature): ProtoFileLocalIdSignature {
|
||||||
|
val proto = ProtoFileLocalIdSignature.newBuilder()
|
||||||
|
|
||||||
|
proto.container = protoIdSignature(signature.container)
|
||||||
|
proto.localId = signature.id
|
||||||
|
signature.description?.let { proto.debugInfo = serializeDebugInfo(it) }
|
||||||
|
|
||||||
|
return proto.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun serializeScopeLocalSignature(signature: IdSignature.ScopeLocalDeclaration): Int = signature.id
|
||||||
|
|
||||||
|
private fun serializeCompositeSignature(signature: IdSignature.CompositeSignature): ProtoCompositeSignature {
|
||||||
|
val proto = ProtoCompositeSignature.newBuilder()
|
||||||
|
|
||||||
|
proto.containerSig = protoIdSignature(signature.container)
|
||||||
|
proto.innerSig = protoIdSignature(signature.inner)
|
||||||
|
|
||||||
|
return proto.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
@Suppress("UNUSED_PARAMETER")
|
||||||
|
private fun serializeFileSignature(signature: IdSignature.FileSignature): ProtoFileSignature = ProtoFileSignature.getDefaultInstance()
|
||||||
|
|
||||||
|
private fun serializeLocalSignature(signature: IdSignature.LocalSignature): ProtoLocalSignature {
|
||||||
|
val proto = ProtoLocalSignature.newBuilder()
|
||||||
|
|
||||||
|
proto.addAllLocalFqName(serializeFqName(signature.localFqn))
|
||||||
|
signature.hashSig?.let { proto.localHash = it }
|
||||||
|
signature.description?.let { proto.debugInfo = serializeDebugInfo(it) }
|
||||||
|
|
||||||
|
return proto.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun serializeIdSignature(idSignature: IdSignature): ProtoIdSignature {
|
||||||
|
val proto = ProtoIdSignature.newBuilder()
|
||||||
|
when (idSignature) {
|
||||||
|
is IdSignature.CommonSignature -> proto.publicSig = serializePublicSignature(idSignature)
|
||||||
|
is IdSignature.AccessorSignature -> proto.accessorSig = serializeAccessorSignature(idSignature)
|
||||||
|
is IdSignature.FileLocalSignature -> proto.privateSig = serializePrivateSignature(idSignature)
|
||||||
|
is IdSignature.ScopeLocalDeclaration -> proto.scopedLocalSig = serializeScopeLocalSignature(idSignature)
|
||||||
|
is IdSignature.CompositeSignature -> proto.compositeSig = serializeCompositeSignature(idSignature)
|
||||||
|
is IdSignature.LocalSignature -> proto.localSig = serializeLocalSignature(idSignature)
|
||||||
|
is IdSignature.FileSignature -> proto.fileSig = serializeFileSignature(idSignature)
|
||||||
|
is IdSignature.SpecialFakeOverrideSignature -> {}
|
||||||
|
is IdSignature.LoweredDeclarationSignature -> error("LoweredDeclarationSignature is not expected here")
|
||||||
|
}
|
||||||
|
return proto.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun protoIdSignature(idSig: IdSignature): Int {
|
||||||
|
return protoIdSignatureMap.getOrPut(idSig) {
|
||||||
|
protoIdSignatureArray.add(serializeIdSignature(idSig))
|
||||||
|
protoIdSignatureArray.size - 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+9
-97
@@ -29,13 +29,8 @@ import org.jetbrains.kotlin.types.Variance
|
|||||||
import org.jetbrains.kotlin.utils.filterIsInstanceAnd
|
import org.jetbrains.kotlin.utils.filterIsInstanceAnd
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
|
import org.jetbrains.kotlin.utils.addToStdlib.applyIf
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.AccessorIdSignature as ProtoAccessorIdSignature
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.CommonIdSignature as ProtoCommonIdSignature
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.CompositeSignature as ProtoCompositeSignature
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.FieldAccessCommon as ProtoFieldAccessCommon
|
import org.jetbrains.kotlin.backend.common.serialization.proto.FieldAccessCommon as ProtoFieldAccessCommon
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.FileEntry as ProtoFileEntry
|
import org.jetbrains.kotlin.backend.common.serialization.proto.FileEntry as ProtoFileEntry
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.FileLocalIdSignature as ProtoFileLocalIdSignature
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.FileSignature as ProtoFileSignature
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IdSignature as ProtoIdSignature
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IdSignature as ProtoIdSignature
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrAnonymousInit as ProtoAnonymousInit
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrAnonymousInit as ProtoAnonymousInit
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrBlock as ProtoBlock
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrBlock as ProtoBlock
|
||||||
@@ -107,7 +102,6 @@ import org.jetbrains.kotlin.backend.common.serialization.proto.IrVarargElement a
|
|||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrVariable as ProtoVariable
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrVariable as ProtoVariable
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrWhen as ProtoWhen
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrWhen as ProtoWhen
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrWhile as ProtoWhile
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrWhile as ProtoWhile
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.LocalSignature as ProtoLocalSignature
|
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.Loop as ProtoLoop
|
import org.jetbrains.kotlin.backend.common.serialization.proto.Loop as ProtoLoop
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.MemberAccessCommon as ProtoMemberAccessCommon
|
import org.jetbrains.kotlin.backend.common.serialization.proto.MemberAccessCommon as ProtoMemberAccessCommon
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.NullableIrExpression as ProtoNullableIrExpression
|
import org.jetbrains.kotlin.backend.common.serialization.proto.NullableIrExpression as ProtoNullableIrExpression
|
||||||
@@ -137,6 +131,12 @@ open class IrFileSerializer(
|
|||||||
// so use this index to store signature only once.
|
// so use this index to store signature only once.
|
||||||
private val protoIdSignatureMap = mutableMapOf<IdSignature, Int>()
|
private val protoIdSignatureMap = mutableMapOf<IdSignature, Int>()
|
||||||
protected val protoIdSignatureArray = arrayListOf<ProtoIdSignature>()
|
protected val protoIdSignatureArray = arrayListOf<ProtoIdSignature>()
|
||||||
|
private val idSignatureSerializer = IdSignatureSerializer(
|
||||||
|
::serializeString,
|
||||||
|
::serializeDebugInfo,
|
||||||
|
protoIdSignatureMap,
|
||||||
|
protoIdSignatureArray
|
||||||
|
)
|
||||||
|
|
||||||
protected val protoBodyArray = mutableListOf<XStatementOrExpression>()
|
protected val protoBodyArray = mutableListOf<XStatementOrExpression>()
|
||||||
|
|
||||||
@@ -207,97 +207,9 @@ open class IrFileSerializer(
|
|||||||
|
|
||||||
/* ------- IdSignature ------------------------------------------------------ */
|
/* ------- IdSignature ------------------------------------------------------ */
|
||||||
|
|
||||||
private fun serializePublicSignature(signature: IdSignature.CommonSignature): ProtoCommonIdSignature {
|
|
||||||
val proto = ProtoCommonIdSignature.newBuilder()
|
|
||||||
proto.addAllPackageFqName(serializeFqName(signature.packageFqName))
|
|
||||||
proto.addAllDeclarationFqName(serializeFqName(signature.declarationFqName))
|
|
||||||
|
|
||||||
signature.id?.let { proto.memberUniqId = it }
|
|
||||||
if (signature.mask != 0L) {
|
|
||||||
proto.flags = signature.mask
|
|
||||||
}
|
|
||||||
|
|
||||||
signature.description?.let { proto.debugInfo = serializeDebugInfo(it) }
|
|
||||||
|
|
||||||
return proto.build()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun serializeAccessorSignature(signature: IdSignature.AccessorSignature): ProtoAccessorIdSignature {
|
|
||||||
val proto = ProtoAccessorIdSignature.newBuilder()
|
|
||||||
|
|
||||||
proto.propertySignature = protoIdSignature(signature.propertySignature)
|
|
||||||
with(signature.accessorSignature) {
|
|
||||||
proto.name = serializeString(shortName)
|
|
||||||
proto.accessorHashId = id ?: error("Expected hash Id")
|
|
||||||
if (mask != 0L) {
|
|
||||||
proto.flags = mask
|
|
||||||
}
|
|
||||||
description?.let { proto.debugInfo = serializeDebugInfo(it) }
|
|
||||||
}
|
|
||||||
|
|
||||||
return proto.build()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun serializePrivateSignature(signature: IdSignature.FileLocalSignature): ProtoFileLocalIdSignature {
|
|
||||||
val proto = ProtoFileLocalIdSignature.newBuilder()
|
|
||||||
|
|
||||||
proto.container = protoIdSignature(signature.container)
|
|
||||||
proto.localId = signature.id
|
|
||||||
signature.description?.let { proto.debugInfo = serializeDebugInfo(it) }
|
|
||||||
|
|
||||||
return proto.build()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun serializeScopeLocalSignature(signature: IdSignature.ScopeLocalDeclaration): Int = signature.id
|
|
||||||
|
|
||||||
private fun serializeCompositeSignature(signature: IdSignature.CompositeSignature): ProtoCompositeSignature {
|
|
||||||
val proto = ProtoCompositeSignature.newBuilder()
|
|
||||||
|
|
||||||
proto.containerSig = protoIdSignature(signature.container)
|
|
||||||
proto.innerSig = protoIdSignature(signature.inner)
|
|
||||||
|
|
||||||
return proto.build()
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("UNUSED_PARAMETER")
|
|
||||||
private fun serializeFileSignature(signature: IdSignature.FileSignature): ProtoFileSignature = ProtoFileSignature.getDefaultInstance()
|
|
||||||
|
|
||||||
private fun serializeLocalSignature(signature: IdSignature.LocalSignature): ProtoLocalSignature {
|
|
||||||
val proto = ProtoLocalSignature.newBuilder()
|
|
||||||
|
|
||||||
proto.addAllLocalFqName(serializeFqName(signature.localFqn))
|
|
||||||
signature.hashSig?.let { proto.localHash = it }
|
|
||||||
signature.description?.let { proto.debugInfo = serializeDebugInfo(it) }
|
|
||||||
|
|
||||||
return proto.build()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun serializeIdSignature(idSignature: IdSignature): ProtoIdSignature {
|
|
||||||
val proto = ProtoIdSignature.newBuilder()
|
|
||||||
when (idSignature) {
|
|
||||||
is IdSignature.CommonSignature -> proto.publicSig = serializePublicSignature(idSignature)
|
|
||||||
is IdSignature.AccessorSignature -> proto.accessorSig = serializeAccessorSignature(idSignature)
|
|
||||||
is IdSignature.FileLocalSignature -> proto.privateSig = serializePrivateSignature(idSignature)
|
|
||||||
is IdSignature.ScopeLocalDeclaration -> proto.scopedLocalSig = serializeScopeLocalSignature(idSignature)
|
|
||||||
is IdSignature.CompositeSignature -> proto.compositeSig = serializeCompositeSignature(idSignature)
|
|
||||||
is IdSignature.LocalSignature -> proto.localSig = serializeLocalSignature(idSignature)
|
|
||||||
is IdSignature.FileSignature -> proto.fileSig = serializeFileSignature(idSignature)
|
|
||||||
is IdSignature.SpecialFakeOverrideSignature -> {}
|
|
||||||
is IdSignature.LoweredDeclarationSignature -> error("LoweredDeclarationSignature is not expected here")
|
|
||||||
}
|
|
||||||
return proto.build()
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun protoIdSignature(declaration: IrDeclaration): Int {
|
private fun protoIdSignature(declaration: IrDeclaration): Int {
|
||||||
val idSig = declarationTable.signatureByDeclaration(declaration, compatibilityMode.oldSignatures)
|
val idSig = declarationTable.signatureByDeclaration(declaration, compatibilityMode.oldSignatures)
|
||||||
return protoIdSignature(idSig)
|
return idSignatureSerializer.protoIdSignature(idSig)
|
||||||
}
|
|
||||||
|
|
||||||
private fun protoIdSignature(idSig: IdSignature): Int {
|
|
||||||
return protoIdSignatureMap.getOrPut(idSig) {
|
|
||||||
protoIdSignatureArray.add(serializeIdSignature(idSig))
|
|
||||||
protoIdSignatureArray.size - 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------- IrSymbols -------------------------------------------------------- */
|
/* ------- IrSymbols -------------------------------------------------------- */
|
||||||
@@ -349,7 +261,7 @@ open class IrFileSerializer(
|
|||||||
val symbolKind = protoSymbolKind(symbol)
|
val symbolKind = protoSymbolKind(symbol)
|
||||||
|
|
||||||
val signatureId = when {
|
val signatureId = when {
|
||||||
symbol is IrFileSymbol -> protoIdSignature(IdSignature.FileSignature(symbol)) // TODO: special signature for files?
|
symbol is IrFileSymbol -> idSignatureSerializer.protoIdSignature(IdSignature.FileSignature(symbol)) // TODO: special signature for files?
|
||||||
else -> {
|
else -> {
|
||||||
val declaration = symbol.owner as? IrDeclaration ?: error("Expected IrDeclaration: ${symbol.owner.render()}")
|
val declaration = symbol.owner as? IrDeclaration ?: error("Expected IrDeclaration: ${symbol.owner.render()}")
|
||||||
protoIdSignature(declaration)
|
protoIdSignature(declaration)
|
||||||
@@ -1448,7 +1360,7 @@ open class IrFileSerializer(
|
|||||||
|
|
||||||
// TODO: keep order similar
|
// TODO: keep order similar
|
||||||
val sigIndex = protoIdSignatureMap[idSig]
|
val sigIndex = protoIdSignatureMap[idSig]
|
||||||
?: if (it is IrErrorDeclaration) protoIdSignature(idSig) else error("Not found ID for $idSig (${it.render()})")
|
?: if (it is IrErrorDeclaration) idSignatureSerializer.protoIdSignature(idSig) else error("Not found ID for $idSig (${it.render()})")
|
||||||
topLevelDeclarations.add(SerializedDeclaration(sigIndex, idSig.render(), byteArray))
|
topLevelDeclarations.add(SerializedDeclaration(sigIndex, idSig.render(), byteArray))
|
||||||
proto.addDeclarationId(sigIndex)
|
proto.addDeclarationId(sigIndex)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user