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
|
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user