[FE] Cleanup implementation of ClassId
This commit is contained in:
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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user