From 6bac016b3a7991701787e4a40d1269bcb782b4cb Mon Sep 17 00:00:00 2001 From: Dmitriy Dolovov Date: Thu, 20 May 2021 14:37:17 +0300 Subject: [PATCH] [IR] Support top-level callables in InventNamesForLocalClasses lowering ^KT-45304 --- .../backend/common/lower/InventNamesForLocalClasses.kt | 9 +++++++-- .../backend/jvm/lower/JvmInventNamesForLocalClasses.kt | 2 +- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InventNamesForLocalClasses.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InventNamesForLocalClasses.kt index 968ffe5ebba..20554ada39a 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InventNamesForLocalClasses.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/lower/InventNamesForLocalClasses.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.NameUtils -abstract class InventNamesForLocalClasses() : FileLoweringPass { +abstract class InventNamesForLocalClasses(private val allowTopLevelCallables: Boolean) : FileLoweringPass { protected abstract fun computeTopLevelClassName(clazz: IrClass): String protected abstract fun sanitizeNameIfNeeded(name: String): String @@ -146,7 +146,12 @@ abstract class InventNamesForLocalClasses() : FileLoweringPass { } if (declaration.isSuspend && declaration.body != null && declaration.origin != IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA) { // Suspend functions have a continuation, which is essentially a local class - val newData = data.copy(enclosingName = inventName(declaration.name, data)) + val newData = data.copy( + enclosingName = inventName( + declaration.name, + if (data.enclosingName == null && allowTopLevelCallables) data.copy(enclosingName = "") else data + ) + ) val internalName = inventName(null, newData) putLocalClassName(declaration, internalName) } diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInventNamesForLocalClasses.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInventNamesForLocalClasses.kt index 0b26473c02c..d6fe09d11b4 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInventNamesForLocalClasses.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/JvmInventNamesForLocalClasses.kt @@ -22,7 +22,7 @@ val inventNamesForLocalClassesPhase = makeIrFilePhase( prerequisite = setOf(mainMethodGenerationPhase) ) -class JvmInventNamesForLocalClasses(private val context: JvmBackendContext) : InventNamesForLocalClasses() { +class JvmInventNamesForLocalClasses(private val context: JvmBackendContext) : InventNamesForLocalClasses(allowTopLevelCallables = false) { override fun computeTopLevelClassName(clazz: IrClass): String { val file = clazz.parent as? IrFile ?: throw AssertionError("Top-level class expected: ${clazz.render()}")