[FIR2IR] Generate IR for f/o of common classes generated during platform conversion

This change fixes tests which were muted in one of previous commits
This commit is contained in:
Dmitriy Novozhilov
2023-11-14 17:26:26 +02:00
committed by Space Team
parent 65797e8fba
commit c9ff0c41fc
5 changed files with 61 additions and 8 deletions
@@ -116,6 +116,12 @@ class Fir2IrConverter(
}
}
if (components.session.languageVersionSettings.supportsFeature(LanguageFeature.MultiPlatformProjects)) {
// See the comment to generateUnboundFakeOverrides function itself
@OptIn(LeakedDeclarationCaches::class)
declarationStorage.generateUnboundFakeOverrides()
}
evaluateConstants(irModuleFragment, components)
}
@@ -1141,6 +1141,61 @@ class Fir2IrDeclarationStorage(
}
}
// ------------------------------------ binding unbound symbols ------------------------------------
/**
* This function iterates over all f/o symbols created in declaration storage and binds all unbound symbols
*
* Usually all symbols are bound after fir2ir conversion is over, but there is a case in MPP scenario when some fake-override
* for common classes appears only during conversion of platform session:
*
* // MODULE: common
* expect interface A
*
* interface B : A {
* // f/o fun foo() // (1)
* }
*
* // MODULE: platform()()(common)
* actual interface A {
* fun foo() // (2)
* }
*
* fun test(b: B) {
* b.foo() // (3)
* }
*
* Here during common module conversion there is no `foo` function in scope of class B, so (1) is not generated
* During conversion of function test we reference symbol for (1) at line (3), so this symbol is created. But
* there is no code which generate actual IR for this symbol, because IR for f/o is generated only during
* conversion of corresponing class (and `B` is already converted)
*
* So to fix this issue we need to call this method after conversion of platform module
*/
@LeakedDeclarationCaches
internal fun generateUnboundFakeOverrides() {
for ((identifier, symbol) in irForFirSessionDependantDeclarationMap) {
if (symbol.isBound) continue
val (originalSymbol, dispatchReceiverLookupTag, _) = identifier
val irParent = findIrParent(originalSymbol.fir, dispatchReceiverLookupTag)
when (originalSymbol) {
is FirPropertySymbol -> createAndCacheIrProperty(
originalSymbol.fir,
irParent,
fakeOverrideOwnerLookupTag = dispatchReceiverLookupTag
)
is FirNamedFunctionSymbol -> createAndCacheIrFunction(
originalSymbol.fir,
irParent,
fakeOverrideOwnerLookupTag = dispatchReceiverLookupTag
)
else -> error("Unexpected declaration: $originalSymbol")
}
}
}
// ------------------------------------ scripts ------------------------------------
fun getCachedIrScript(script: FirScript): IrScript? {
@@ -6,9 +6,6 @@
// WITH_STDLIB
// !LANGUAGE: +MultiPlatformProjects
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-62535
// IGNORE_BACKEND_K2: JVM_IR
// Ignore reason: (TODO) how should generate IR for common f/o after actualization?
// TARGET_BACKEND: JVM
// MODULE: common
// TARGET_PLATFORM: Common
@@ -3,9 +3,6 @@
// WITH_STDLIB
// !LANGUAGE: +MultiPlatformProjects
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-62535
// IGNORE_BACKEND_K2: JVM_IR
// Ignore reason: (TODO) how should generate IR for common f/o after actualization?
// MODULE: common
// TARGET_PLATFORM: Common
// FILE: common.kt
@@ -3,8 +3,6 @@
// WITH_STDLIB
// IGNORE_CODEGEN_WITH_IR_FAKE_OVERRIDE_GENERATION: KT-62535
// !LANGUAGE: +MultiPlatformProjects
// IGNORE_BACKEND_K2: JVM_IR
// Ignore reason: (TODO) how should generate IR for common f/o after actualization?
// MODULE: common
// TARGET_PLATFORM: Common