From b66a6fcc08b8418abf0761e86b993904fa128904 Mon Sep 17 00:00:00 2001 From: Igor Chevdar Date: Mon, 4 Sep 2023 17:36:42 +0300 Subject: [PATCH] [K/N][IR] Moved local declarations names invention down the pipeline --- .../driver/phases/NativeLoweringPhases.kt | 4 +- .../lower/NativeInventNamesForLocalClasses.kt | 5 +- .../tests/codegen/kclass/kclass0.kt | 94 +++++++++---------- 3 files changed, 53 insertions(+), 50 deletions(-) diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt index 609fea44bc2..30f1fe6aeab 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/driver/phases/NativeLoweringPhases.kt @@ -133,7 +133,7 @@ private val extractLocalClassesFromInlineBodies = createFileLoweringPhase( }, name = "ExtractLocalClassesFromInlineBodies", description = "Extraction of local classes from inline bodies", - prerequisite = setOf(sharedVariablesPhase), // TODO: add "soft" dependency on inventNamesForLocalClasses + prerequisite = setOf(sharedVariablesPhase), ) private val wrapInlineDeclarationsWithReifiedTypeParametersLowering = createFileLoweringPhase( @@ -509,7 +509,6 @@ private fun PhaseEngine.getAllLowerings() = listOfNotNull lateinitPhase, sharedVariablesPhase, lowerOuterThisInInlineFunctionsPhase, - inventNamesForLocalClasses, extractLocalClassesFromInlineBodies, wrapInlineDeclarationsWithReifiedTypeParametersLowering, inlinePhase, @@ -528,6 +527,7 @@ private fun PhaseEngine.getAllLowerings() = listOfNotNull stringConcatenationTypeNarrowingPhase.takeIf { context.config.optimizationsEnabled }, enumConstructorsPhase, initializersPhase, + inventNamesForLocalClasses, localFunctionsPhase, volatilePhase, tailrecPhase, diff --git a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInventNamesForLocalClasses.kt b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInventNamesForLocalClasses.kt index b631d0a6421..9263d6cf593 100644 --- a/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInventNamesForLocalClasses.kt +++ b/kotlin-native/backend.native/compiler/ir/backend.native/src/org/jetbrains/kotlin/backend/konan/lower/NativeInventNamesForLocalClasses.kt @@ -12,7 +12,10 @@ import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer import org.jetbrains.kotlin.ir.declarations.IrClass // 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 sanitizeNameIfNeeded(name: String) = name diff --git a/kotlin-native/backend.native/tests/codegen/kclass/kclass0.kt b/kotlin-native/backend.native/tests/codegen/kclass/kclass0.kt index a39277a1f67..f1ffc3ab70a 100644 --- a/kotlin-native/backend.native/tests/codegen/kclass/kclass0.kt +++ b/kotlin-native/backend.native/tests/codegen/kclass/kclass0.kt @@ -147,7 +147,7 @@ private fun checkLocalClasses(args: Array) { clazz = Local::class, expectedQualifiedName = null, expectedSimpleName = "Local", - expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$3\$Local", + expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$Local", expectedInstance = Local(), expectedNotInstance = Any() ) @@ -155,7 +155,7 @@ private fun checkLocalClasses(args: Array) { clazz = Local.Inner::class, expectedQualifiedName = null, expectedSimpleName = "Inner", - expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$3\$Local\$Inner", + expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$Local\$Inner", expectedInstance = Local().Inner(), expectedNotInstance = Any() ) @@ -171,7 +171,7 @@ private fun checkLocalClasses(args: Array) { clazz = Local::class, expectedQualifiedName = null, expectedSimpleName = "Local", - expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$4\$Local", + expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$3\$Local", expectedInstance = Local(), expectedNotInstance = Any() ) @@ -179,7 +179,7 @@ private fun checkLocalClasses(args: Array) { clazz = Local.Inner::class, expectedQualifiedName = null, expectedSimpleName = "Inner", - expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$4\$Local\$Inner", + expectedToStringName = "class codegen.kclass.kclass0.checkLocalClasses\$3\$Local\$Inner", expectedInstance = Local().Inner(), expectedNotInstance = Any() ) @@ -249,7 +249,7 @@ private fun checkAnonymousObjects(args: Array) { clazz = this::class, expectedQualifiedName = null, expectedSimpleName = null, - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$3\$1", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$2\$1", expectedInstance = this, expectedNotInstance = Any() ) @@ -257,7 +257,7 @@ private fun checkAnonymousObjects(args: Array) { clazz = this.innerKClass, expectedQualifiedName = null, expectedSimpleName = "Inner", - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$3\$1\$Inner", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$2\$1\$Inner", expectedInstance = this.Inner(), expectedNotInstance = Any() ) @@ -275,7 +275,7 @@ private fun checkAnonymousObjects(args: Array) { clazz = this::class, expectedQualifiedName = null, expectedSimpleName = null, - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$4\$1", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$3\$1", expectedInstance = this, expectedNotInstance = Any() ) @@ -283,7 +283,7 @@ private fun checkAnonymousObjects(args: Array) { clazz = this.innerKClass, expectedQualifiedName = null, expectedSimpleName = "Inner", - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$4\$1\$Inner", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjects\$3\$1\$Inner", expectedInstance = this.Inner(), expectedNotInstance = Any() ) @@ -292,6 +292,32 @@ private fun checkAnonymousObjects(args: Array) { // Anonymous object inside of inlined lambda. 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() { val captured = args inner class Inner @@ -314,32 +340,6 @@ private fun checkAnonymousObjects(args: Array) { 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() // Anonymous object inside of suspend function. @@ -383,7 +383,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array) { clazz = obj::class, expectedQualifiedName = null, expectedSimpleName = null, - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$obj\$1", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$1", expectedInstance = obj, expectedNotInstance = Any() ) @@ -391,7 +391,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array) { clazz = obj.innerKClass, expectedQualifiedName = null, expectedSimpleName = "Inner", - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$obj\$1\$Inner", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$1\$Inner", expectedInstance = obj.Inner(), expectedNotInstance = Any() ) @@ -407,7 +407,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array) { clazz = obj::class, expectedQualifiedName = null, expectedSimpleName = null, - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$1\$obj\$1", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$2\$1", expectedInstance = obj, expectedNotInstance = Any() ) @@ -415,7 +415,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array) { clazz = obj.innerKClass, expectedQualifiedName = null, expectedSimpleName = "Inner", - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$1\$obj\$1\$Inner", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$2\$1\$Inner", expectedInstance = obj.Inner(), expectedNotInstance = Any() ) @@ -432,7 +432,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array) { clazz = obj::class, expectedQualifiedName = null, expectedSimpleName = null, - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$2\$obj\$1", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$3\$1", expectedInstance = obj, expectedNotInstance = Any() ) @@ -440,7 +440,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array) { clazz = obj.innerKClass, expectedQualifiedName = null, expectedSimpleName = "Inner", - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$2\$obj\$1\$Inner", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$3\$1\$Inner", expectedInstance = obj.Inner(), expectedNotInstance = Any() ) @@ -457,7 +457,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array) { clazz = obj::class, expectedQualifiedName = null, expectedSimpleName = null, - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$3\$obj\$1", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$4", expectedInstance = obj, expectedNotInstance = Any() ) @@ -465,7 +465,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array) { clazz = obj.innerKClass, expectedQualifiedName = null, expectedSimpleName = "Inner", - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$3\$obj\$1\$Inner", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$4\$Inner", expectedInstance = obj.Inner(), expectedNotInstance = Any() ) @@ -482,7 +482,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array) { clazz = obj::class, expectedQualifiedName = null, expectedSimpleName = null, - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$4\$obj\$1", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$5\$1", expectedInstance = obj, expectedNotInstance = Any() ) @@ -490,7 +490,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array) { clazz = obj.innerKClass, expectedQualifiedName = null, expectedSimpleName = "Inner", - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$4\$obj\$1\$Inner", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$5\$1\$Inner", expectedInstance = obj.Inner(), expectedNotInstance = Any() ) @@ -509,7 +509,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array) { clazz = obj::class, expectedQualifiedName = null, expectedSimpleName = null, - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$suspendFunWithAnonymousObject\$obj\$1", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$suspendFunWithAnonymousObject\$2", expectedInstance = obj, expectedNotInstance = Any() ) @@ -517,7 +517,7 @@ private fun checkAnonymousObjectsAssignedToProperty(args: Array) { clazz = obj.innerKClass, expectedQualifiedName = null, expectedSimpleName = "Inner", - expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$suspendFunWithAnonymousObject\$obj\$1\$Inner", + expectedToStringName = "class codegen.kclass.kclass0.checkAnonymousObjectsAssignedToProperty\$suspendFunWithAnonymousObject\$2\$Inner", expectedInstance = obj.Inner(), expectedNotInstance = Any() ) @@ -533,7 +533,7 @@ private fun checkFunctionReferences() { clazz = ref::class, expectedQualifiedName = null, expectedSimpleName = null, - expectedToStringName = "class codegen.kclass.kclass0.checkFunctionReferences\$ref\$1", + expectedToStringName = "class codegen.kclass.kclass0.checkFunctionReferences\$1", expectedInstance = ref, expectedNotInstance = Any() )