[IR] Support top-level callables in InventNamesForLocalClasses lowering

^KT-45304
This commit is contained in:
Dmitriy Dolovov
2021-05-20 14:37:17 +03:00
parent 9861cb0438
commit 6bac016b3a
2 changed files with 8 additions and 3 deletions
@@ -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)
}
@@ -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()}")