Refactor ClassId.getOuterClassId, make it nullable
This commit is contained in:
+3
-2
@@ -44,8 +44,9 @@ class ClassDeserializer(private val components: DeserializationComponents) {
|
||||
?: return null
|
||||
val (nameResolver, classProto) = classData
|
||||
|
||||
val outerContext = if (classId.isNestedClass) {
|
||||
val outerClass = deserializeClass(classId.outerClassId) as? DeserializedClassDescriptor ?: return null
|
||||
val outerClassId = classId.outerClassId
|
||||
val outerContext = if (outerClassId != null) {
|
||||
val outerClass = deserializeClass(outerClassId) as? DeserializedClassDescriptor ?: return null
|
||||
|
||||
// Find the outer class first and check if he knows anything about the nested class we're looking for
|
||||
if (!outerClass.hasNestedClass(classId.shortClassName)) return null
|
||||
|
||||
+1
-1
@@ -73,7 +73,7 @@ class MetadataPackageFragment(
|
||||
private val finder: KotlinMetadataFinder
|
||||
) : DeserializedPackageFragment(fqName, storageManager, module) {
|
||||
override val classDataFinder = ClassDataFinder { classId ->
|
||||
val topLevelClassId = generateSequence(classId) { classId -> if (classId.isNestedClass) classId.outerClassId else null }.last()
|
||||
val topLevelClassId = generateSequence(classId, ClassId::getOuterClassId).last()
|
||||
val stream = finder.findMetadata(topLevelClassId) ?: return@ClassDataFinder null
|
||||
val (message, nameResolver) = readProto(stream)
|
||||
message.class_List.firstOrNull { classProto ->
|
||||
|
||||
+4
-4
@@ -70,9 +70,9 @@ class NotFoundClasses(private val storageManager: StorageManager, private val mo
|
||||
throw UnsupportedOperationException("Unresolved local class: $classId")
|
||||
}
|
||||
|
||||
val container =
|
||||
if (classId.isNestedClass) getOrCreateClass(classId.outerClassId, typeParametersCount.drop(1))
|
||||
else packageFragments(classId.packageFqName)
|
||||
val container = classId.outerClassId?.let { outerClassId ->
|
||||
getOrCreateClass(outerClassId, typeParametersCount.drop(1))
|
||||
} ?: packageFragments(classId.packageFqName)
|
||||
|
||||
// Treat a class with a nested ClassId as inner for simplicity, otherwise the outer type cannot have generic arguments
|
||||
val isInner = classId.isNestedClass
|
||||
@@ -182,7 +182,7 @@ private fun createTypeParameters(
|
||||
|
||||
private fun computeTypeParametersCount(classId: ClassId, proto: ProtoBuf.Type, typeTable: TypeTable): List<Int> {
|
||||
val typeParametersCount = generateSequence(proto) { it.outerType(typeTable) }.map { it.argumentCount }.toMutableList()
|
||||
val classNestingLevel = generateSequence(classId) { if (it.isNestedClass) it.outerClassId else null }.count()
|
||||
val classNestingLevel = generateSequence(classId, ClassId::getOuterClassId).count()
|
||||
while (typeParametersCount.size < classNestingLevel) {
|
||||
typeParametersCount.add(0)
|
||||
}
|
||||
|
||||
+1
-2
@@ -40,7 +40,7 @@ fun ModuleDescriptor.findNonGenericClassAcrossDependencies(classId: ClassId, not
|
||||
if (existingClass != null) return existingClass
|
||||
|
||||
// Take a list of N zeros, where N is the number of class names in the given ClassId
|
||||
val typeParametersCount = generateSequence(classId) { if (it.isNestedClass) it.outerClassId else null }.map { 0 }.toList()
|
||||
val typeParametersCount = generateSequence(classId, ClassId::getOuterClassId).map { 0 }.toList()
|
||||
|
||||
return notFoundClasses.getClass(classId, typeParametersCount).declarationDescriptor as ClassDescriptor
|
||||
}
|
||||
@@ -62,4 +62,3 @@ fun ModuleDescriptor.findTypeAliasAcrossModuleDependencies(classId: ClassId): Ty
|
||||
val lastName = segments[lastNameIndex]
|
||||
return currentClass.unsubstitutedMemberScope.getContributedClassifier(lastName, NoLookupLocation.FROM_DESERIALIZATION) as? TypeAliasDescriptor
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user