ExpectActualCollector: pass parent isExpect through visitor to save perf

This commit is contained in:
Mikhail Glukhikh
2023-01-11 13:55:56 +01:00
committed by Space Team
parent a1f051acf1
commit 2237c964b5
@@ -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)
} }
} }