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.resolve.DescriptorFactory
import org.jetbrains.kotlin.serialization.Flags import org.jetbrains.kotlin.serialization.Flags
import org.jetbrains.kotlin.serialization.ProtoBuf import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.ProtoBuf.Callable
import org.jetbrains.kotlin.serialization.deserialization.descriptors.* import org.jetbrains.kotlin.serialization.deserialization.descriptors.*
import org.jetbrains.kotlin.utils.toReadOnlyList import org.jetbrains.kotlin.utils.toReadOnlyList
@@ -155,19 +154,19 @@ public class MemberDeserializer(private val c: DeserializationContext) {
return (c.containingDeclaration as? ClassDescriptor)?.getThisAsReceiverParameter() 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 classDescriptor = c.containingDeclaration as ClassDescriptor
val descriptor = DeserializedConstructorDescriptor( val descriptor = DeserializedConstructorDescriptor(
classDescriptor, null, getAnnotations(proto, proto.getFlags(), AnnotatedCallableKind.FUNCTION), classDescriptor, null, getAnnotations(proto, proto.flags, AnnotatedCallableKind.FUNCTION),
isPrimary, CallableMemberDescriptor.Kind.DECLARATION, TODO("proto"), c.nameResolver isPrimary, CallableMemberDescriptor.Kind.DECLARATION, proto, c.nameResolver
) )
val local = c.childContext(descriptor, listOf()) val local = c.childContext(descriptor, listOf())
descriptor.initialize( descriptor.initialize(
classDescriptor.getTypeConstructor().getParameters(), classDescriptor.typeConstructor.parameters,
local.memberDeserializer.valueParameters(proto.valueParameterList, proto, AnnotatedCallableKind.FUNCTION), 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 return descriptor
} }
@@ -102,16 +102,15 @@ public class DeserializedClassDescriptor(
override fun isCompanionObject(): Boolean = isCompanion override fun isCompanionObject(): Boolean = isCompanion
private fun computePrimaryConstructor(): ConstructorDescriptor? { private fun computePrimaryConstructor(): ConstructorDescriptor? {
if (!classProto.hasPrimaryConstructor()) return null if (kind.isSingleton) {
return DescriptorFactory.createPrimaryConstructorForObject(this, SourceElement.NO_SOURCE).apply {
val constructorProto = classProto.getPrimaryConstructor() returnType = getDefaultType()
if (!constructorProto.hasData()) { }
val descriptor = DescriptorFactory.createPrimaryConstructorForObject(this, SourceElement.NO_SOURCE)
descriptor.setReturnType(getDefaultType())
return descriptor
} }
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() override fun getUnsubstitutedPrimaryConstructor(): ConstructorDescriptor? = primaryConstructor()
@@ -120,7 +119,7 @@ public class DeserializedClassDescriptor(
computeSecondaryConstructors() + getUnsubstitutedPrimaryConstructor().singletonOrEmptyList() computeSecondaryConstructors() + getUnsubstitutedPrimaryConstructor().singletonOrEmptyList()
private fun computeSecondaryConstructors(): List<ConstructorDescriptor> = private fun computeSecondaryConstructors(): List<ConstructorDescriptor> =
classProto.getSecondaryConstructorList().map { classProto.constructorList.filter { Flags.IS_SECONDARY.get(it.flags) }.map {
c.memberDeserializer.loadConstructor(it, false) c.memberDeserializer.loadConstructor(it, false)
} }