From c775508f64e059db38bea82cd3daf9c17d0349b1 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Mon, 29 Mar 2021 18:18:42 +0200 Subject: [PATCH] FIR IDE: cache function symbols in FirIdeBuiltinSymbolProvider --- .../impl/FirBuiltinSymbolProvider.kt | 6 ++- .../providers/FirIdeBuiltinSymbolProvider.kt | 40 +++++++++++++++++++ .../api/sessions/FirIdeSessionFactory.kt | 2 +- 3 files changed, 46 insertions(+), 2 deletions(-) create mode 100644 idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeBuiltinSymbolProvider.kt diff --git a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt index c12a86a7f04..7c979e7085c 100644 --- a/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt +++ b/compiler/fir/fir-deserialization/src/org/jetbrains/kotlin/fir/resolve/providers/impl/FirBuiltinSymbolProvider.kt @@ -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, packageFqName: FqName, name: Name) { + getTopLevelFunctionSymbolsToByPackageFragments(destination, packageFqName, name) + } + + protected fun getTopLevelFunctionSymbolsToByPackageFragments(destination: MutableList, packageFqName: FqName, name: Name) { allPackageFragments[packageFqName]?.flatMapTo(destination) { it.getTopLevelFunctionSymbols(name) } diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeBuiltinSymbolProvider.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeBuiltinSymbolProvider.kt new file mode 100644 index 00000000000..ec06c6adb28 --- /dev/null +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/providers/FirIdeBuiltinSymbolProvider.kt @@ -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>, packageFqName: FqName, name: Name) { + // valid until FirBuiltinSymbolProvider provide property symbols + destination += functionsCache.getValue(CallableId(packageFqName, name)) + } + + @OptIn(FirSymbolProviderInternals::class) + override fun getTopLevelFunctionSymbolsTo(destination: MutableList, packageFqName: FqName, name: Name) { + destination += functionsCache.getValue(CallableId(packageFqName, name)) + } +} \ No newline at end of file diff --git a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt index 1fb00089bf1..2169f3b7c60 100644 --- a/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt +++ b/idea/idea-frontend-fir/idea-fir-low-level-api/src/org/jetbrains/kotlin/idea/fir/low/level/api/sessions/FirIdeSessionFactory.kt @@ -218,7 +218,7 @@ internal object FirIdeSessionFactory { val symbolProvider = FirCompositeSymbolProvider( this, listOf( - FirBuiltinSymbolProvider(this, kotlinScopeProvider), + FirIdeBuiltinSymbolProvider(this, kotlinScopeProvider), FirCloneableSymbolProvider(this, kotlinScopeProvider), ) )