[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.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)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -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()}")
|
||||||
|
|||||||
Reference in New Issue
Block a user