Use local callables index in FirClassDeclaredMemberScope
This commit is contained in:
committed by
Mikhail Glukhikh
parent
11e0035254
commit
9cf91738ea
+26
-21
@@ -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
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user