Don't read isStaticInOuter message for fields

It's only written for fields of properties of companion objects of classes;
handle that case manually in deserialization
This commit is contained in:
Alexander Udalov
2015-12-17 03:50:37 +03:00
parent 696dce68fb
commit f7969621d6
8 changed files with 54 additions and 36 deletions
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.descriptors.impl.PropertyGetterDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.PropertySetterDescriptorImpl
import org.jetbrains.kotlin.descriptors.impl.ValueParameterDescriptorImpl
import org.jetbrains.kotlin.resolve.DescriptorFactory
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.serialization.Flags
import org.jetbrains.kotlin.serialization.ProtoBuf
import org.jetbrains.kotlin.serialization.deserialization.descriptors.*
@@ -241,9 +242,13 @@ public class MemberDeserializer(private val c: DeserializationContext) {
}
}
private fun DeclarationDescriptor.asProtoContainer(): ProtoContainer? = when(this) {
private fun DeclarationDescriptor.asProtoContainer(): ProtoContainer? = when (this) {
is PackageFragmentDescriptor -> ProtoContainer.Package(fqName, c.nameResolver, c.typeTable)
is DeserializedClassDescriptor -> ProtoContainer.Class(classProto, c.nameResolver, c.typeTable)
is DeserializedClassDescriptor -> ProtoContainer.Class(
classProto, c.nameResolver, c.typeTable,
isCompanionOfClass = DescriptorUtils.isCompanionObject(this) &&
containingDeclaration.let { DescriptorUtils.isClass(it) || DescriptorUtils.isEnumClass(it) }
)
else -> null // TODO: support annotations on lambdas and their parameters
}
}
@@ -26,7 +26,8 @@ sealed class ProtoContainer(
class Class(
val classProto: ProtoBuf.Class,
nameResolver: NameResolver,
typeTable: TypeTable
typeTable: TypeTable,
val isCompanionOfClass: Boolean
) : ProtoContainer(nameResolver, typeTable) {
override fun debugFqName(): FqName = nameResolver.getClassId(classProto.fqName).asSingleFqName()
}
@@ -296,7 +296,7 @@ public class DeserializedClassDescriptor(
val annotations = enumEntryProtos[name]?.let { proto ->
DeserializedAnnotations(c.storageManager) {
c.components.annotationAndConstantLoader.loadEnumEntryAnnotations(
ProtoContainer.Class(classProto, c.nameResolver, c.typeTable), proto
ProtoContainer.Class(classProto, c.nameResolver, c.typeTable, isCompanionOfClass = false), proto
)
}
} ?: if (name in oldEnumEntryNames) Annotations.EMPTY