From 07fdbeca19f9d4c0eb87002855f65b287c66215d Mon Sep 17 00:00:00 2001 From: Yan Zhulanow Date: Mon, 6 Mar 2023 17:48:31 +0900 Subject: [PATCH] [LL API] Search declarations in dependencies as a fallback 'JvmClassFileBasedSymbolProvider' works incorrectly for some cases, such as built-in classes. Moreover, the whole declaration binding logic looks over-complicated and redundant, as we get a 'ClassId'/'CallableId' from a 'KtDeclaration', and look for it again in indices. This commit fixes a bunch of failing completion tests: - HighLevelJvmBasicCompletionTestGenerated - HighLevelMultiFileJvmBasicCompletionTestGenerated - FirKeywordCompletionHandlerTestGenerated --- .../util/FirDeclarationForCompiledElementSearcher.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirDeclarationForCompiledElementSearcher.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirDeclarationForCompiledElementSearcher.kt index fc1946bc6c6..6d4ac31155f 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirDeclarationForCompiledElementSearcher.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/util/FirDeclarationForCompiledElementSearcher.kt @@ -53,10 +53,7 @@ internal class FirDeclarationForCompiledElementSearcher(private val symbolProvid val classId = declaration.getClassId() ?: errorWithFirSpecificEntries("Non-local class should have classId", psi = declaration) - val classCandidate = when (symbolProvider) { - is LLFirModuleWithDependenciesSymbolProvider -> symbolProvider.getClassLikeSymbolByFqNameWithoutDependencies(classId) - else -> symbolProvider.getClassLikeSymbolByClassId(classId) - } + val classCandidate = symbolProvider.getClassLikeSymbolByClassId(classId) if (classCandidate == null) { errorWithFirSpecificEntries("We should be able to find a symbol for $classId", psi = declaration) { @@ -131,7 +128,10 @@ private fun FirSymbolProvider.findCallableCandidates( @OptIn(FirSymbolProviderInternals::class) return when (this) { - is LLFirModuleWithDependenciesSymbolProvider -> getTopLevelCallableSymbolsWithoutDependencies(packageFqName, shortName) + is LLFirModuleWithDependenciesSymbolProvider -> { + getTopLevelCallableSymbolsWithoutDependencies(packageFqName, shortName).takeUnless { it.isEmpty() } + ?: getTopLevelCallableSymbols(packageFqName, shortName) + } else -> getTopLevelCallableSymbols(packageFqName, shortName) } }