From 29fab6c3ebe444e850988a9ef37f2dfc0fe44d68 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 23 Aug 2023 12:26:18 +0200 Subject: [PATCH] IR: optimize IrDeclarationWithName.fqNameWhenAvailable Do not construct lots of FqName objects, since doing so takes ~1% of JVM backend time. --- .../org/jetbrains/kotlin/ir/util/IrUtils.kt | 24 +++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt index ca175c6084a..c034c16aaa9 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/IrUtils.kt @@ -316,13 +316,29 @@ val IrClass.isClass get() = kind == ClassKind.CLASS val IrClass.isObject get() = kind == ClassKind.OBJECT val IrClass.isAnonymousObject get() = isClass && name == SpecialNames.NO_NAME_PROVIDED val IrClass.isNonCompanionObject: Boolean get() = isObject && !isCompanion + val IrDeclarationWithName.fqNameWhenAvailable: FqName? - get() = when (val parent = parent) { - is IrDeclarationWithName -> parent.fqNameWhenAvailable?.child(name) - is IrPackageFragment -> parent.packageFqName.child(name) - else -> null + get() { + val sb = StringBuilder() + return if (computeFqNameString(this, sb)) FqName(sb.toString()) else null } +private fun computeFqNameString(declaration: IrDeclarationWithName, result: StringBuilder): Boolean { + when (val parent = declaration.parent) { + is IrDeclarationWithName -> { + if (!computeFqNameString(parent, result)) return false + } + is IrPackageFragment -> { + val packageFqName = parent.packageFqName + if (!packageFqName.isRoot) result.append(packageFqName) + } + else -> return false + } + if (result.isNotEmpty()) result.append('.') + result.append(declaration.name.asString()) + return true +} + val IrDeclaration.parentAsClass: IrClass get() = parent as? IrClass ?: error("Parent of this declaration is not a class: ${render()}")