Remove unnecessary fields in DeserializedClassDescriptor

This commit is contained in:
Alexander Udalov
2016-04-07 15:27:01 +03:00
parent e0dd60c57a
commit d571512f47
2 changed files with 18 additions and 34 deletions
@@ -39,5 +39,5 @@ abstract class NonReportingOverrideStrategy : OverridingStrategy() {
conflict(first, second) conflict(first, second)
} }
protected abstract fun conflict(first: CallableMemberDescriptor, second: CallableMemberDescriptor) protected abstract fun conflict(fromSuper: CallableMemberDescriptor, fromCurrent: CallableMemberDescriptor)
} }
@@ -36,7 +36,6 @@ import org.jetbrains.kotlin.serialization.deserialization.*
import org.jetbrains.kotlin.types.AbstractClassTypeConstructor import org.jetbrains.kotlin.types.AbstractClassTypeConstructor
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeConstructor import org.jetbrains.kotlin.types.TypeConstructor
import org.jetbrains.kotlin.utils.addIfNotNull
import org.jetbrains.kotlin.utils.singletonOrEmptyList import org.jetbrains.kotlin.utils.singletonOrEmptyList
import org.jetbrains.kotlin.utils.toReadOnlyList import org.jetbrains.kotlin.utils.toReadOnlyList
import java.util.* import java.util.*
@@ -52,20 +51,14 @@ class DeserializedClassDescriptor(
) { ) {
private val modality = Deserialization.modality(Flags.MODALITY.get(classProto.flags)) private val modality = Deserialization.modality(Flags.MODALITY.get(classProto.flags))
private val visibility = Deserialization.visibility(Flags.VISIBILITY.get(classProto.flags)) private val visibility = Deserialization.visibility(Flags.VISIBILITY.get(classProto.flags))
private val kindFromProto = Flags.CLASS_KIND.get(classProto.flags) private val kind = Deserialization.classKind(Flags.CLASS_KIND.get(classProto.flags))
private val kind = Deserialization.classKind(kindFromProto)
private val isCompanion = kindFromProto == ProtoBuf.Class.Kind.COMPANION_OBJECT
private val isInner = Flags.IS_INNER.get(classProto.flags)
private val isData = Flags.IS_DATA.get(classProto.flags)
val c = outerContext.childContext(this, classProto.typeParameterList, nameResolver, TypeTable(classProto.typeTable)) val c = outerContext.childContext(this, classProto.typeParameterList, nameResolver, TypeTable(classProto.typeTable))
private val classId = nameResolver.getClassId(classProto.fqName)
private val staticScope = if (kind == ClassKind.ENUM_CLASS) StaticScopeForKotlinEnum(c.storageManager, this) else MemberScope.Empty private val staticScope = if (kind == ClassKind.ENUM_CLASS) StaticScopeForKotlinEnum(c.storageManager, this) else MemberScope.Empty
private val typeConstructor = DeserializedClassTypeConstructor() private val typeConstructor = DeserializedClassTypeConstructor()
private val memberScope = DeserializedClassMemberScope() private val memberScope = DeserializedClassMemberScope()
private val nestedClasses = NestedClassDescriptors() private val nestedClasses = if (classProto.nestedClassNameCount > 0) NestedClassDescriptors() else null
private val enumEntries = if (kind == ClassKind.ENUM_CLASS) EnumEntryClassDescriptors() else null private val enumEntries = if (kind == ClassKind.ENUM_CLASS) EnumEntryClassDescriptors() else null
private val containingDeclaration = outerContext.containingDeclaration private val containingDeclaration = outerContext.containingDeclaration
@@ -96,9 +89,9 @@ class DeserializedClassDescriptor(
override fun getVisibility() = visibility override fun getVisibility() = visibility
override fun isInner() = isInner override fun isInner() = Flags.IS_INNER.get(classProto.flags)
override fun isData() = isData override fun isData() = Flags.IS_DATA.get(classProto.flags)
override fun getAnnotations() = annotations override fun getAnnotations() = annotations
@@ -106,7 +99,7 @@ class DeserializedClassDescriptor(
override fun getStaticScope() = staticScope override fun getStaticScope() = staticScope
override fun isCompanionObject(): Boolean = isCompanion override fun isCompanionObject(): Boolean = Flags.CLASS_KIND.get(classProto.flags) == ProtoBuf.Class.Kind.COMPANION_OBJECT
private fun computePrimaryConstructor(): ConstructorDescriptor? { private fun computePrimaryConstructor(): ConstructorDescriptor? {
if (kind.isSingleton) { if (kind.isSingleton) {
@@ -141,9 +134,8 @@ class DeserializedClassDescriptor(
override fun getCompanionObjectDescriptor(): ClassDescriptor? = companionObjectDescriptor() override fun getCompanionObjectDescriptor(): ClassDescriptor? = companionObjectDescriptor()
internal fun hasNestedClass(name: Name): Boolean { internal fun hasNestedClass(name: Name): Boolean {
return name in nestedClasses.nestedClassNames return nestedClasses != null && name in nestedClasses.nestedClassNames
} }
override fun toString() = "deserialized class ${getName().toString()}" // not using descriptor render to preserve laziness override fun toString() = "deserialized class ${getName().toString()}" // not using descriptor render to preserve laziness
@@ -249,10 +241,10 @@ class DeserializedClassDescriptor(
} }
override fun getClassDescriptor(name: Name): ClassifierDescriptor? = override fun getClassDescriptor(name: Name): ClassifierDescriptor? =
classDescriptor.enumEntries?.findEnumEntry(name) ?: classDescriptor.nestedClasses.findNestedClass(name) classDescriptor.enumEntries?.findEnumEntry(name) ?: classDescriptor.nestedClasses?.findNestedClass(name)
override fun addClassDescriptors(result: MutableCollection<DeclarationDescriptor>, nameFilter: (Name) -> Boolean) { override fun addClassDescriptors(result: MutableCollection<DeclarationDescriptor>, nameFilter: (Name) -> Boolean) {
result.addAll(classDescriptor.nestedClasses.all()) result.addAll(classDescriptor.nestedClasses?.all().orEmpty())
} }
override fun addEnumEntryDescriptors(result: MutableCollection<DeclarationDescriptor>, nameFilter: (Name) -> Boolean) { override fun addEnumEntryDescriptors(result: MutableCollection<DeclarationDescriptor>, nameFilter: (Name) -> Boolean) {
@@ -261,9 +253,11 @@ class DeserializedClassDescriptor(
} }
private inner class NestedClassDescriptors { private inner class NestedClassDescriptors {
internal val nestedClassNames = nestedClassNames() private val classId = c.nameResolver.getClassId(classProto.fqName)
internal val findNestedClass = c.storageManager.createMemoizedFunctionWithNullableValues<Name, ClassDescriptor> { internal val nestedClassNames = classProto.nestedClassNameList.map { c.nameResolver.getName(it) }.toSet()
private val nestedClassByName = c.storageManager.createMemoizedFunctionWithNullableValues<Name, ClassDescriptor> {
name -> name ->
if (name in nestedClassNames) { if (name in nestedClassNames) {
c.components.deserializeClass(classId.createNestedClassId(name)) c.components.deserializeClass(classId.createNestedClassId(name))
@@ -271,26 +265,16 @@ class DeserializedClassDescriptor(
else null else null
} }
private fun nestedClassNames(): Set<Name> { fun findNestedClass(name: Name): ClassDescriptor? = nestedClassByName(name)
val result = LinkedHashSet<Name>()
val nameResolver = c.nameResolver
for (index in classProto.nestedClassNameList) {
result.add(nameResolver.getName(index!!))
}
return result
}
fun all(): Collection<ClassDescriptor> { fun all(): Collection<ClassDescriptor> =
val result = ArrayList<ClassDescriptor>(nestedClassNames.size) nestedClassNames.mapNotNull { name -> nestedClassByName(name) }
nestedClassNames.forEach { name -> result.addIfNotNull(findNestedClass(name)) }
return result
}
} }
private inner class EnumEntryClassDescriptors { private inner class EnumEntryClassDescriptors {
private val enumEntryProtos = classProto.enumEntryList.associateBy { c.nameResolver.getName(it.name) } private val enumEntryProtos = classProto.enumEntryList.associateBy { c.nameResolver.getName(it.name) }
val enumEntryByName = c.storageManager.createMemoizedFunctionWithNullableValues<Name, ClassDescriptor> { private val enumEntryByName = c.storageManager.createMemoizedFunctionWithNullableValues<Name, ClassDescriptor> {
name -> name ->
enumEntryProtos[name]?.let { proto -> enumEntryProtos[name]?.let { proto ->