diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt index 8af86172191..a8b0ceaf0e2 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrClassifierStorage.kt @@ -29,7 +29,8 @@ import org.jetbrains.kotlin.name.SpecialNames class Fir2IrClassifierStorage( private val components: Fir2IrComponents, - commonMemberStorage: Fir2IrCommonMemberStorage + commonMemberStorage: Fir2IrCommonMemberStorage, + private val conversionScope: Fir2IrConversionScope, ) : Fir2IrComponents by components { private val classCache: MutableMap = commonMemberStorage.classCache @@ -287,19 +288,26 @@ class Fir2IrClassifierStorage( // Before the call it's not possible, because f/o binding for regular classes isn't done yet processMembersOfClassesOnTheFlyImmediately = true for ((klass, irClass) in localClassesCreatedOnTheFly) { - converter.processClassMembers(klass, irClass) - // See the problem from KT-57441 -// class Wrapper { -// private val dummy = object: Bar {} -// private val bar = object: Bar by dummy {} -// } -// interface Bar { -// val foo: String -// get() = "" -// } - // When we are building bar.foo fake override, we should call dummy.foo, - // so we should have object : Bar.foo fake override to be built and bound. - converter.bindFakeOverridesInClass(irClass) + conversionScope.withContainingFirClass(klass) { + classifiersGenerator.processClassHeader(klass, irClass) + converter.processClassMembers(klass, irClass) + // See the problem from KT-57441 + // + // ```kt + // class Wrapper { + // private val dummy = object: Bar {} + // private val bar = object: Bar by dummy {} + // } + // interface Bar { + // val foo: String + // get() = "" + // } + // ``` + // + // When we are building bar.foo fake override, we should call dummy.foo, + // so we should have object : Bar.foo fake override to be built and bound. + converter.bindFakeOverridesInClass(irClass) + } } localClassesCreatedOnTheFly.clear() } diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrComponentsStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrComponentsStorage.kt index c3e3f5bdade..dfa04139831 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrComponentsStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrComponentsStorage.kt @@ -40,9 +40,11 @@ class Fir2IrComponentsStorage( override val signatureComposer: FirBasedSignatureComposer = commonMemberStorage.firSignatureComposer override val symbolTable: SymbolTable = commonMemberStorage.symbolTable - override val converter: Fir2IrConverter = Fir2IrConverter(moduleDescriptor, this) + private val conversionScope = Fir2IrConversionScope(configuration) - override val classifierStorage: Fir2IrClassifierStorage = Fir2IrClassifierStorage(this, commonMemberStorage) + override val converter: Fir2IrConverter = Fir2IrConverter(moduleDescriptor, this, conversionScope) + + override val classifierStorage: Fir2IrClassifierStorage = Fir2IrClassifierStorage(this, commonMemberStorage, conversionScope) override val declarationStorage: Fir2IrDeclarationStorage = Fir2IrDeclarationStorage(this, moduleDescriptor, commonMemberStorage) override val callablesGenerator: Fir2IrCallableDeclarationsGenerator = Fir2IrCallableDeclarationsGenerator(this) @@ -59,7 +61,6 @@ class Fir2IrComponentsStorage( override val irProviders: List = listOf(FirIrProvider(this)) override val typeConverter: Fir2IrTypeConverter = Fir2IrTypeConverter(this) - private val conversionScope = Fir2IrConversionScope(configuration) val fir2IrVisitor: Fir2IrVisitor = Fir2IrVisitor(this, conversionScope) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConversionScope.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConversionScope.kt index 7f8aa8f9f7d..7686d7a5e9c 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConversionScope.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConversionScope.kt @@ -5,10 +5,7 @@ package org.jetbrains.kotlin.fir.backend -import org.jetbrains.kotlin.fir.declarations.FirClass -import org.jetbrains.kotlin.fir.declarations.FirConstructor -import org.jetbrains.kotlin.fir.declarations.FirProperty -import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor +import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.expressions.FirReturnExpression import org.jetbrains.kotlin.ir.builders.Scope import org.jetbrains.kotlin.ir.declarations.* diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index 8e1606e04bc..f757c565ab3 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -61,7 +61,8 @@ import org.jetbrains.kotlin.psi.KtFile class Fir2IrConverter( private val moduleDescriptor: FirModuleDescriptor, - private val components: Fir2IrComponents + private val components: Fir2IrComponents, + private val conversionScope: Fir2IrConversionScope, ) : Fir2IrComponents by components { private val generatorExtensions = session.extensionService.declarationGenerators @@ -137,15 +138,19 @@ class Fir2IrConverter( fun processLocalClassAndNestedClassesOnTheFly(klass: FirClass, parent: IrDeclarationParent): IrClass { val irClass = registerClassAndNestedClasses(klass, parent) - processClassAndNestedClassHeaders(klass) + conversionScope.withContainingFirClass(klass) { + processClassAndNestedClassHeaders(klass) + } return irClass } fun processLocalClassAndNestedClasses(klass: FirClass, parent: IrDeclarationParent): IrClass { val irClass = registerClassAndNestedClasses(klass, parent) - processClassAndNestedClassHeaders(klass) - processClassMembers(klass, irClass) - bindFakeOverridesInClass(irClass) + conversionScope.withContainingFirClass(klass) { + processClassAndNestedClassHeaders(klass) + processClassMembers(klass, irClass) + bindFakeOverridesInClass(irClass) + } return irClass }