[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.Name
import org.jetbrains.kotlin.name.NameUtils 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 computeTopLevelClassName(clazz: IrClass): String
protected abstract fun sanitizeNameIfNeeded(name: String): 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) { if (declaration.isSuspend && declaration.body != null && declaration.origin != IrDeclarationOrigin.LOCAL_FUNCTION_FOR_LAMBDA) {
// Suspend functions have a continuation, which is essentially a local class // 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) val internalName = inventName(null, newData)
putLocalClassName(declaration, internalName) putLocalClassName(declaration, internalName)
} }
@@ -22,7 +22,7 @@ val inventNamesForLocalClassesPhase = makeIrFilePhase(
prerequisite = setOf(mainMethodGenerationPhase) 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 { override fun computeTopLevelClassName(clazz: IrClass): String {
val file = clazz.parent as? IrFile val file = clazz.parent as? IrFile
?: throw AssertionError("Top-level class expected: ${clazz.render()}") ?: throw AssertionError("Top-level class expected: ${clazz.render()}")