[FE] Cleanup implementation of ClassId

This commit is contained in:
Dmitriy Novozhilov
2023-09-19 12:42:47 +03:00
committed by Space Team
parent a43cb721ba
commit adaf8ae46a
@@ -15,6 +15,8 @@
*/ */
package org.jetbrains.kotlin.name package org.jetbrains.kotlin.name
import org.jetbrains.kotlin.utils.addToStdlib.runIf
/** /**
* A class name which is used to uniquely identify a Kotlin class. * A class name which is used to uniquely identify a Kotlin class.
* *
@@ -24,45 +26,43 @@ package org.jetbrains.kotlin.name
* the package, separated by dollar signs. If a class is an inner of local, relativeClassName would consist of two names, * the package, separated by dollar signs. If a class is an inner of local, relativeClassName would consist of two names,
* the second one being the class' short name. * the second one being the class' short name.
*/ */
class ClassId(val packageFqName: FqName, relativeClassName: FqName, local: Boolean) { class ClassId(val packageFqName: FqName, val relativeClassName: FqName, val isLocal: Boolean) {
val relativeClassName: FqName
val isLocal: Boolean
init {
assert(!relativeClassName.isRoot) { "Class name must not be root: " + packageFqName + if (local) " (local)" else "" }
this.relativeClassName = relativeClassName
isLocal = local
}
constructor(packageFqName: FqName, topLevelName: Name) : this(packageFqName, FqName.topLevel(topLevelName), false) constructor(packageFqName: FqName, topLevelName: Name) : this(packageFqName, FqName.topLevel(topLevelName), false)
init {
assert(!relativeClassName.isRoot) { "Class name must not be root: " + packageFqName + if (isLocal) " (local)" else "" }
}
val parentClassId: ClassId? val parentClassId: ClassId?
get() = if (!isNestedClass) null else ClassId( get() = runIf(isNestedClass) {
packageFqName, ClassId(packageFqName, relativeClassName.parent(), isLocal)
relativeClassName.parent(), }
isLocal
)
val shortClassName: Name val shortClassName: Name
get() = relativeClassName.shortName() get() = relativeClassName.shortName()
fun createNestedClassId(name: Name): ClassId {
return ClassId(packageFqName, relativeClassName.child(name), isLocal)
}
val outerClassId: ClassId? val outerClassId: ClassId?
get() { get() {
val parent = relativeClassName.parent() val parent = relativeClassName.parent()
return if (parent.isRoot) null else ClassId(packageFqName, parent, isLocal) return runIf(!parent.isRoot) { ClassId(packageFqName, parent, isLocal) }
} }
val outermostClassId: ClassId val outermostClassId: ClassId
get() { get() {
var name = relativeClassName var name = relativeClassName
while (!name.parent().isRoot) name = name.parent() while (!name.parent().isRoot) {
name = name.parent()
}
return ClassId(packageFqName, name, false) return ClassId(packageFqName, name, false)
} }
val isNestedClass: Boolean val isNestedClass: Boolean
get() = !relativeClassName.parent().isRoot get() = !relativeClassName.parent().isRoot
fun createNestedClassId(name: Name): ClassId {
return ClassId(packageFqName, relativeClassName.child(name), isLocal)
}
fun asSingleFqName(): FqName { fun asSingleFqName(): FqName {
return if (packageFqName.isRoot) relativeClassName else FqName(packageFqName.asString() + "." + relativeClassName.asString()) return if (packageFqName.isRoot) relativeClassName else FqName(packageFqName.asString() + "." + relativeClassName.asString())
} }
@@ -75,18 +75,33 @@ class ClassId(val packageFqName: FqName, relativeClassName: FqName, local: Boole
* @return a string where packages are delimited by '/' and classes by '.', e.g. "kotlin/Map.Entry" * @return a string where packages are delimited by '/' and classes by '.', e.g. "kotlin/Map.Entry"
*/ */
fun asString(): String { fun asString(): String {
return if (packageFqName.isRoot) relativeClassName.asString() else packageFqName.asString() return if (packageFqName.isRoot) {
.replace('.', '/') + "/" + relativeClassName.asString() relativeClassName.asString()
} else {
buildString {
append(packageFqName.asString().replace('.', '/'))
append("/")
append(relativeClassName.asString())
}
}
} }
fun asFqNameString(): String { fun asFqNameString(): String {
return if (packageFqName.isRoot) relativeClassName.asString() else packageFqName.asString() + "." + relativeClassName.asString() return if (packageFqName.isRoot) {
relativeClassName.asString()
} else {
buildString {
append(packageFqName.asString())
append(".")
append(relativeClassName.asString())
}
}
} }
override fun equals(o: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === o) return true if (this === other) return true
if (o == null || javaClass != o.javaClass) return false if (other == null || javaClass != other.javaClass) return false
val id = o as ClassId val id = other as ClassId
return packageFqName == id.packageFqName && relativeClassName == id.relativeClassName && isLocal == id.isLocal return packageFqName == id.packageFqName && relativeClassName == id.relativeClassName && isLocal == id.isLocal
} }