Load new proto messages for constructors

This commit is contained in:
Alexander Udalov
2015-10-05 00:04:54 +03:00
parent 9bf0502a31
commit a44f74ea20
2 changed files with 14 additions and 16 deletions
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
import org.jetbrains.kotlin.resolve.DescriptorFactory
import org.jetbrains.kotlin.serialization.Flags
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.ProtoBuf.Callable
import org.jetbrains.kotlin.serialization.deserialization.descriptors.*
import org.jetbrains.kotlin.utils.toReadOnlyList
@@ -155,19 +154,19 @@ public class MemberDeserializer(private val c: DeserializationContext) {
return (c.containingDeclaration as? ClassDescriptor)?.getThisAsReceiverParameter()
}
public fun loadConstructor(proto: Callable, isPrimary: Boolean): ConstructorDescriptor {
public fun loadConstructor(proto: ProtoBuf.Constructor, isPrimary: Boolean): ConstructorDescriptor {
val classDescriptor = c.containingDeclaration as ClassDescriptor
val descriptor = DeserializedConstructorDescriptor(
classDescriptor, null, getAnnotations(proto, proto.getFlags(), AnnotatedCallableKind.FUNCTION),
isPrimary, CallableMemberDescriptor.Kind.DECLARATION, TODO("proto"), c.nameResolver
classDescriptor, null, getAnnotations(proto, proto.flags, AnnotatedCallableKind.FUNCTION),
isPrimary, CallableMemberDescriptor.Kind.DECLARATION, proto, c.nameResolver
)
val local = c.childContext(descriptor, listOf())
descriptor.initialize(
classDescriptor.getTypeConstructor().getParameters(),
classDescriptor.typeConstructor.parameters,
local.memberDeserializer.valueParameters(proto.valueParameterList, proto, AnnotatedCallableKind.FUNCTION),
Deserialization.visibility(Flags.VISIBILITY.get(proto.getFlags()))
Deserialization.visibility(Flags.VISIBILITY.get(proto.flags))
)
descriptor.setReturnType(local.typeDeserializer.type(proto.getReturnType()))
descriptor.returnType = classDescriptor.defaultType
return descriptor
}
@@ -102,16 +102,15 @@ public class DeserializedClassDescriptor(
override fun isCompanionObject(): Boolean = isCompanion
private fun computePrimaryConstructor(): ConstructorDescriptor? {
if (!classProto.hasPrimaryConstructor()) return null
val constructorProto = classProto.getPrimaryConstructor()
if (!constructorProto.hasData()) {
val descriptor = DescriptorFactory.createPrimaryConstructorForObject(this, SourceElement.NO_SOURCE)
descriptor.setReturnType(getDefaultType())
return descriptor
if (kind.isSingleton) {
return DescriptorFactory.createPrimaryConstructorForObject(this, SourceElement.NO_SOURCE).apply {
returnType = getDefaultType()
}
}
return c.memberDeserializer.loadConstructor(constructorProto.getData(), true)
return classProto.constructorList.firstOrNull { !Flags.IS_SECONDARY.get(it.flags) }?.let { constructorProto ->
c.memberDeserializer.loadConstructor(constructorProto, true)
}
}
override fun getUnsubstitutedPrimaryConstructor(): ConstructorDescriptor? = primaryConstructor()
@@ -120,7 +119,7 @@ public class DeserializedClassDescriptor(
computeSecondaryConstructors() + getUnsubstitutedPrimaryConstructor().singletonOrEmptyList()
private fun computeSecondaryConstructors(): List<ConstructorDescriptor> =
classProto.getSecondaryConstructorList().map {
classProto.constructorList.filter { Flags.IS_SECONDARY.get(it.flags) }.map {
c.memberDeserializer.loadConstructor(it, false)
}