[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",
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<NativeGenerationState>.getAllLowerings() = listOfNotNull
lateinitPhase,
sharedVariablesPhase,
lowerOuterThisInInlineFunctionsPhase,
inventNamesForLocalClasses,
extractLocalClassesFromInlineBodies,
wrapInlineDeclarationsWithReifiedTypeParametersLowering,
inlinePhase,
@@ -528,6 +527,7 @@ private fun PhaseEngine<NativeGenerationState>.getAllLowerings() = listOfNotNull
stringConcatenationTypeNarrowingPhase.takeIf { context.config.optimizationsEnabled },
enumConstructorsPhase,
initializersPhase,
inventNamesForLocalClasses,
localFunctionsPhase,
volatilePhase,
tailrecPhase,
@@ -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
@@ -147,7 +147,7 @@ private fun checkLocalClasses(args: Array<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
// 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<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
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<String>) {
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()
)