Minor, make ProtoContainer sealed with two subclasses

This commit is contained in:
Alexander Udalov
2015-12-17 03:27:07 +03:00
parent 745de229cc
commit 19372a7210
7 changed files with 49 additions and 44 deletions
@@ -239,8 +239,8 @@ public class MemberDeserializer(private val c: DeserializationContext) {
}
private fun DeclarationDescriptor.asProtoContainer(): ProtoContainer? = when(this) {
is PackageFragmentDescriptor -> ProtoContainer(null, fqName, c.nameResolver, c.typeTable)
is DeserializedClassDescriptor -> ProtoContainer(classProto, null, c.nameResolver, c.typeTable)
is PackageFragmentDescriptor -> ProtoContainer.Package(fqName, c.nameResolver, c.typeTable)
is DeserializedClassDescriptor -> ProtoContainer.Class(classProto, c.nameResolver, c.typeTable)
else -> null // TODO: support annotations on lambdas and their parameters
}
}
@@ -19,16 +19,25 @@ package org.jetbrains.kotlin.serialization.deserialization
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.serialization.ProtoBuf
public data class ProtoContainer(
val classProto: ProtoBuf.Class?,
val packageFqName: FqName?,
sealed class ProtoContainer(
val nameResolver: NameResolver,
val typeTable: TypeTable
) {
init {
assert((classProto != null) xor (packageFqName != null))
class Class(
val classProto: ProtoBuf.Class,
nameResolver: NameResolver,
typeTable: TypeTable
) : ProtoContainer(nameResolver, typeTable) {
override fun debugFqName(): FqName = nameResolver.getClassId(classProto.fqName).asSingleFqName()
}
fun getFqName(): FqName =
packageFqName ?: nameResolver.getClassId(classProto!!.getFqName()).asSingleFqName()
class Package(
val fqName: FqName,
nameResolver: NameResolver,
typeTable: TypeTable
) : ProtoContainer(nameResolver, typeTable) {
override fun debugFqName(): FqName = fqName
}
abstract fun debugFqName(): FqName
}
@@ -296,7 +296,7 @@ public class DeserializedClassDescriptor(
val annotations = enumEntryProtos[name]?.let { proto ->
DeserializedAnnotations(c.storageManager) {
c.components.annotationAndConstantLoader.loadEnumEntryAnnotations(
ProtoContainer(classProto, null, c.nameResolver, c.typeTable), proto
ProtoContainer.Class(classProto, c.nameResolver, c.typeTable), proto
)
}
} ?: if (name in oldEnumEntryNames) Annotations.EMPTY