ExpectActualCollector: pass parent isExpect through visitor to save perf
This commit is contained in:
committed by
Space Team
parent
a1f051acf1
commit
2237c964b5
+20
-18
@@ -5,6 +5,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.backend.common.actualizer
|
package org.jetbrains.kotlin.backend.common.actualizer
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.backend.common.ir.isExpect
|
||||||
import org.jetbrains.kotlin.backend.common.ir.isProperExpect
|
import org.jetbrains.kotlin.backend.common.ir.isProperExpect
|
||||||
import org.jetbrains.kotlin.ir.IrElement
|
import org.jetbrains.kotlin.ir.IrElement
|
||||||
import org.jetbrains.kotlin.ir.declarations.*
|
import org.jetbrains.kotlin.ir.declarations.*
|
||||||
@@ -12,6 +13,7 @@ import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
|
|||||||
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
import org.jetbrains.kotlin.ir.symbols.IrSymbol
|
||||||
import org.jetbrains.kotlin.ir.types.classifierOrFail
|
import org.jetbrains.kotlin.ir.types.classifierOrFail
|
||||||
import org.jetbrains.kotlin.ir.util.kotlinFqName
|
import org.jetbrains.kotlin.ir.util.kotlinFqName
|
||||||
|
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
|
||||||
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid
|
||||||
import org.jetbrains.kotlin.name.CallableId
|
import org.jetbrains.kotlin.name.CallableId
|
||||||
@@ -32,7 +34,7 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment,
|
|||||||
val allActualDeclarations = mutableSetOf<IrDeclaration>()
|
val allActualDeclarations = mutableSetOf<IrDeclaration>()
|
||||||
val typeAliasMap = mutableMapOf<FqName, FqName>() // It's used to link members from expect class that have typealias actual
|
val typeAliasMap = mutableMapOf<FqName, FqName>() // It's used to link members from expect class that have typealias actual
|
||||||
|
|
||||||
ActualClassifiersCollector(actualClassifiers, allActualDeclarations, typeAliasMap).visitModuleFragment(mainFragment)
|
ActualClassifiersCollector(actualClassifiers, allActualDeclarations, typeAliasMap).visitModuleFragment(mainFragment, false)
|
||||||
|
|
||||||
val linkCollector = ClassifiersLinkCollector(this, actualClassifiers)
|
val linkCollector = ClassifiersLinkCollector(this, actualClassifiers)
|
||||||
dependentFragments.forEach { linkCollector.visitModuleFragment(it) }
|
dependentFragments.forEach { linkCollector.visitModuleFragment(it) }
|
||||||
@@ -44,8 +46,8 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment,
|
|||||||
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>
|
||||||
) : IrElementVisitorVoid {
|
) : IrElementVisitor<Unit, Boolean> {
|
||||||
override fun visitTypeAlias(declaration: IrTypeAlias) {
|
override fun visitTypeAlias(declaration: IrTypeAlias, data: Boolean) {
|
||||||
if (declaration.isActual) {
|
if (declaration.isActual) {
|
||||||
val expandedTypeSymbol = declaration.expandedType.classifierOrFail
|
val expandedTypeSymbol = declaration.expandedType.classifierOrFail
|
||||||
actualClassifiers[declaration.kotlinFqName] = expandedTypeSymbol
|
actualClassifiers[declaration.kotlinFqName] = expandedTypeSymbol
|
||||||
@@ -54,18 +56,18 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment,
|
|||||||
typeAliasMap[declaration.kotlinFqName] = expandedTypeSymbol.owner.kotlinFqName
|
typeAliasMap[declaration.kotlinFqName] = expandedTypeSymbol.owner.kotlinFqName
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
visitElement(declaration)
|
visitElement(declaration, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitClass(declaration: IrClass) {
|
override fun visitClass(declaration: IrClass, data: Boolean) {
|
||||||
if (!declaration.isExpect) {
|
if (!data && !declaration.isExpect) {
|
||||||
actualClassifiers[declaration.kotlinFqName] = declaration.symbol
|
actualClassifiers[declaration.kotlinFqName] = declaration.symbol
|
||||||
}
|
}
|
||||||
visitDeclaration(declaration)
|
visitDeclaration(declaration, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitEnumEntry(declaration: IrEnumEntry) {
|
override fun visitEnumEntry(declaration: IrEnumEntry, data: Boolean) {
|
||||||
if (!declaration.isProperExpect) {
|
if (!data && !declaration.isExpect) {
|
||||||
actualClassifiers[FqName.fromSegments(
|
actualClassifiers[FqName.fromSegments(
|
||||||
listOf(
|
listOf(
|
||||||
declaration.parent.kotlinFqName.asString(),
|
declaration.parent.kotlinFqName.asString(),
|
||||||
@@ -73,27 +75,27 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment,
|
|||||||
)
|
)
|
||||||
)] = declaration.symbol
|
)] = declaration.symbol
|
||||||
}
|
}
|
||||||
visitDeclaration(declaration)
|
visitDeclaration(declaration, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitTypeParameter(declaration: IrTypeParameter) {
|
override fun visitTypeParameter(declaration: IrTypeParameter, data: Boolean) {
|
||||||
if (!declaration.isProperExpect) {
|
if (!data && !declaration.isExpect) {
|
||||||
actualClassifiers[FqName.fromSegments(
|
actualClassifiers[FqName.fromSegments(
|
||||||
listOf(declaration.parent.kotlinFqName.asString(), declaration.name.asString())
|
listOf(declaration.parent.kotlinFqName.asString(), declaration.name.asString())
|
||||||
)] = declaration.symbol
|
)] = declaration.symbol
|
||||||
}
|
}
|
||||||
visitDeclaration(declaration)
|
visitDeclaration(declaration, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitDeclaration(declaration: IrDeclarationBase) {
|
override fun visitDeclaration(declaration: IrDeclarationBase, data: Boolean) {
|
||||||
if (!declaration.isProperExpect) {
|
if (!data && !declaration.isExpect) {
|
||||||
allActualClassifiers.add(declaration)
|
allActualClassifiers.add(declaration)
|
||||||
}
|
}
|
||||||
visitElement(declaration)
|
visitElement(declaration, data || declaration.isExpect)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun visitElement(element: IrElement) {
|
override fun visitElement(element: IrElement, data: Boolean) {
|
||||||
element.acceptChildrenVoid(this)
|
element.acceptChildren(this, data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user