[FIR2IR] Implement tables merging in Fir2Ir classes and SymbolTable

- Pass dependent (usually common code) components to further FIR2IR converters
- Don't reinitialize builtin
This commit is contained in:
Ivan Kochurkin
2022-11-18 19:54:36 +01:00
committed by Space Team
parent 5d273ce839
commit f17e1314f6
20 changed files with 376 additions and 101 deletions
@@ -84,7 +84,8 @@ interface ReferenceSymbolTable {
open class SymbolTable(
val signaturer: IdSignatureComposer,
val irFactory: IrFactory,
val nameProvider: NameProvider = NameProvider.DEFAULT
val nameProvider: NameProvider = NameProvider.DEFAULT,
val dependentTables: List<SymbolTable> = emptyList(),
) : ReferenceSymbolTable {
val lock = IrLock()
@@ -212,10 +213,10 @@ open class SymbolTable(
}
}
private open inner class FlatSymbolTable<D : DeclarationDescriptor, B : IrSymbolOwner, S : IrBindableSymbol<D, B>> :
SymbolTableBase<D, B, S>(lock) {
val descriptorToSymbol = hashMapOf<D, S>()
val idSigToSymbol = hashMapOf<IdSignature, S>()
private open inner class FlatSymbolTable<D : DeclarationDescriptor, B : IrSymbolOwner, S : IrBindableSymbol<D, B>>(
val descriptorToSymbol: HashMap<D, S> = hashMapOf(),
val idSigToSymbol: HashMap<IdSignature, S> = hashMapOf()
) : SymbolTableBase<D, B, S>(lock) {
override fun signature(descriptor: D): IdSignature? =
signaturer.composeSignature(descriptor)
@@ -244,11 +245,17 @@ open class SymbolTable(
}
}
private inner class EnumEntrySymbolTable : FlatSymbolTable<ClassDescriptor, IrEnumEntry, IrEnumEntrySymbol>() {
private inner class EnumEntrySymbolTable(
descriptorToSymbol: HashMap<ClassDescriptor, IrEnumEntrySymbol> = hashMapOf(),
idSigToSymbol: HashMap<IdSignature, IrEnumEntrySymbol> = hashMapOf()
) : FlatSymbolTable<ClassDescriptor, IrEnumEntry, IrEnumEntrySymbol>(descriptorToSymbol, idSigToSymbol) {
override fun signature(descriptor: ClassDescriptor): IdSignature? = signaturer.composeEnumEntrySignature(descriptor)
}
private inner class FieldSymbolTable : FlatSymbolTable<PropertyDescriptor, IrField, IrFieldSymbol>() {
private inner class FieldSymbolTable(
descriptorToSymbol: HashMap<PropertyDescriptor, IrFieldSymbol> = hashMapOf(),
idSigToSymbol: HashMap<IdSignature, IrFieldSymbol> = hashMapOf()
) : FlatSymbolTable<PropertyDescriptor, IrField, IrFieldSymbol>(descriptorToSymbol, idSigToSymbol) {
override fun signature(descriptor: PropertyDescriptor): IdSignature? = signaturer.composeFieldSignature(descriptor)
}
@@ -365,18 +372,32 @@ open class SymbolTable(
currentScope?.dump() ?: "<none>"
}
private val externalPackageFragmentTable =
FlatSymbolTable<PackageFragmentDescriptor, IrExternalPackageFragment, IrExternalPackageFragmentSymbol>()
private val scriptSymbolTable = FlatSymbolTable<ScriptDescriptor, IrScript, IrScriptSymbol>()
private val classSymbolTable = FlatSymbolTable<ClassDescriptor, IrClass, IrClassSymbol>()
private val constructorSymbolTable = FlatSymbolTable<ClassConstructorDescriptor, IrConstructor, IrConstructorSymbol>()
private val enumEntrySymbolTable = EnumEntrySymbolTable()
private val fieldSymbolTable = FieldSymbolTable()
private val simpleFunctionSymbolTable = FlatSymbolTable<FunctionDescriptor, IrSimpleFunction, IrSimpleFunctionSymbol>()
private val propertySymbolTable = FlatSymbolTable<PropertyDescriptor, IrProperty, IrPropertySymbol>()
private val typeAliasSymbolTable = FlatSymbolTable<TypeAliasDescriptor, IrTypeAlias, IrTypeAliasSymbol>()
private val externalPackageFragmentTable: FlatSymbolTable<PackageFragmentDescriptor, IrExternalPackageFragment, IrExternalPackageFragmentSymbol> =
mergeFlatTables(dependentTables) { it.externalPackageFragmentTable }
private val scriptSymbolTable: FlatSymbolTable<ScriptDescriptor, IrScript, IrScriptSymbol> =
mergeFlatTables(dependentTables) { it.scriptSymbolTable }
private val classSymbolTable: FlatSymbolTable<ClassDescriptor, IrClass, IrClassSymbol> =
mergeFlatTables(dependentTables) { it.classSymbolTable }
private val constructorSymbolTable: FlatSymbolTable<ClassConstructorDescriptor, IrConstructor, IrConstructorSymbol> =
mergeFlatTables(dependentTables) { it.constructorSymbolTable }
private val enumEntrySymbolTable: EnumEntrySymbolTable = run {
val (descriptorToSymbol, idSigToSymbol) = mergeTables(dependentTables) { it.enumEntrySymbolTable }
EnumEntrySymbolTable(descriptorToSymbol, idSigToSymbol)
}
private val fieldSymbolTable: FieldSymbolTable = run {
val (descriptorToSymbol, idSigToSymbol) = mergeTables(dependentTables) { it.fieldSymbolTable }
FieldSymbolTable(descriptorToSymbol, idSigToSymbol)
}
private val simpleFunctionSymbolTable: FlatSymbolTable<FunctionDescriptor, IrSimpleFunction, IrSimpleFunctionSymbol> =
mergeFlatTables(dependentTables) { it.simpleFunctionSymbolTable }
private val propertySymbolTable: FlatSymbolTable<PropertyDescriptor, IrProperty, IrPropertySymbol> =
mergeFlatTables(dependentTables) { it.propertySymbolTable }
private val typeAliasSymbolTable: FlatSymbolTable<TypeAliasDescriptor, IrTypeAlias, IrTypeAliasSymbol> =
mergeFlatTables(dependentTables) { it.typeAliasSymbolTable }
private val globalTypeParameterSymbolTable: FlatSymbolTable<TypeParameterDescriptor, IrTypeParameter, IrTypeParameterSymbol> =
mergeFlatTables(dependentTables) { it.globalTypeParameterSymbolTable }
private val globalTypeParameterSymbolTable = FlatSymbolTable<TypeParameterDescriptor, IrTypeParameter, IrTypeParameterSymbol>()
private val scopedTypeParameterSymbolTable by threadLocal {
ScopedSymbolTable<TypeParameterDescriptor, IrTypeParameter, IrTypeParameterSymbol>()
}
@@ -393,6 +414,28 @@ open class SymbolTable(
listOf(valueParameterSymbolTable, variableSymbolTable, scopedTypeParameterSymbolTable, localDelegatedPropertySymbolTable)
}
private fun <D : DeclarationDescriptor, B : IrSymbolOwner, S : IrBindableSymbol<D, B>> mergeFlatTables(
dependentTables: List<SymbolTable>,
mapFunc: (SymbolTable) -> FlatSymbolTable<D, B, S>
): FlatSymbolTable<D, B, S> {
val (descriptorToSymbol, idSigToSymbol) = mergeTables(dependentTables, mapFunc)
return FlatSymbolTable(descriptorToSymbol, idSigToSymbol)
}
private fun <D : DeclarationDescriptor, B : IrSymbolOwner, S : IrBindableSymbol<D, B>> mergeTables(
dependentTables: List<SymbolTable>,
mapFunc: (SymbolTable) -> FlatSymbolTable<D, B, S>
): Pair<HashMap<D, S>, HashMap<IdSignature, S>> {
val descriptorToSymbol = hashMapOf<D, S>()
val idSigToSymbol = hashMapOf<IdSignature, S>()
for (dependentTable in dependentTables) {
val flatSymbolTable = mapFunc(dependentTable)
descriptorToSymbol.putAll(flatSymbolTable.descriptorToSymbol)
idSigToSymbol.putAll(flatSymbolTable.idSigToSymbol)
}
return Pair(descriptorToSymbol, idSigToSymbol)
}
@ObsoleteDescriptorBasedAPI
fun referenceExternalPackageFragment(descriptor: PackageFragmentDescriptor) =
externalPackageFragmentTable.referenced(descriptor) { IrExternalPackageFragmentSymbolImpl(descriptor) }