[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`.
This commit is contained in:
Marco Pennekamp
2023-03-28 20:25:07 +02:00
committed by Space Team
parent 028d65e402
commit a7360a54fe
2 changed files with 29 additions and 10 deletions
@@ -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<String>? =
declarationProvider
.getTopLevelKotlinClassLikeDeclarationNamesInPackage(packageFqName)
.mapTo(mutableSetOf()) { it.asString() }
override fun computeCallableNames(packageFqName: FqName): Set<Name>? =
declarationProvider.getTopLevelCallableNamesInPackage(packageFqName)
}
val symbolNameCache = LLFirKotlinSymbolProviderNameCache(firSession, declarationProvider)
fun getFirClassifierByFqNameAndDeclaration(
classId: ClassId,
@@ -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<String> =
declarationProvider
.getTopLevelKotlinClassLikeDeclarationNamesInPackage(packageFqName)
.mapTo(mutableSetOf()) { it.asString() }
override fun computeCallableNames(packageFqName: FqName): Set<Name> =
declarationProvider.getTopLevelCallableNamesInPackage(packageFqName)
}