Skip to content

Commit 86994f8

Browse files
committed
Refactor ClassId.getOuterClassId, make it nullable
1 parent 21de67c commit 86994f8

File tree

6 files changed

+17
-14
lines changed

6 files changed

+17
-14
lines changed

core/descriptors/src/org/jetbrains/kotlin/name/ClassId.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package org.jetbrains.kotlin.name;
1818

1919
import org.jetbrains.annotations.NotNull;
20+
import org.jetbrains.annotations.Nullable;
2021

2122
/**
2223
* A class name which is used to uniquely identify a Kotlin class.
@@ -73,9 +74,10 @@ public ClassId createNestedClassId(@NotNull Name name) {
7374
return new ClassId(getPackageFqName(), relativeClassName.child(name), local);
7475
}
7576

76-
@NotNull
77+
@Nullable
7778
public ClassId getOuterClassId() {
78-
return new ClassId(getPackageFqName(), relativeClassName.parent(), local);
79+
FqName parent = relativeClassName.parent();
80+
return parent.isRoot() ? null : new ClassId(getPackageFqName(), parent, local);
7981
}
8082

8183
public boolean isNestedClass() {

core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/ClassDeserializer.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,9 @@ class ClassDeserializer(private val components: DeserializationComponents) {
4444
?: return null
4545
val (nameResolver, classProto) = classData
4646

47-
val outerContext = if (classId.isNestedClass) {
48-
val outerClass = deserializeClass(classId.outerClassId) as? DeserializedClassDescriptor ?: return null
47+
val outerClassId = classId.outerClassId
48+
val outerContext = if (outerClassId != null) {
49+
val outerClass = deserializeClass(outerClassId) as? DeserializedClassDescriptor ?: return null
4950

5051
// Find the outer class first and check if he knows anything about the nested class we're looking for
5152
if (!outerClass.hasNestedClass(classId.shortClassName)) return null

core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/MetadataPackageFragmentProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ class MetadataPackageFragment(
7373
private val finder: KotlinMetadataFinder
7474
) : DeserializedPackageFragment(fqName, storageManager, module) {
7575
override val classDataFinder = ClassDataFinder { classId ->
76-
val topLevelClassId = generateSequence(classId) { classId -> if (classId.isNestedClass) classId.outerClassId else null }.last()
76+
val topLevelClassId = generateSequence(classId, ClassId::getOuterClassId).last()
7777
val stream = finder.findMetadata(topLevelClassId) ?: return@ClassDataFinder null
7878
val (message, nameResolver) = readProto(stream)
7979
message.class_List.firstOrNull { classProto ->

core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/NotFoundClasses.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,9 +70,9 @@ class NotFoundClasses(private val storageManager: StorageManager, private val mo
7070
throw UnsupportedOperationException("Unresolved local class: $classId")
7171
}
7272

73-
val container =
74-
if (classId.isNestedClass) getOrCreateClass(classId.outerClassId, typeParametersCount.drop(1))
75-
else packageFragments(classId.packageFqName)
73+
val container = classId.outerClassId?.let { outerClassId ->
74+
getOrCreateClass(outerClassId, typeParametersCount.drop(1))
75+
} ?: packageFragments(classId.packageFqName)
7676

7777
// Treat a class with a nested ClassId as inner for simplicity, otherwise the outer type cannot have generic arguments
7878
val isInner = classId.isNestedClass
@@ -182,7 +182,7 @@ private fun createTypeParameters(
182182

183183
private fun computeTypeParametersCount(classId: ClassId, proto: ProtoBuf.Type, typeTable: TypeTable): List<Int> {
184184
val typeParametersCount = generateSequence(proto) { it.outerType(typeTable) }.map { it.argumentCount }.toMutableList()
185-
val classNestingLevel = generateSequence(classId) { if (it.isNestedClass) it.outerClassId else null }.count()
185+
val classNestingLevel = generateSequence(classId, ClassId::getOuterClassId).count()
186186
while (typeParametersCount.size < classNestingLevel) {
187187
typeParametersCount.add(0)
188188
}

core/deserialization/src/org/jetbrains/kotlin/serialization/deserialization/findClassInModule.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ fun ModuleDescriptor.findNonGenericClassAcrossDependencies(classId: ClassId, not
4040
if (existingClass != null) return existingClass
4141

4242
// Take a list of N zeros, where N is the number of class names in the given ClassId
43-
val typeParametersCount = generateSequence(classId) { if (it.isNestedClass) it.outerClassId else null }.map { 0 }.toList()
43+
val typeParametersCount = generateSequence(classId, ClassId::getOuterClassId).map { 0 }.toList()
4444

4545
return notFoundClasses.getClass(classId, typeParametersCount).declarationDescriptor as ClassDescriptor
4646
}
@@ -62,4 +62,3 @@ fun ModuleDescriptor.findTypeAliasAcrossModuleDependencies(classId: ClassId): Ty
6262
val lastName = segments[lastNameIndex]
6363
return currentClass.unsubstitutedMemberScope.getContributedClassifier(lastName, NoLookupLocation.FROM_DESERIALIZATION) as? TypeAliasDescriptor
6464
}
65-

idea/idea-analysis/src/org/jetbrains/kotlin/idea/decompiler/stubBuilder/ClassClsStubBuilder.kt

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,10 @@ private class ClassClsStubBuilder(
253253
"Root file: ${rootFile.canonicalPath}\n" +
254254
"Dir: ${rootFile.parent.canonicalPath}\n" +
255255
"Children:\n" +
256-
"${rootFile.parent.children.sortedBy { it.name }.joinToString(separator = "\n") {
257-
it.name + " (valid: ${it.isValid})"
258-
} }")
256+
rootFile.parent.children.sortedBy { it.name }.joinToString(separator = "\n") {
257+
"${it.name} (valid: ${it.isValid})"
258+
}
259+
)
259260
return
260261
}
261262
val (nameResolver, classProto) = classDataWithSource.classData

0 commit comments

Comments
 (0)