[FIR2IR] Add Fir2IrConversionScope to Fir2IrClassifierStorage and Fir2IrConverter

Use `withContainingFirClass` during processing `localClassesCreatedOnTheFly`

Use `withContainingFirClass` in `processLocalClassAndNestedClassesOnTheFly` and `processLocalClassAndNestedClasses`
This commit is contained in:
Ivan Kochurkin
2024-01-31 14:00:46 +01:00
committed by Space Team
parent 24f8da471f
commit e55acf56fa
4 changed files with 37 additions and 26 deletions
@@ -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<FirRegularClass, IrClass> = 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()
}
@@ -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<IrProvider> = listOf(FirIrProvider(this))
override val typeConverter: Fir2IrTypeConverter = Fir2IrTypeConverter(this)
private val conversionScope = Fir2IrConversionScope(configuration)
val fir2IrVisitor: Fir2IrVisitor = Fir2IrVisitor(this, conversionScope)
@@ -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.*
@@ -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
}