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 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.declarations.FirRegularClass
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.scopes.ProcessorAction import org.jetbrains.kotlin.fir.scopes.ProcessorAction
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT import org.jetbrains.kotlin.fir.scopes.ProcessorAction.NEXT
import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP import org.jetbrains.kotlin.fir.scopes.ProcessorAction.STOP
import org.jetbrains.kotlin.fir.symbols.ConeCallableSymbol import org.jetbrains.kotlin.fir.symbols.*
import org.jetbrains.kotlin.fir.symbols.ConeFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.ConeVariableSymbol
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
class FirClassDeclaredMemberScope(private val klass: FirRegularClass) : FirScope { class FirClassDeclaredMemberScope(
override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction) = klass: FirRegularClass
processCallables(name, processor) ) : 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) = override fun processFunctionsByName(name: Name, processor: (ConeFunctionSymbol) -> ProcessorAction): ProcessorAction {
processCallables(name, processor) val symbols = callablesIndex[CallableId(classId.packageFqName, classId.relativeClassName, name)] ?: emptyList()
for (symbol in symbols) {
private inline fun <reified T : ConeCallableSymbol> processCallables( if (symbol is ConeFunctionSymbol && !processor(symbol)) {
name: Name, return STOP
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
} }
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 return NEXT
} }
} }