[FIR2IR] Add Fir2IrConversionScope to Fir2IrClassifierStorage and Fir2IrConverter
Use `withContainingFirClass` during processing `localClassesCreatedOnTheFly` Use `withContainingFirClass` in `processLocalClassAndNestedClassesOnTheFly` and `processLocalClassAndNestedClasses`
This commit is contained in:
committed by
Space Team
parent
24f8da471f
commit
e55acf56fa
+22
-14
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user