Somewhat simplified descriptor management for IR serialization.

The public descriptors don't need to keep their containing declaration index.
KonanIr.KotlinDescriptor already has this index, so use it instead.
That allows to remove some more clutter from KonanLinkData.
This commit is contained in:
Alexander Gorshenev
2017-04-26 23:31:33 +03:00
committed by alexander-gorshenev
parent 503399ade3
commit 0859abbb9d
6 changed files with 25 additions and 74 deletions
@@ -79,25 +79,26 @@ internal class IrDescriptorDeserializer(val context: Context,
context.log{"### deserialized Kotlin Type index=$index, text=$text:\t$realType"} context.log{"### deserialized Kotlin Type index=$index, text=$text:\t$realType"}
return realType return realType
} }
fun deserializeLocalDeclaration(irProto: KonanIr.KotlinDescriptor, proto: KonanIr.DeclarationDescriptor): DeclarationDescriptor { fun deserializeLocalDeclaration(irProto: KonanIr.KotlinDescriptor): DeclarationDescriptor {
val localDeclarationProto = irProto.irLocalDeclaration.descriptor
when { when {
proto.hasFunction() -> { localDeclarationProto.hasFunction() -> {
val functionProto = proto.function val functionProto = localDeclarationProto.function
val index = irProto.index val index = irProto.index
val descriptor = localDeserializer.deserializeFunction(functionProto) val descriptor = localDeserializer.deserializeFunction(irProto)
descriptorIndex.put(index, descriptor) descriptorIndex.put(index, descriptor)
return descriptor return descriptor
} }
proto.hasProperty() -> { localDeclarationProto.hasProperty() -> {
val propertyProto = proto.property val propertyProto = localDeclarationProto.property
val index = irProto.index val index = irProto.index
val descriptor = localDeserializer.deserializeProperty(propertyProto) val descriptor = localDeserializer.deserializeProperty(irProto)
descriptorIndex.put(index, descriptor) descriptorIndex.put(index, descriptor)
return descriptor return descriptor
} }
// TODO // TODO
// proto.hasClazz() -> // localDclarationProto.hasClazz() ->
else -> TODO("Unexpected descriptor kind") else -> TODO("Unexpected descriptor kind")
} }
} }
@@ -135,8 +136,7 @@ internal class IrDescriptorDeserializer(val context: Context,
context.log{"### deserializeDescriptor ${proto.kind} ${proto.index}"} context.log{"### deserializeDescriptor ${proto.kind} ${proto.index}"}
val descriptor = if (proto.hasIrLocalDeclaration()) { val descriptor = if (proto.hasIrLocalDeclaration()) {
val realDescriptor = proto.irLocalDeclaration.descriptor deserializeLocalDeclaration(proto)
deserializeLocalDeclaration(proto, realDescriptor)
} else } else
deserializeKnownDescriptor(proto) deserializeKnownDescriptor(proto)
@@ -3,7 +3,6 @@ syntax = "proto2";
package org.jetbrains.kotlin.serialization; package org.jetbrains.kotlin.serialization;
import "org/jetbrains/kotlin/backend/konan/serialization/descriptors.proto1"; import "org/jetbrains/kotlin/backend/konan/serialization/descriptors.proto1";
import "org/jetbrains/kotlin/backend/konan/serialization/KonanLinkData.proto";
option java_outer_classname = "KonanIr"; option java_outer_classname = "KonanIr";
option optimize_for = LITE_RUNTIME; option optimize_for = LITE_RUNTIME;
@@ -28,7 +27,10 @@ message KotlinDescriptor {
required UniqId original_uniq_id = 4; required UniqId original_uniq_id = 4;
// index in fq name table // index in fq name table
optional int32 class_or_package = 5; optional int32 class_or_package = 5;
// Descriptor kind specific fields. // Descriptor kind specific fields.
// TODO: consider introducing specific messages
// for functions, variables etc.
optional KotlinType type = 6; optional KotlinType type = 6;
repeated KotlinDescriptor value_parameter = 7; repeated KotlinDescriptor value_parameter = 7;
repeated KotlinDescriptor type_parameter = 8; repeated KotlinDescriptor type_parameter = 8;
@@ -25,18 +25,15 @@ extend Class {
extend Constructor { extend Constructor {
repeated Annotation constructor_annotation = 170; repeated Annotation constructor_annotation = 170;
optional int32 constructor_parent = 172;
} }
extend Function { extend Function {
repeated Annotation function_annotation = 170; repeated Annotation function_annotation = 170;
optional int32 function_parent = 172;
optional InlineIrBody inline_ir_body = 174; optional InlineIrBody inline_ir_body = 174;
} }
extend Property { extend Property {
repeated Annotation property_annotation = 170; repeated Annotation property_annotation = 170;
optional int32 property_parent = 172;
optional bool used_as_variable = 173; optional bool used_as_variable = 173;
optional Annotation.Argument.Value compile_time_value = 174; optional Annotation.Argument.Value compile_time_value = 174;
optional InlineIrBody inline_getter_ir_body = 175; optional InlineIrBody inline_getter_ir_body = 175;
@@ -53,22 +53,8 @@ internal class KonanSerializerExtension(val context: Context, val util: KonanSer
super.serializeEnumEntry(descriptor, proto) super.serializeEnumEntry(descriptor, proto)
} }
fun DeclarationDescriptor.parentFqNameIndex(): Int? {
if (this.containingDeclaration is ClassOrPackageFragmentDescriptor) {
val parentIndex = stringTable.getClassOrPackageFqNameIndex(
this.containingDeclaration as ClassOrPackageFragmentDescriptor)
return parentIndex
} else {
return null
}
}
override fun serializeConstructor(descriptor: ConstructorDescriptor, proto: ProtoBuf.Constructor.Builder) { override fun serializeConstructor(descriptor: ConstructorDescriptor, proto: ProtoBuf.Constructor.Builder) {
val parentIndex = descriptor.parentFqNameIndex()
if (parentIndex != null) proto.setExtension(KonanLinkData.constructorParent, parentIndex)
super.serializeConstructor(descriptor, proto) super.serializeConstructor(descriptor, proto)
} }
@@ -79,8 +65,6 @@ internal class KonanSerializerExtension(val context: Context, val util: KonanSer
override fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) { override fun serializeFunction(descriptor: FunctionDescriptor, proto: ProtoBuf.Function.Builder) {
val parentIndex = descriptor.parentFqNameIndex()
if (parentIndex != null) proto.setExtension(KonanLinkData.functionParent, parentIndex)
super.serializeFunction(descriptor, proto) super.serializeFunction(descriptor, proto)
} }
@@ -91,8 +75,6 @@ internal class KonanSerializerExtension(val context: Context, val util: KonanSer
backingFieldClass, emptyMap(), SourceElement.NO_SOURCE) backingFieldClass, emptyMap(), SourceElement.NO_SOURCE)
override fun serializeProperty(descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder) { override fun serializeProperty(descriptor: PropertyDescriptor, proto: ProtoBuf.Property.Builder) {
val parentIndex = descriptor.parentFqNameIndex()
if (parentIndex != null) proto.setExtension(KonanLinkData.propertyParent, parentIndex)
val variable = originalVariables[descriptor] val variable = originalVariables[descriptor]
if (variable != null) { if (variable != null) {
proto.setExtension(KonanLinkData.usedAsVariable, true) proto.setExtension(KonanLinkData.usedAsVariable, true)
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.backend.konan.serialization
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor import org.jetbrains.kotlin.descriptors.impl.LocalVariableDescriptor
import org.jetbrains.kotlin.serialization.Flags import org.jetbrains.kotlin.serialization.Flags
import org.jetbrains.kotlin.serialization.KonanIr
import org.jetbrains.kotlin.serialization.KonanLinkData import org.jetbrains.kotlin.serialization.KonanLinkData
import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.QualifiedName import org.jetbrains.kotlin.serialization.ProtoBuf.QualifiedNameTable.QualifiedName
@@ -29,7 +30,6 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.*
import org.jetbrains.kotlin.serialization.deserialization.descriptors.SinceKotlinInfoTable import org.jetbrains.kotlin.serialization.deserialization.descriptors.SinceKotlinInfoTable
import org.jetbrains.kotlin.serialization.deserialization.findClassAcrossModuleDependencies import org.jetbrains.kotlin.serialization.deserialization.findClassAcrossModuleDependencies
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.protobuf.GeneratedMessageLite
// This class knows how to construct contexts for // This class knows how to construct contexts for
// MemberDeserializer to deserialize descriptors declared in IR. // MemberDeserializer to deserialize descriptors declared in IR.
@@ -97,29 +97,31 @@ class LocalDeclarationDeserializer(val rootDescriptor: DeserializedCallableMembe
} }
private fun memberDeserializer(proto: GeneratedMessageLite): MemberDeserializer { private fun memberDeserializer(irProto: KonanIr.KotlinDescriptor): MemberDeserializer {
val containingFqName = proto.parent val containingFqName = irProto.classOrPackage
return if (containingFqName != null) { return if (containingFqName != null) {
memberDeserializerByParentFqNameIndex(containingFqName) memberDeserializerByParentFqNameIndex(containingFqName)
// TODO: learn to take the containing IR declaration // TODO: learn to take the containing IR declaration
} else this.memberDeserializer } else this.memberDeserializer
} }
fun deserializeFunction(proto: ProtoBuf.Function): FunctionDescriptor = fun deserializeFunction(irProto: KonanIr.KotlinDescriptor): FunctionDescriptor =
memberDeserializer(proto).loadFunction(proto) memberDeserializer(irProto).loadFunction(irProto.irLocalDeclaration.descriptor.function)
fun deserializeConstructor(proto: ProtoBuf.Constructor): ConstructorDescriptor { fun deserializeConstructor(irProto: KonanIr.KotlinDescriptor): ConstructorDescriptor {
val containingFqName = proto.getExtension(KonanLinkData.constructorParent) val proto = irProto.irLocalDeclaration.descriptor.constructor
val memberDeserializer = memberDeserializerByParentFqNameIndex(containingFqName) val memberDeserializer = memberDeserializerByParentFqNameIndex(irProto.classOrPackage)
val isPrimary = !Flags.IS_SECONDARY.get(proto.flags) val isPrimary = !Flags.IS_SECONDARY.get(proto.flags)
val constructor = memberDeserializer.loadConstructor(proto, isPrimary) val constructor = memberDeserializer.loadConstructor(proto, isPrimary)
return constructor return constructor
} }
fun deserializeProperty(proto: ProtoBuf.Property): VariableDescriptor { fun deserializeProperty(irProto: KonanIr.KotlinDescriptor): VariableDescriptor {
val property = memberDeserializer(proto).loadProperty(proto)
val proto = irProto.irLocalDeclaration.descriptor.property
val property = memberDeserializer(irProto).loadProperty(proto)
return if (proto.getExtension(KonanLinkData.usedAsVariable)) { return if (proto.getExtension(KonanLinkData.usedAsVariable)) {
propertyToVariable(property) propertyToVariable(property)
@@ -4,7 +4,6 @@ import org.jetbrains.kotlin.serialization.KonanIr
import org.jetbrains.kotlin.serialization.KonanLinkData import org.jetbrains.kotlin.serialization.KonanLinkData
import org.jetbrains.kotlin.serialization.KonanLinkData.* import org.jetbrains.kotlin.serialization.KonanLinkData.*
import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.protobuf.GeneratedMessageLite
fun newUniqId(index: Long): KonanIr.UniqId = fun newUniqId(index: Long): KonanIr.UniqId =
KonanIr.UniqId.newBuilder().setIndex(index).build() KonanIr.UniqId.newBuilder().setIndex(index).build()
@@ -63,37 +62,6 @@ fun inlineBody(encodedIR: String)
.setEncodedIr(encodedIR) .setEncodedIr(encodedIR)
.build() .build()
// -----------------------------------------------------------
val ProtoBuf.Function.parent: Int?
get() = if (this.hasExtension(KonanLinkData.functionParent))
this.getExtension(KonanLinkData.functionParent)
else null
val ProtoBuf.Property.parent: Int?
get() = if (this.hasExtension(KonanLinkData.propertyParent))
this.getExtension(KonanLinkData.propertyParent)
else null
val ProtoBuf.Constructor.parent: Int?
get() = if (this.hasExtension(KonanLinkData.constructorParent))
this.getExtension(KonanLinkData.constructorParent)
else null
val GeneratedMessageLite.parent: Int?
get() = when (this) {
is ProtoBuf.Function
-> this.parent
is ProtoBuf.Property
-> this.parent
is ProtoBuf.Constructor
-> this.parent
else
-> error("Unexpected protobuf message")
}
// ----------------------------------------------------------- // -----------------------------------------------------------
internal fun printType(proto: ProtoBuf.Type) { internal fun printType(proto: ProtoBuf.Type) {