Introduce ClassDescriptor.getSealedSubclasses

#KT-12795 In Progress
This commit is contained in:
Alexander Udalov
2016-12-30 17:48:31 +03:00
parent 164c72e877
commit 75a4958144
14 changed files with 117 additions and 42 deletions
@@ -110,6 +110,7 @@ class NotFoundClasses(private val storageManager: StorageManager, private val mo
override fun getConstructors(): Collection<ClassConstructorDescriptor> = emptySet()
override fun getUnsubstitutedPrimaryConstructor(): ClassConstructorDescriptor? = null
override fun getCompanionObjectDescriptor(): ClassDescriptor? = null
override fun getSealedSubclasses(): Collection<ClassDescriptor> = emptyList()
override fun toString() = "class $name (not found)"
}
@@ -28,6 +28,7 @@ import org.jetbrains.kotlin.resolve.DescriptorFactory
import org.jetbrains.kotlin.resolve.NonReportingOverrideStrategy
import org.jetbrains.kotlin.resolve.OverridingUtil
import org.jetbrains.kotlin.resolve.descriptorUtil.classId
import org.jetbrains.kotlin.resolve.descriptorUtil.computeSealedSubclasses
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.resolve.scopes.MemberScope
import org.jetbrains.kotlin.resolve.scopes.StaticScopeForKotlinEnum
@@ -46,7 +47,7 @@ class DeserializedClassDescriptor(
val classProto: ProtoBuf.Class,
nameResolver: NameResolver,
private val sourceElement: SourceElement
) : ClassDescriptor, AbstractClassDescriptor(
) : AbstractClassDescriptor(
outerContext.storageManager,
nameResolver.getClassId(classProto.fqName).shortClassName
) {
@@ -67,6 +68,7 @@ class DeserializedClassDescriptor(
private val primaryConstructor = c.storageManager.createNullableLazyValue { computePrimaryConstructor() }
private val constructors = c.storageManager.createLazyValue { computeConstructors() }
private val companionObjectDescriptor = c.storageManager.createNullableLazyValue { computeCompanionObjectDescriptor() }
private val sealedSubclasses = c.storageManager.createLazyValue { computeSubclassesForSealedClass() }
internal val thisAsProtoContainer: ProtoContainer.Class = ProtoContainer.Class(
classProto, c.nameResolver, c.typeTable, sourceElement,
@@ -147,6 +149,13 @@ class DeserializedClassDescriptor(
internal fun hasNestedClass(name: Name): Boolean =
name in memberScope.classNames
private fun computeSubclassesForSealedClass(): Collection<ClassDescriptor> {
// TODO: store the list of subclasses to metadata
return computeSealedSubclasses(this)
}
override fun getSealedSubclasses() = sealedSubclasses()
override fun toString() = "deserialized class $name" // not using descriptor render to preserve laziness
override fun getSource() = sourceElement