From 47a4ee7fdfcfca386a9813b923fcbb3dd022ec66 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 5 Mar 2024 00:07:55 +0100 Subject: [PATCH] IR, JS: remove duplicate FQ name check from hasEqualFqName `hasEqualFqName` is called from `hasAnnotation`, which takes more than 1% of total backend time, so it's important to avoid doing extra work here. It seems to be a quirk of the JS IR backend specifically that `JsExport.Ignore` has incorrect IR parent structure here; for all other backends, checking FQ name by traversing IR parents should work fine. #KT-66281 --- .../jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt | 6 +++++- .../src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt index 15d8591a068..8e2abc36208 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt @@ -71,7 +71,11 @@ fun IrAnnotationContainer.couldBeConvertedToExplicitExport(): Boolean? = getAnnotation(JsAnnotations.jsImplicitExportFqn)?.getSingleConstBooleanArgument() fun IrAnnotationContainer.isJsExportIgnore(): Boolean = - hasAnnotation(JsAnnotations.jsExportIgnoreFqn) + annotations.any { + // Using `IrSymbol.hasEqualFqName(FqName)` instead of a usual `hasAnnotation` call, because `JsExport.Ignore` is a nested class, + // whose FQ name cannot be computed by traversing IR tree parents because it lacks `JsExport` for some reason. + it.symbol.owner.parentAsClass.symbol.hasEqualFqName(JsAnnotations.jsExportIgnoreFqn) + } fun IrAnnotationContainer.isJsNativeGetter(): Boolean = hasAnnotation(JsAnnotations.jsNativeGetter) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt index abc651f98f4..f5b725198fd 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/AdditionalIrUtils.kt @@ -140,7 +140,7 @@ val IrClass.packageFqName: FqName? get() = symbol.signature?.packageFqName() ?: parent.getPackageFragment()?.packageFqName fun IrDeclarationWithName.hasEqualFqName(fqName: FqName): Boolean = - symbol.hasEqualFqName(fqName) || name == fqName.shortName() && when (val parent = parent) { + name == fqName.shortName() && when (val parent = parent) { is IrPackageFragment -> parent.packageFqName == fqName.parent() is IrDeclarationWithName -> parent.hasEqualFqName(fqName.parent()) else -> false