From 2237c964b5d755f37fd3a18269d996fb00935d7a Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Wed, 11 Jan 2023 13:55:56 +0100 Subject: [PATCH] ExpectActualCollector: pass parent isExpect through visitor to save perf --- .../actualizer/ExpectActualCollector.kt | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) diff --git a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualCollector.kt b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualCollector.kt index ff8723eab34..9d9b4e80646 100644 --- a/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualCollector.kt +++ b/compiler/ir/backend.common/src/org/jetbrains/kotlin/backend/common/actualizer/ExpectActualCollector.kt @@ -5,6 +5,7 @@ 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.ir.IrElement 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.types.classifierOrFail 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.acceptChildrenVoid import org.jetbrains.kotlin.name.CallableId @@ -32,7 +34,7 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment, val allActualDeclarations = mutableSetOf() val typeAliasMap = mutableMapOf() // 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) dependentFragments.forEach { linkCollector.visitModuleFragment(it) } @@ -44,8 +46,8 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment, private val actualClassifiers: MutableMap, private val allActualClassifiers: MutableSet, private val typeAliasMap: MutableMap - ) : IrElementVisitorVoid { - override fun visitTypeAlias(declaration: IrTypeAlias) { + ) : IrElementVisitor { + override fun visitTypeAlias(declaration: IrTypeAlias, data: Boolean) { if (declaration.isActual) { val expandedTypeSymbol = declaration.expandedType.classifierOrFail actualClassifiers[declaration.kotlinFqName] = expandedTypeSymbol @@ -54,18 +56,18 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment, typeAliasMap[declaration.kotlinFqName] = expandedTypeSymbol.owner.kotlinFqName } } - visitElement(declaration) + visitElement(declaration, data) } - override fun visitClass(declaration: IrClass) { - if (!declaration.isExpect) { + override fun visitClass(declaration: IrClass, data: Boolean) { + if (!data && !declaration.isExpect) { actualClassifiers[declaration.kotlinFqName] = declaration.symbol } - visitDeclaration(declaration) + visitDeclaration(declaration, data) } - override fun visitEnumEntry(declaration: IrEnumEntry) { - if (!declaration.isProperExpect) { + override fun visitEnumEntry(declaration: IrEnumEntry, data: Boolean) { + if (!data && !declaration.isExpect) { actualClassifiers[FqName.fromSegments( listOf( declaration.parent.kotlinFqName.asString(), @@ -73,27 +75,27 @@ internal class ExpectActualCollector(private val mainFragment: IrModuleFragment, ) )] = declaration.symbol } - visitDeclaration(declaration) + visitDeclaration(declaration, data) } - override fun visitTypeParameter(declaration: IrTypeParameter) { - if (!declaration.isProperExpect) { + override fun visitTypeParameter(declaration: IrTypeParameter, data: Boolean) { + if (!data && !declaration.isExpect) { actualClassifiers[FqName.fromSegments( listOf(declaration.parent.kotlinFqName.asString(), declaration.name.asString()) )] = declaration.symbol } - visitDeclaration(declaration) + visitDeclaration(declaration, data) } - override fun visitDeclaration(declaration: IrDeclarationBase) { - if (!declaration.isProperExpect) { + override fun visitDeclaration(declaration: IrDeclarationBase, data: Boolean) { + if (!data && !declaration.isExpect) { allActualClassifiers.add(declaration) } - visitElement(declaration) + visitElement(declaration, data || declaration.isExpect) } - override fun visitElement(element: IrElement) { - element.acceptChildrenVoid(this) + override fun visitElement(element: IrElement, data: Boolean) { + element.acceptChildren(this, data) } }