[FIR] Correctly process slash in class name in ClassId

^KTIJ-27358 fixed


Merge-request: KT-MR-12673
Merged-by: Egor Kulikov <Egor.Kulikov@jetbrains.com>
This commit is contained in:
Egor Kulikov
2023-11-07 09:47:05 +00:00
committed by Space Team
parent 1173cc46e2
commit 408e2f109f
6 changed files with 77 additions and 7 deletions
@@ -75,13 +75,21 @@ data class ClassId(val packageFqName: FqName, val relativeClassName: FqName, val
* @return a string where packages are delimited by '/' and classes by '.', e.g. "kotlin/Map.Entry"
*/
fun asString(): String {
fun FqName.escapeSlashes(): String {
val res = asString()
if (res.contains('/')) {
return "`$res`"
}
return res
}
return if (packageFqName.isRoot) {
relativeClassName.asString()
relativeClassName.escapeSlashes()
} else {
buildString {
append(packageFqName.asString().replace('.', '/'))
append("/")
append(relativeClassName.asString())
append(relativeClassName.escapeSlashes())
}
}
}
@@ -109,20 +117,22 @@ data class ClassId(val packageFqName: FqName, val relativeClassName: FqName, val
}
/**
* @param string a string where packages are delimited by '/' and classes by '.', e.g. "kotlin/Map.Entry"
* @param string a string where packages are delimited by '/' and classes by '.', e.g. "kotlin/Map.Entry".
* If class name contains slashes, it should be put into ticks, e.g. "package/`test/test`"
*/
@JvmOverloads
@JvmStatic
fun fromString(string: String, isLocal: Boolean = false): ClassId {
val lastSlashIndex = string.lastIndexOf("/")
val tickIndex = string.indexOf('`')
val lastSlashIndex = string.lastIndexOf("/", if (tickIndex == -1) string.length else tickIndex)
val packageName: String
val className: String
if (lastSlashIndex == -1) {
packageName = ""
className = string
className = string.replace("`", "")
} else {
packageName = string.substring(0, lastSlashIndex).replace('/', '.')
className = string.substring(lastSlashIndex + 1)
className = string.substring(lastSlashIndex + 1).replace("`", "")
}
return ClassId(FqName(packageName), FqName(className), isLocal)
}