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
|
//TODO make thread safe
|
||||||
@ThreadSafeMutableState
|
@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)
|
private data class SyntheticFunctionalInterfaceSymbolKey(val kind: FunctionClassKind, val arity: Int)
|
||||||
|
|
||||||
@@ -243,6 +243,10 @@ class FirBuiltinSymbolProvider(session: FirSession, val kotlinScopeProvider: Kot
|
|||||||
|
|
||||||
@FirSymbolProviderInternals
|
@FirSymbolProviderInternals
|
||||||
override fun getTopLevelFunctionSymbolsTo(destination: MutableList<FirNamedFunctionSymbol>, packageFqName: FqName, name: Name) {
|
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) {
|
allPackageFragments[packageFqName]?.flatMapTo(destination) {
|
||||||
it.getTopLevelFunctionSymbols(name)
|
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(
|
val symbolProvider = FirCompositeSymbolProvider(
|
||||||
this,
|
this,
|
||||||
listOf(
|
listOf(
|
||||||
FirBuiltinSymbolProvider(this, kotlinScopeProvider),
|
FirIdeBuiltinSymbolProvider(this, kotlinScopeProvider),
|
||||||
FirCloneableSymbolProvider(this, kotlinScopeProvider),
|
FirCloneableSymbolProvider(this, kotlinScopeProvider),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user