[KLIB] Support IrError* nodes in serialization
This commit is contained in:
+31
-1
@@ -53,6 +53,9 @@ import org.jetbrains.kotlin.backend.common.serialization.proto.IrDynamicOperator
|
|||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrDynamicType as ProtoDynamicType
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrDynamicType as ProtoDynamicType
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrEnumConstructorCall as ProtoEnumConstructorCall
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrEnumConstructorCall as ProtoEnumConstructorCall
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrEnumEntry as ProtoEnumEntry
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrEnumEntry as ProtoEnumEntry
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrErrorDeclaration as ProtoErrorDeclaration
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrErrorExpression as ProtoErrorExpression
|
||||||
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrErrorCallExpression as ProtoErrorCallExpression
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrErrorType as ProtoErrorType
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrErrorType as ProtoErrorType
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrExpression as ProtoExpression
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrExpression as ProtoExpression
|
||||||
import org.jetbrains.kotlin.backend.common.serialization.proto.IrField as ProtoField
|
import org.jetbrains.kotlin.backend.common.serialization.proto.IrField as ProtoField
|
||||||
@@ -832,6 +835,22 @@ open class IrFileSerializer(
|
|||||||
return proto.build()
|
return proto.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun serializeErrorExpression(expression: IrErrorExpression): ProtoErrorExpression {
|
||||||
|
val proto = ProtoErrorExpression.newBuilder().setDescription(serializeString(expression.description))
|
||||||
|
return proto.build()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun serializeErrorCallExpression(callExpression: IrErrorCallExpression): ProtoErrorCallExpression {
|
||||||
|
val proto = ProtoErrorCallExpression.newBuilder().setDescription(serializeString(callExpression.description))
|
||||||
|
callExpression.explicitReceiver?.let {
|
||||||
|
proto.setReceiver(serializeExpression(it))
|
||||||
|
}
|
||||||
|
callExpression.arguments.forEach {
|
||||||
|
proto.addValueArgument(serializeExpression(it))
|
||||||
|
}
|
||||||
|
return proto.build()
|
||||||
|
}
|
||||||
|
|
||||||
private fun serializeDynamicOperator(operator: IrDynamicOperator) = when (operator) {
|
private fun serializeDynamicOperator(operator: IrDynamicOperator) = when (operator) {
|
||||||
IrDynamicOperator.UNARY_PLUS -> ProtoDynamicOperatorExpression.IrDynamicOperator.UNARY_PLUS
|
IrDynamicOperator.UNARY_PLUS -> ProtoDynamicOperatorExpression.IrDynamicOperator.UNARY_PLUS
|
||||||
IrDynamicOperator.UNARY_MINUS -> ProtoDynamicOperatorExpression.IrDynamicOperator.UNARY_MINUS
|
IrDynamicOperator.UNARY_MINUS -> ProtoDynamicOperatorExpression.IrDynamicOperator.UNARY_MINUS
|
||||||
@@ -943,6 +962,8 @@ open class IrFileSerializer(
|
|||||||
is IrWhileLoop -> operationProto.`while` = serializeWhile(expression)
|
is IrWhileLoop -> operationProto.`while` = serializeWhile(expression)
|
||||||
is IrDynamicMemberExpression -> operationProto.dynamicMember = serializeDynamicMemberExpression(expression)
|
is IrDynamicMemberExpression -> operationProto.dynamicMember = serializeDynamicMemberExpression(expression)
|
||||||
is IrDynamicOperatorExpression -> operationProto.dynamicOperator = serializeDynamicOperatorExpression(expression)
|
is IrDynamicOperatorExpression -> operationProto.dynamicOperator = serializeDynamicOperatorExpression(expression)
|
||||||
|
is IrErrorCallExpression -> operationProto.errorCallExpression = serializeErrorCallExpression(expression)
|
||||||
|
is IrErrorExpression -> operationProto.errorExpression = serializeErrorExpression(expression)
|
||||||
else -> {
|
else -> {
|
||||||
TODO("Expression serialization not implemented yet: ${ir2string(expression)}.")
|
TODO("Expression serialization not implemented yet: ${ir2string(expression)}.")
|
||||||
}
|
}
|
||||||
@@ -1150,6 +1171,12 @@ open class IrFileSerializer(
|
|||||||
return proto.build()
|
return proto.build()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun serializeIrErrorDeclaration(errorDeclaration: IrErrorDeclaration): ProtoErrorDeclaration {
|
||||||
|
val proto = ProtoErrorDeclaration.newBuilder()
|
||||||
|
.setCoordinates(serializeCoordinates(errorDeclaration.startOffset, errorDeclaration.endOffset))
|
||||||
|
return proto.build()
|
||||||
|
}
|
||||||
|
|
||||||
private fun serializeIrEnumEntry(enumEntry: IrEnumEntry): ProtoEnumEntry {
|
private fun serializeIrEnumEntry(enumEntry: IrEnumEntry): ProtoEnumEntry {
|
||||||
val proto = ProtoEnumEntry.newBuilder()
|
val proto = ProtoEnumEntry.newBuilder()
|
||||||
.setBase(serializeIrDeclarationBase(enumEntry, null))
|
.setBase(serializeIrDeclarationBase(enumEntry, null))
|
||||||
@@ -1194,6 +1221,8 @@ open class IrFileSerializer(
|
|||||||
proto.irLocalDelegatedProperty = serializeIrLocalDelegatedProperty(declaration)
|
proto.irLocalDelegatedProperty = serializeIrLocalDelegatedProperty(declaration)
|
||||||
is IrTypeAlias ->
|
is IrTypeAlias ->
|
||||||
proto.irTypeAlias = serializeIrTypeAlias(declaration)
|
proto.irTypeAlias = serializeIrTypeAlias(declaration)
|
||||||
|
is IrErrorDeclaration ->
|
||||||
|
proto.irErrorDeclaration = serializeIrErrorDeclaration(declaration)
|
||||||
else ->
|
else ->
|
||||||
TODO("Declaration serialization not supported yet: $declaration")
|
TODO("Declaration serialization not supported yet: $declaration")
|
||||||
}
|
}
|
||||||
@@ -1281,7 +1310,8 @@ open class IrFileSerializer(
|
|||||||
require(!idSig.isPackageSignature()) { "IsSig: $idSig\nDeclaration: ${it.render()}" }
|
require(!idSig.isPackageSignature()) { "IsSig: $idSig\nDeclaration: ${it.render()}" }
|
||||||
|
|
||||||
// TODO: keep order similar
|
// TODO: keep order similar
|
||||||
val sigIndex = protoIdSignatureMap[idSig] ?: error("Not found ID for $idSig (${it.render()})")
|
val sigIndex = protoIdSignatureMap[idSig]
|
||||||
|
?: if (it is IrErrorDeclaration) protoIdSignature(idSig) else error("Not found ID for $idSig (${it.render()})")
|
||||||
topLevelDeclarations.add(TopLevelDeclaration(sigIndex, idSig.toString(), byteArray))
|
topLevelDeclarations.add(TopLevelDeclaration(sigIndex, idSig.toString(), byteArray))
|
||||||
proto.addDeclarationId(sigIndex)
|
proto.addDeclarationId(sigIndex)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user