FIR IDE: cache function symbols in FirIdeBuiltinSymbolProvider
This commit is contained in:
+5
-1
@@ -50,7 +50,7 @@ import java.io.InputStream
|
||||
|
||||
//TODO make thread safe
|
||||
@ThreadSafeMutableState
|
||||
class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: KotlinScopeProvider) : FirSymbolProvider(session) {
|
||||
open class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: KotlinScopeProvider) : FirSymbolProvider(session) {
|
||||
|
||||
private data class SyntheticFunctionalInterfaceSymbolKey(val kind: FunctionClassKind, val arity: Int)
|
||||
|
||||
@@ -243,6 +243,10 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot
|
||||
|
||||
@FirSymbolProviderInternals
|
||||
override fun getTopLevelFunctionSymbolsTo(destination: MutableList<FirNamedFunctionSymbol>, packageFqName: FqName, name: Name) {
|
||||
getTopLevelFunctionSymbolsToByPackageFragments(destination, packageFqName, name)
|
||||
}
|
||||
|
||||
protected fun getTopLevelFunctionSymbolsToByPackageFragments(destination: MutableList<FirNamedFunctionSymbol>, packageFqName: FqName, name: Name) {
|
||||
allPackageFragments[packageFqName]?.flatMapTo(destination) {
|
||||
it.getTopLevelFunctionSymbols(name)
|
||||
}
|
||||
|
||||
+40
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.idea.fir.low.level.api.providers
|
||||
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.caches.*
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProviderInternals
|
||||
import org.jetbrains.kotlin.fir.resolve.providers.impl.FirBuiltinSymbolProvider
|
||||
import org.jetbrains.kotlin.fir.scopes.KotlinScopeProvider
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
|
||||
import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
|
||||
class FirIdeBuiltinSymbolProvider(
|
||||
session: FirSession,
|
||||
kotlinScopeProvider: KotlinScopeProvider
|
||||
) : FirBuiltinSymbolProvider(session, kotlinScopeProvider) {
|
||||
@OptIn(ExperimentalStdlibApi::class)
|
||||
private val functionsCache = session.firCachesFactory.createCache { callableId: CallableId ->
|
||||
buildList {
|
||||
getTopLevelFunctionSymbolsToByPackageFragments(this, callableId.packageName, callableId.callableName)
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(FirSymbolProviderInternals::class)
|
||||
override fun getTopLevelCallableSymbolsTo(destination: MutableList<FirCallableSymbol<*>>, packageFqName: FqName, name: Name) {
|
||||
// valid until FirBuiltinSymbolProvider provide property symbols
|
||||
destination += functionsCache.getValue(CallableId(packageFqName, name))
|
||||
}
|
||||
|
||||
@OptIn(FirSymbolProviderInternals::class)
|
||||
override fun getTopLevelFunctionSymbolsTo(destination: MutableList<FirNamedFunctionSymbol>, packageFqName: FqName, name: Name) {
|
||||
destination += functionsCache.getValue(CallableId(packageFqName, name))
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -218,7 +218,7 @@ internal object FirIdeSessionFactory {
|
||||
val symbolProvider = FirCompositeSymbolProvider(
|
||||
this,
|
||||
listOf(
|
||||
FirBuiltinSymbolProvider(this, kotlinScopeProvider),
|
||||
FirIdeBuiltinSymbolProvider(this, kotlinScopeProvider),
|
||||
FirCloneableSymbolProvider(this, kotlinScopeProvider),
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user