From b43f69364b683dd9f437fd3fed6ff5f56d0778d0 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 5 Mar 2024 13:10:56 +0200 Subject: [PATCH] [IR] Forcefully collect mapping of f/o for all source classes ```kotlin // FILE: AB.kt interface A { val x: Int = 1 } interface B : A { // f/o val x: Int // overrides: A.x } // FILE: C.java public interface C extends B { // f/o val x: Int // overrides: (B, A.x) } // FILE: D.java public interface D extends C { // f/o val x: Int // overrides: (C, A.x) } // FILE: usage.kt fun test(d: D) { d.x } ``` In such test backend will ask for overriddens of lazy property C.x only after property lowering, which removes property `B.x` and replaces it with getter `B.`. That fact that there is no property anymore really confuses `SpecialFakeOverrideSymbolsResolver` during computation of overriddens of `C.x`. So, to prevent this situation, we can process all source kotlin classes beforehand, so when any lazy function/property will start computation of its overriddens, there won't be the need to calculate mapping of f/o for classes This problem was found during work on KT-66341, after total signature computation removal from fir2ir. Previously those fake-overrides just matched by signature in symbol table --- .../kotlin/fir/pipeline/convertToIr.kt | 7 ++++++- .../SpecialFakeOverrideSymbolsResolver.kt | 19 ++++++++++++++++++- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt index f9027085356..ab514554b50 100644 --- a/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt +++ b/compiler/fir/entrypoint/src/org/jetbrains/kotlin/fir/pipeline/convertToIr.kt @@ -36,6 +36,7 @@ import org.jetbrains.kotlin.ir.util.KotlinMangler import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid +import org.jetbrains.kotlin.utils.addToStdlib.runIf data class FirResult(val outputs: List) @@ -123,14 +124,18 @@ fun FirResult.convertToIrAndActualize( components.fakeOverrideBuilder.buildForAll(allIrModules, temporaryResolver) } val expectActualMap = irActualizer?.actualizeCallablesAndMergeModules() ?: emptyMap() - if (!components.configuration.useFirBasedFakeOverrideGenerator) { + val fakeOverrideResolver = runIf(!components.configuration.useFirBasedFakeOverrideGenerator) { val fakeOverrideResolver = SpecialFakeOverrideSymbolsResolver(expectActualMap) irModuleFragment.acceptVoid(SpecialFakeOverrideSymbolsResolverVisitor(fakeOverrideResolver)) @OptIn(Fir2IrSymbolsMappingForLazyClasses.SymbolRemapperInternals::class) components.symbolsMappingForLazyClasses.initializeSymbolMap(fakeOverrideResolver) + fakeOverrideResolver } Fir2IrConverter.evaluateConstants(irModuleFragment, components) val actualizationResult = irActualizer?.runChecksAndFinalize(expectActualMap) + + fakeOverrideResolver?.cacheFakeOverridesOfAllClasses(irModuleFragment) + pluginContext.applyIrGenerationExtensions(irModuleFragment, irGeneratorExtensions) return Fir2IrActualizedResult(irModuleFragment, components, pluginContext, actualizationResult) } diff --git a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/SpecialFakeOverrideSymbolsResolver.kt b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/SpecialFakeOverrideSymbolsResolver.kt index 49c97290d38..4f05073519e 100644 --- a/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/SpecialFakeOverrideSymbolsResolver.kt +++ b/compiler/ir/ir.actualization/src/main/kotlin/org/jetbrains/kotlin/backend/common/actualizer/SpecialFakeOverrideSymbolsResolver.kt @@ -21,7 +21,6 @@ import org.jetbrains.kotlin.ir.util.SymbolRemapper import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid -import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled /** * This class provides utility to resolve [org.jetbrains.kotlin.ir.symbols.impl.IrFunctionFakeOverrideSymbol] @@ -112,6 +111,24 @@ class SpecialFakeOverrideSymbolsResolver(private val expectActualMap: Map