[K/N][IR] Moved local declarations names invention down the pipeline

This commit is contained in:
Igor Chevdar
2023-09-04 17:36:42 +03:00
parent ac760cbbfb
commit b66a6fcc08
3 changed files with 53 additions and 50 deletions
@@ -133,7 +133,7 @@ private val extractLocalClassesFromInlineBodies = createFileLoweringPhase(
}, },
name = "ExtractLocalClassesFromInlineBodies", name = "ExtractLocalClassesFromInlineBodies",
description = "Extraction of local classes from inline bodies", description = "Extraction of local classes from inline bodies",
prerequisite = setOf(sharedVariablesPhase), // TODO: add "soft" dependency on inventNamesForLocalClasses prerequisite = setOf(sharedVariablesPhase),
) )
private val wrapInlineDeclarationsWithReifiedTypeParametersLowering = createFileLoweringPhase( private val wrapInlineDeclarationsWithReifiedTypeParametersLowering = createFileLoweringPhase(
@@ -509,7 +509,6 @@ private fun PhaseEngine<NativeGenerationState>.getAllLowerings() = listOfNotNull
lateinitPhase, lateinitPhase,
sharedVariablesPhase, sharedVariablesPhase,
lowerOuterThisInInlineFunctionsPhase, lowerOuterThisInInlineFunctionsPhase,
inventNamesForLocalClasses,
extractLocalClassesFromInlineBodies, extractLocalClassesFromInlineBodies,
wrapInlineDeclarationsWithReifiedTypeParametersLowering, wrapInlineDeclarationsWithReifiedTypeParametersLowering,
inlinePhase, inlinePhase,
@@ -528,6 +527,7 @@ private fun PhaseEngine<NativeGenerationState>.getAllLowerings() = listOfNotNull
stringConcatenationTypeNarrowingPhase.takeIf { context.config.optimizationsEnabled }, stringConcatenationTypeNarrowingPhase.takeIf { context.config.optimizationsEnabled },
enumConstructorsPhase, enumConstructorsPhase,
initializersPhase, initializersPhase,
inventNamesForLocalClasses,
localFunctionsPhase, localFunctionsPhase,
volatilePhase, volatilePhase,
tailrecPhase, tailrecPhase,
@@ -12,7 +12,10 @@ import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer
import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrClass
// TODO: consider replacing '$' by another delimeter that can't be used in class name specified with backticks (``) // TODO: consider replacing '$' by another delimeter that can't be used in class name specified with backticks (``)
internal class NativeInventNamesForLocalClasses(val generationState: NativeGenerationState) : InventNamesForLocalClasses(allowTopLevelCallables = true) { internal class NativeInventNamesForLocalClasses(val generationState: NativeGenerationState) : InventNamesForLocalClasses(
allowTopLevelCallables = true,
generateNamesForRegeneratedObjects = true
) {
override fun computeTopLevelClassName(clazz: IrClass): String = clazz.name.asString() override fun computeTopLevelClassName(clazz: IrClass): String = clazz.name.asString()
override fun sanitizeNameIfNeeded(name: String) = name override fun sanitizeNameIfNeeded(name: String) = name
@@ -147,7 +147,7 @@ private fun checkLocalClasses(args: Array<String>) {
clazz = Local::class, clazz = Local::class,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = "Local", expectedSimpleName = "Local",
expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$3\$Local", expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$Local",
expectedInstance = Local(), expectedInstance = Local(),
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -155,7 +155,7 @@ private fun checkLocalClasses(args: Array<String>) {
clazz = Local.Inner::class, clazz = Local.Inner::class,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = "Inner", expectedSimpleName = "Inner",
expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$3\$Local\$Inner", expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$Local\$Inner",
expectedInstance = Local().Inner(), expectedInstance = Local().Inner(),
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -171,7 +171,7 @@ private fun checkLocalClasses(args: Array<String>) {
clazz = Local::class, clazz = Local::class,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = "Local", expectedSimpleName = "Local",
expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$4\$Local", expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$3\$Local",
expectedInstance = Local(), expectedInstance = Local(),
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -179,7 +179,7 @@ private fun checkLocalClasses(args: Array<String>) {
clazz = Local.Inner::class, clazz = Local.Inner::class,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = "Inner", expectedSimpleName = "Inner",
expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$4\$Local\$Inner", expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$3\$Local\$Inner",
expectedInstance = Local().Inner(), expectedInstance = Local().Inner(),
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -249,7 +249,7 @@ private fun checkAnonymousObjects(args: Array<String>) {
clazz = this::class, clazz = this::class,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = null, expectedSimpleName = null,
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$3\$1", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$2\$1",
expectedInstance = this, expectedInstance = this,
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -257,7 +257,7 @@ private fun checkAnonymousObjects(args: Array<String>) {
clazz = this.innerKClass, clazz = this.innerKClass,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = "Inner", expectedSimpleName = "Inner",
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$3\$1\$Inner", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$2\$1\$Inner",
expectedInstance = this.Inner(), expectedInstance = this.Inner(),
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -275,7 +275,7 @@ private fun checkAnonymousObjects(args: Array<String>) {
clazz = this::class, clazz = this::class,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = null, expectedSimpleName = null,
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$4\$1", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$3\$1",
expectedInstance = this, expectedInstance = this,
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -283,7 +283,7 @@ private fun checkAnonymousObjects(args: Array<String>) {
clazz = this.innerKClass, clazz = this.innerKClass,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = "Inner", expectedSimpleName = "Inner",
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$4\$1\$Inner", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$3\$1\$Inner",
expectedInstance = this.Inner(), expectedInstance = this.Inner(),
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -292,6 +292,32 @@ private fun checkAnonymousObjects(args: Array<String>) {
// Anonymous object inside of inlined lambda. // Anonymous object inside of inlined lambda.
run { run {
with(object : Any() {
val captured = args
inner class Inner
val innerKClass = Inner::class
}) {
checkClass(
clazz = this::class,
expectedQualifiedName = null,
expectedSimpleName = null,
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$4",
expectedInstance = this,
expectedNotInstance = Any()
)
checkClass(
clazz = this.innerKClass,
expectedQualifiedName = null,
expectedSimpleName = "Inner",
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$4\$Inner",
expectedInstance = this.Inner(),
expectedNotInstance = Any()
)
}
}
// Anonymous object inside of suspend lambda.
suspend {
with(object : Any() { with(object : Any() {
val captured = args val captured = args
inner class Inner inner class Inner
@@ -314,32 +340,6 @@ private fun checkAnonymousObjects(args: Array<String>) {
expectedNotInstance = Any() expectedNotInstance = Any()
) )
} }
}
// Anonymous object inside of suspend lambda.
suspend {
with(object : Any() {
val captured = args
inner class Inner
val innerKClass = Inner::class
}) {
checkClass(
clazz = this::class,
expectedQualifiedName = null,
expectedSimpleName = null,
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$6\$1",
expectedInstance = this,
expectedNotInstance = Any()
)
checkClass(
clazz = this.innerKClass,
expectedQualifiedName = null,
expectedSimpleName = "Inner",
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$6\$1\$Inner",
expectedInstance = this.Inner(),
expectedNotInstance = Any()
)
}
}.runCoroutine() }.runCoroutine()
// Anonymous object inside of suspend function. // Anonymous object inside of suspend function.
@@ -383,7 +383,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array<String>) {
clazz = obj::class, clazz = obj::class,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = null, expectedSimpleName = null,
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$obj\$1", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$1",
expectedInstance = obj, expectedInstance = obj,
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -391,7 +391,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array<String>) {
clazz = obj.innerKClass, clazz = obj.innerKClass,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = "Inner", expectedSimpleName = "Inner",
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$obj\$1\$Inner", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$1\$Inner",
expectedInstance = obj.Inner(), expectedInstance = obj.Inner(),
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -407,7 +407,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array<String>) {
clazz = obj::class, clazz = obj::class,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = null, expectedSimpleName = null,
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$1\$obj\$1", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$2\$1",
expectedInstance = obj, expectedInstance = obj,
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -415,7 +415,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array<String>) {
clazz = obj.innerKClass, clazz = obj.innerKClass,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = "Inner", expectedSimpleName = "Inner",
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$1\$obj\$1\$Inner", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$2\$1\$Inner",
expectedInstance = obj.Inner(), expectedInstance = obj.Inner(),
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -432,7 +432,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array<String>) {
clazz = obj::class, clazz = obj::class,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = null, expectedSimpleName = null,
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$2\$obj\$1", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$3\$1",
expectedInstance = obj, expectedInstance = obj,
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -440,7 +440,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array<String>) {
clazz = obj.innerKClass, clazz = obj.innerKClass,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = "Inner", expectedSimpleName = "Inner",
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$2\$obj\$1\$Inner", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$3\$1\$Inner",
expectedInstance = obj.Inner(), expectedInstance = obj.Inner(),
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -457,7 +457,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array<String>) {
clazz = obj::class, clazz = obj::class,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = null, expectedSimpleName = null,
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$3\$obj\$1", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$4",
expectedInstance = obj, expectedInstance = obj,
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -465,7 +465,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array<String>) {
clazz = obj.innerKClass, clazz = obj.innerKClass,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = "Inner", expectedSimpleName = "Inner",
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$3\$obj\$1\$Inner", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$4\$Inner",
expectedInstance = obj.Inner(), expectedInstance = obj.Inner(),
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -482,7 +482,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array<String>) {
clazz = obj::class, clazz = obj::class,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = null, expectedSimpleName = null,
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$4\$obj\$1", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$5\$1",
expectedInstance = obj, expectedInstance = obj,
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -490,7 +490,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array<String>) {
clazz = obj.innerKClass, clazz = obj.innerKClass,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = "Inner", expectedSimpleName = "Inner",
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$4\$obj\$1\$Inner", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$5\$1\$Inner",
expectedInstance = obj.Inner(), expectedInstance = obj.Inner(),
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -509,7 +509,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array<String>) {
clazz = obj::class, clazz = obj::class,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = null, expectedSimpleName = null,
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$suspendFunWithAnonymousObject\$obj\$1", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$suspendFunWithAnonymousObject\$2",
expectedInstance = obj, expectedInstance = obj,
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -517,7 +517,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array<String>) {
clazz = obj.innerKClass, clazz = obj.innerKClass,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = "Inner", expectedSimpleName = "Inner",
expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$suspendFunWithAnonymousObject\$obj\$1\$Inner", expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$suspendFunWithAnonymousObject\$2\$Inner",
expectedInstance = obj.Inner(), expectedInstance = obj.Inner(),
expectedNotInstance = Any() expectedNotInstance = Any()
) )
@@ -533,7 +533,7 @@ private fun checkFunctionReferences() {
clazz = ref::class, clazz = ref::class,
expectedQualifiedName = null, expectedQualifiedName = null,
expectedSimpleName = null, expectedSimpleName = null,
expectedToStringName = "class codegen.kclass.kclass0.checkFunctionReferences\$ref\$1", expectedToStringName = "class codegen.kclass.kclass0.checkFunctionReferences\$1",
expectedInstance = ref, expectedInstance = ref,
expectedNotInstance = Any() expectedNotInstance = Any()
) )