[IR] Support top-level callables in InventNamesForLocalClasses lowering
^KT-45304
This commit is contained in:
+7
-2
@@ -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)
|
||||
}
|
||||
|
||||
+1
-1
@@ -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()}")
|
||||
|
||||
Reference in New Issue
Block a user