[FIR2IR] Correctly calculate ir origin for f/o callables in declarations generator

This change uncovers one problem, which causes some MPP tests to fail
This problem will be fixed in further commits

Uncovers KT-62535
This commit is contained in:
Dmitriy Novozhilov
2023-09-21 13:37:23 +03:00
committed by Space Team
parent 50425e82c5
commit 34d0f3dbc2
5 changed files with 30 additions and 14 deletions
@@ -686,7 +686,8 @@ fun FirSession.createFilesWithGeneratedDeclarations(): List<FirFile> {
fun FirDeclaration?.computeIrOrigin(
predefinedOrigin: IrDeclarationOrigin? = null,
parentOrigin: IrDeclarationOrigin? = null
parentOrigin: IrDeclarationOrigin? = null,
fakeOverrideOwnerLookupTag: ConeClassLikeLookupTag? = null
): IrDeclarationOrigin {
if (this == null) {
return predefinedOrigin ?: parentOrigin ?: IrDeclarationOrigin.DEFINED
@@ -703,6 +704,7 @@ fun FirDeclaration?.computeIrOrigin(
}
this is FirCallableDeclaration -> when {
fakeOverrideOwnerLookupTag != null && fakeOverrideOwnerLookupTag != containingClassLookupTag() -> IrDeclarationOrigin.FAKE_OVERRIDE
symbol.fir.isIntersectionOverride || symbol.fir.isSubstitutionOverride -> IrDeclarationOrigin.FAKE_OVERRIDE
parentOrigin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB && symbol.isJavaOrEnhancement -> {
IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
@@ -105,7 +105,11 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
// See org.jetbrains.kotlin.backend.jvm.lower.InheritedDefaultMethodsOnClassesLoweringKt.isDefinitelyNotDefaultImplsMethod
(irParent as? IrClass)?.origin == IrDeclarationOrigin.IR_EXTERNAL_DECLARATION_STUB &&
function.isJavaOrEnhancement -> IrDeclarationOrigin.IR_EXTERNAL_JAVA_DECLARATION_STUB
else -> function.computeIrOrigin(predefinedOrigin, parentOrigin = (irParent as? IrDeclaration)?.origin)
else -> function.computeIrOrigin(
predefinedOrigin,
parentOrigin = (irParent as? IrDeclaration)?.origin,
fakeOverrideOwnerLookupTag
)
}
val parentIsExternal = irParent.isExternalParent()
// We don't generate signatures for local classes
@@ -268,15 +272,18 @@ class Fir2IrCallableDeclarationsGenerator(val components: Fir2IrComponents) : Fi
isLocal: Boolean = false,
fakeOverrideOwnerLookupTag: ConeClassLikeLookupTag? = null,
): IrProperty = convertCatching(property) {
val origin =
when {
!predefinedOrigin.isExternal &&
property.isStatic &&
property.name in Fir2IrDeclarationStorage.ENUM_SYNTHETIC_NAMES
-> IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER
val origin = when {
!predefinedOrigin.isExternal &&
property.isStatic &&
property.name in Fir2IrDeclarationStorage.ENUM_SYNTHETIC_NAMES
-> IrDeclarationOrigin.ENUM_CLASS_SPECIAL_MEMBER
else -> property.computeIrOrigin(predefinedOrigin, parentOrigin = (irParent as? IrDeclaration)?.origin)
}
else -> property.computeIrOrigin(
predefinedOrigin,
parentOrigin = (irParent as? IrDeclaration)?.origin,
fakeOverrideOwnerLookupTag
)
}
// See similar comments in createIrFunction above
val parentIsExternal = irParent.isExternalParent()
val signature =
+3 -2
View File
@@ -5,9 +5,10 @@
// WITH_STDLIB
// !LANGUAGE: +MultiPlatformProjects
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-62535
// TARGET_BACKEND: JVM
// IGNORE_BACKEND_K2: JVM_IR
// REASON: K2 incorrectly generates IR for B.bar f/o
// MODULE: common
// TARGET_PLATFORM: Common
@@ -1,6 +1,9 @@
// IGNORE_BACKEND_K1: JS, JS_IR, JS_IR_ES6, NATIVE, WASM
// WITH_STDLIB
// !LANGUAGE: +MultiPlatformProjects
// IGNORE_BACKEND_K2: JVM_IR
// REASON: K2 incorrectly generates IR for S1.p f/o
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-62535
// MODULE: common
// TARGET_PLATFORM: Common
@@ -41,4 +44,4 @@ fun box(): String {
} else {
"FAIL"
}
}
}
@@ -1,6 +1,9 @@
// IGNORE_BACKEND_K1: JS, JS_IR, JS_IR_ES6, NATIVE, WASM
// WITH_STDLIB
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-62535
// !LANGUAGE: +MultiPlatformProjects
// IGNORE_BACKEND_K2: ANY
// REASON: K2 incorrectly generates IR for S2.s3 f/o
// MODULE: common
// TARGET_PLATFORM: Common
@@ -39,4 +42,4 @@ actual interface S : S1, S2 {
fun s3() = s1() + s2()
}
fun box() = B().s3()
fun box() = B().s3()