[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
import org.jetbrains.kotlin.utils.addToStdlib.runIf
/**
* 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 second one being the class' short name.
*/
class ClassId(val packageFqName: FqName, relativeClassName: FqName, local: 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
}
class ClassId(val packageFqName: FqName, val relativeClassName: FqName, val isLocal: Boolean) {
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?
get() = if (!isNestedClass) null else ClassId(
packageFqName,
relativeClassName.parent(),
isLocal
)
get() = runIf(isNestedClass) {
ClassId(packageFqName, relativeClassName.parent(), isLocal)
}
val shortClassName: Name
get() = relativeClassName.shortName()
fun createNestedClassId(name: Name): ClassId {
return ClassId(packageFqName, relativeClassName.child(name), isLocal)
}
val outerClassId: ClassId?
get() {
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
get() {
var name = relativeClassName
while (!name.parent().isRoot) name = name.parent()
while (!name.parent().isRoot) {
name = name.parent()
}
return ClassId(packageFqName, name, false)
}
val isNestedClass: Boolean
get() = !relativeClassName.parent().isRoot
fun createNestedClassId(name: Name): ClassId {
return ClassId(packageFqName, relativeClassName.child(name), isLocal)
}
fun asSingleFqName(): FqName {
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"
*/
fun asString(): String {
return if (packageFqName.isRoot) relativeClassName.asString() else packageFqName.asString()
.replace('.', '/') + "/" + relativeClassName.asString()
return if (packageFqName.isRoot) {
relativeClassName.asString()
} else {
buildString {
append(packageFqName.asString().replace('.', '/'))
append("/")
append(relativeClassName.asString())
}
}
}
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 {
if (this === o) return true
if (o == null || javaClass != o.javaClass) return false
val id = o as ClassId
override fun equals(other: Any?): Boolean {
if (this === other) return true
if (other == null || javaClass != other.javaClass) return false
val id = other as ClassId
return packageFqName == id.packageFqName && relativeClassName == id.relativeClassName && isLocal == id.isLocal
}