From a7360a54fe9d2c016f303e5d56ad75eaad1adc2a Mon Sep 17 00:00:00 2001 From: Marco Pennekamp Date: Tue, 28 Mar 2023 20:25:07 +0200 Subject: [PATCH] [LL FIR] KT-57314 Prepare for getting top-level names from index - Getting top-level names from `declarationProvider` directly instead of from subordinate symbol providers has a lot of potential for performance, but the current performance of the index access is worse than the iterative version because scopes aren't optimized yet. - This commit prepares `LLFirCombinedKotlinSymbolProvider` for the switch to getting top-level names from `declarationProvider`. --- .../api/fir/providers/LLFirProviderHelper.kt | 12 ++------- .../LLFirKotlinSymbolProviderNameCache.kt | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolProviderNameCache.kt diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt index a60ea2e8d0b..0aa64ae5ced 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/providers/LLFirProviderHelper.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.providers import org.jetbrains.kotlin.analysis.low.level.api.fir.file.builder.LLFirFileBuilder import org.jetbrains.kotlin.analysis.low.level.api.fir.util.FirElementFinder -import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirSymbolProviderNameCache +import org.jetbrains.kotlin.analysis.low.level.api.fir.util.LLFirKotlinSymbolProviderNameCache import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider import org.jetbrains.kotlin.analysis.providers.KotlinPackageProvider import org.jetbrains.kotlin.builtins.StandardNames @@ -60,15 +60,7 @@ internal class LLFirProviderHelper( } } - val symbolNameCache = object : LLFirSymbolProviderNameCache(firSession) { - override fun computeClassifierNames(packageFqName: FqName): Set? = - declarationProvider - .getTopLevelKotlinClassLikeDeclarationNamesInPackage(packageFqName) - .mapTo(mutableSetOf()) { it.asString() } - - override fun computeCallableNames(packageFqName: FqName): Set? = - declarationProvider.getTopLevelCallableNamesInPackage(packageFqName) - } + val symbolNameCache = LLFirKotlinSymbolProviderNameCache(firSession, declarationProvider) fun getFirClassifierByFqNameAndDeclaration( classId: ClassId, diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolProviderNameCache.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolProviderNameCache.kt new file mode 100644 index 00000000000..0877ed5fbda --- /dev/null +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/LLFirKotlinSymbolProviderNameCache.kt @@ -0,0 +1,27 @@ +/* + * Copyright 2010-2023 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.analysis.low.level.api.fir.util + +import org.jetbrains.kotlin.analysis.providers.KotlinDeclarationProvider +import org.jetbrains.kotlin.fir.FirSession +import org.jetbrains.kotlin.name.FqName +import org.jetbrains.kotlin.name.Name + +/** + * An [LLFirSymbolProviderNameCache] that fetches top-level names from a Kotlin [declarationProvider]. + */ +internal class LLFirKotlinSymbolProviderNameCache( + firSession: FirSession, + private val declarationProvider: KotlinDeclarationProvider, +) : LLFirSymbolProviderNameCache(firSession) { + override fun computeClassifierNames(packageFqName: FqName): Set = + declarationProvider + .getTopLevelKotlinClassLikeDeclarationNamesInPackage(packageFqName) + .mapTo(mutableSetOf()) { it.asString() } + + override fun computeCallableNames(packageFqName: FqName): Set = + declarationProvider.getTopLevelCallableNamesInPackage(packageFqName) +}