diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt index 26c5e339bc9..d496c8b9f69 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/impl/FirClassDeclaredMemberScope.kt @@ -5,37 +5,42 @@ package org.jetbrains.kotlin.fir.scopes.impl -import org.jetbrains.kotlin.fir.declarations.FirCallableMemberDeclaration +import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration import org.jetbrains.kotlin.fir.declarations.FirRegularClass import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP -import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol -import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol -import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol +import org.jetbrains.kotlin.fir.symbols.* import org.jetbrains.kotlin.name.Name -class FirClassDeclaredMemberScope(private val klass: FirRegularClass) : FirScope { - override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction) = - processCallables(name, processor) +class FirClassDeclaredMemberScope( + klass: FirRegularClass +) : FirScope { + private val classId = klass.symbol.classId + private val callablesIndex by lazy { + klass.declarations.filterIsInstance() + .mapNotNull { it.symbol as? ConeCallableSymbol } + .groupBy { it.callableId } + } - override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction) = - processCallables(name, processor) - - private inline fun processCallables( - name: Name, - processor: (T) -> ProcessorAction - ): ProcessorAction { - for (declaration in klass.declarations) { - if (declaration !is FirCallableMemberDeclaration) continue - - val symbol = declaration.symbol as? T ?: continue - if (symbol.callableId.callableName != name) continue - - if (processor(symbol) == STOP) return STOP + override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction): ProcessorAction { + val symbols = callablesIndex[CallableId(classId.packageFqName, classId.relativeClassName, name)] ?: emptyList() + for (symbol in symbols) { + if (symbol is ConeFunctionSymbol && !processor(symbol)) { + return STOP + } } + return NEXT + } + override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction): ProcessorAction { + val symbols = callablesIndex[CallableId(classId.packageFqName, classId.relativeClassName, name)] ?: emptyList() + for (symbol in symbols) { + if (symbol is ConePropertySymbol && !processor(symbol)) { + return STOP + } + } return NEXT } }