FIR: Extract common code in FirPackageMemberScope

This commit is contained in:
Denis Zharkov
2020-08-27 15:42:52 +03:00
parent b4aef21423
commit d80caf7dbf
@@ -9,7 +9,10 @@ import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.resolve.firSymbolProvider import org.jetbrains.kotlin.fir.resolve.firSymbolProvider
import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor
import org.jetbrains.kotlin.fir.scopes.FirScope import org.jetbrains.kotlin.fir.scopes.FirScope
import org.jetbrains.kotlin.fir.symbols.impl.* import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirClassifierSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirVariableSymbol
import org.jetbrains.kotlin.name.ClassId import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -36,22 +39,22 @@ class FirPackageMemberScope(val fqName: FqName, val session: FirSession) : FirSc
} }
override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) { override fun processFunctionsByName(name: Name, processor: (FirFunctionSymbol<*>) -> Unit) {
val symbols = callableCache.getOrPut(name) { processCallables(name, processor)
symbolProvider.getTopLevelCallableSymbols(fqName, name)
}
for (symbol in symbols) {
if (symbol is FirFunctionSymbol<*>) {
processor(symbol)
}
}
} }
override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) { override fun processPropertiesByName(name: Name, processor: (FirVariableSymbol<*>) -> Unit) {
processCallables(name, processor)
}
private inline fun <reified D : FirCallableSymbol<*>> processCallables(
name: Name,
processor: (D) -> Unit
) {
val symbols = callableCache.getOrPut(name) { val symbols = callableCache.getOrPut(name) {
symbolProvider.getTopLevelCallableSymbols(fqName, name) symbolProvider.getTopLevelCallableSymbols(fqName, name)
} }
for (symbol in symbols) { for (symbol in symbols) {
if (symbol is FirPropertySymbol) { if (symbol is D) {
processor(symbol) processor(symbol)
} }
} }