Use local callables index in FirClassDeclaredMemberScope

This commit is contained in:
Simon Ogorodnik
2019-04-02 16:56:39 +03:00
committed by Mikhail Glukhikh
parent 11e0035254
commit 9cf91738ea
@@ -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<FirCallableDeclaration>()
.mapNotNull { it.symbol as? ConeCallableSymbol }
.groupBy { it.callableId }
}
override fun processPropertiesByName(name: Name, processor: (ConeVariableSymbol) -> ProcessorAction) =
processCallables(name, processor)
private inline fun <reified T : ConeCallableSymbol> 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
}
}