[IR] Simplify ExpectActualCollector, remove nesting

This commit is contained in:
Ivan Kochurkin
2023-02-10 16:20:45 +01:00
committed by Space Team
parent 010c7acc3a
commit a54b56d74e
@@ -23,7 +23,7 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment,
val result = mutableMapOf<IrSymbol, IrSymbol>() val result = mutableMapOf<IrSymbol, IrSymbol>()
// Collect and link classifiers at first to make it possible to expand type aliases on the callables linking // Collect and link classifiers at first to make it possible to expand type aliases on the callables linking
val (allActualDeclarations, typeAliasMap) = result.appendExpectActualClassifiersMap() val (allActualDeclarations, typeAliasMap) = result.appendExpectActualClassifiersMap()
result.appendExpectActualCallablesMap(allActualDeclarations, typeAliasMap, dependentFragments) result.appendExpectActualCallablesMap(allActualDeclarations, typeAliasMap)
return result to typeAliasMap return result to typeAliasMap
} }
@@ -44,11 +44,23 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment,
return allActualDeclarations to typeAliasMap return allActualDeclarations to typeAliasMap
} }
class ActualClassifiersCollector( private fun MutableMap<IrSymbol, IrSymbol>.appendExpectActualCallablesMap(
allActualDeclarations: Set<IrDeclaration>,
typeAliasMap: Map<FqName, FqName>
) {
val actualMembers = mutableMapOf<String, IrDeclarationBase>()
collectActualCallables(this, actualMembers, allActualDeclarations)
val collector = CallablesLinkCollector(this, actualMembers, typeAliasMap)
dependentFragments.forEach { collector.visitModuleFragment(it) }
}
}
private class ActualClassifiersCollector(
private val actualClassifiers: MutableMap<FqName, IrSymbol>, private val actualClassifiers: MutableMap<FqName, IrSymbol>,
private val allActualClassifiers: MutableSet<IrDeclaration>, private val allActualClassifiers: MutableSet<IrDeclaration>,
private val typeAliasMap: MutableMap<FqName, FqName> private val typeAliasMap: MutableMap<FqName, FqName>
) : IrElementVisitor<Unit, Boolean> { ) : IrElementVisitor<Unit, Boolean> {
override fun visitTypeAlias(declaration: IrTypeAlias, data: Boolean) { override fun visitTypeAlias(declaration: IrTypeAlias, data: Boolean) {
if (declaration.isActual) { if (declaration.isActual) {
val expandedTypeSymbol = declaration.expandedType.classifierOrFail val expandedTypeSymbol = declaration.expandedType.classifierOrFail
@@ -90,12 +102,12 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment,
override fun visitElement(element: IrElement, data: Boolean) { override fun visitElement(element: IrElement, data: Boolean) {
element.acceptChildren(this, data) element.acceptChildren(this, data)
} }
} }
class ClassifiersLinkCollector( private class ClassifiersLinkCollector(
private val expectActualMap: MutableMap<IrSymbol, IrSymbol>, private val expectActualMap: MutableMap<IrSymbol, IrSymbol>,
private val actualClassifiers: Map<FqName, IrSymbol> private val actualClassifiers: Map<FqName, IrSymbol>
) : IrElementVisitorVoid { ) : IrElementVisitorVoid {
private fun addLinkOrReportMissing(expectElement: IrSymbolOwner, actualTypeId: FqName) { private fun addLinkOrReportMissing(expectElement: IrSymbolOwner, actualTypeId: FqName) {
val actualClassifier = actualClassifiers[actualTypeId] val actualClassifier = actualClassifiers[actualTypeId]
if (actualClassifier != null) { if (actualClassifier != null) {
@@ -124,25 +136,13 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment,
override fun visitElement(element: IrElement) { override fun visitElement(element: IrElement) {
element.acceptChildrenVoid(this) element.acceptChildrenVoid(this)
} }
} }
private fun MutableMap<IrSymbol, IrSymbol>.appendExpectActualCallablesMap( private fun collectActualCallables(
allActualDeclarations: Set<IrDeclaration>,
typeAliasMap: Map<FqName, FqName>,
dependentFragments: List<IrModuleFragment>
) {
val actualMembers = mutableMapOf<String, IrDeclarationBase>()
collectActualCallables(this, actualMembers, allActualDeclarations)
val collector = CallablesLinkCollector(this, actualMembers, typeAliasMap)
dependentFragments.forEach { collector.visitModuleFragment(it) }
}
private fun collectActualCallables(
expectActualMap: MutableMap<IrSymbol, IrSymbol>, expectActualMap: MutableMap<IrSymbol, IrSymbol>,
actualMembers: MutableMap<String, IrDeclarationBase>, actualMembers: MutableMap<String, IrDeclarationBase>,
allActualDeclarations: Set<IrDeclaration>, allActualDeclarations: Set<IrDeclaration>,
) { ) {
fun collectActualsCallables(declaration: IrDeclaration) { fun collectActualsCallables(declaration: IrDeclaration) {
when (declaration) { when (declaration) {
is IrFunction, is IrFunction,
@@ -160,13 +160,13 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment,
for (actualDeclaration in allActualDeclarations) { for (actualDeclaration in allActualDeclarations) {
collectActualsCallables(actualDeclaration) collectActualsCallables(actualDeclaration)
} }
} }
class CallablesLinkCollector( private class CallablesLinkCollector(
private val expectActualMap: MutableMap<IrSymbol, IrSymbol>, private val expectActualMap: MutableMap<IrSymbol, IrSymbol>,
private val actualMembers: Map<String, IrDeclarationBase>, private val actualMembers: Map<String, IrDeclarationBase>,
private val typeAliasMap: Map<FqName, FqName> private val typeAliasMap: Map<FqName, FqName>
) : IrElementVisitorVoid { ) : IrElementVisitorVoid {
override fun visitFunction(declaration: IrFunction) = addLink(declaration) override fun visitFunction(declaration: IrFunction) = addLink(declaration)
override fun visitProperty(declaration: IrProperty) = addLink(declaration) override fun visitProperty(declaration: IrProperty) = addLink(declaration)
@@ -189,5 +189,4 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment,
override fun visitElement(element: IrElement) { override fun visitElement(element: IrElement) {
element.acceptChildrenVoid(this) element.acceptChildrenVoid(this)
} }
}
} }