[LL API] Treat built-ins as a part of the standard library
Normally, compiled declaration searcher should look up declarations
only inside the session declarations. However, built-ins are treated
as a separate dependency, so '...WithoutDependencies()' functions
return only a part of declarations for the Kotlin standard library.
This commit effectively reverts changes in the previous change
(07fdbeca19).
This commit fixes the rest of failing compiletion tests:
- HighLevelJvmBasicCompletionTestGenerated
- HighLevelMultiFileJvmBasicCompletionTestGenerated
This commit is contained in:
+24
-4
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.util
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.api.KtDeclarationAndFirDeclarationEqualityChecker
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.providers.LLFirModuleWithDependenciesSymbolProvider
|
||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.sessions.LLFirBuiltinsAndCloneableSession
|
||||
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
||||
import org.jetbrains.kotlin.analysis.utils.errors.ExceptionAttachmentBuilder
|
||||
import org.jetbrains.kotlin.analysis.utils.errors.withClassEntry
|
||||
@@ -17,6 +18,7 @@ import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||
import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol
|
||||
import org.jetbrains.kotlin.name.StandardClassIds
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
|
||||
|
||||
@@ -53,7 +55,15 @@ internal class FirDeclarationForCompiledElementSearcher(private val symbolProvid
|
||||
val classId = declaration.getClassId()
|
||||
?: errorWithFirSpecificEntries("Non-local class should have classId", psi = declaration)
|
||||
|
||||
val classCandidate = symbolProvider.getClassLikeSymbolByClassId(classId)
|
||||
val classCandidate = when (symbolProvider) {
|
||||
is LLFirModuleWithDependenciesSymbolProvider -> {
|
||||
symbolProvider.getClassLikeSymbolByFqNameWithoutDependencies(classId)
|
||||
?: symbolProvider.friendBuiltinsProvider?.getClassLikeSymbolByClassId(classId)
|
||||
}
|
||||
else -> {
|
||||
symbolProvider.getClassLikeSymbolByClassId(classId)
|
||||
}
|
||||
}
|
||||
|
||||
if (classCandidate == null) {
|
||||
errorWithFirSpecificEntries("We should be able to find a symbol for $classId", psi = declaration) {
|
||||
@@ -111,6 +121,16 @@ internal class FirDeclarationForCompiledElementSearcher(private val symbolProvid
|
||||
|
||||
}
|
||||
|
||||
// Returns a built-in provider for a Kotlin standard library, as built-in declarations are its logical part.
|
||||
private val LLFirModuleWithDependenciesSymbolProvider.friendBuiltinsProvider: FirSymbolProvider?
|
||||
get() {
|
||||
if (getPackageWithoutDependencies(StandardClassIds.BASE_KOTLIN_PACKAGE) != null) {
|
||||
return dependencyProvider.dependentProviders.find { it.session is LLFirBuiltinsAndCloneableSession }
|
||||
}
|
||||
|
||||
return null
|
||||
}
|
||||
|
||||
private fun FirSymbolProvider.findFunctionCandidates(function: KtNamedFunction): List<FirFunctionSymbol<*>> =
|
||||
findCallableCandidates(function, function.isTopLevel).filterIsInstance<FirFunctionSymbol<*>>()
|
||||
|
||||
@@ -128,9 +148,9 @@ private fun FirSymbolProvider.findCallableCandidates(
|
||||
|
||||
@OptIn(FirSymbolProviderInternals::class)
|
||||
return when (this) {
|
||||
is LLFirModuleWithDependenciesSymbolProvider -> {
|
||||
getTopLevelCallableSymbolsWithoutDependencies(packageFqName, shortName).takeUnless { it.isEmpty() }
|
||||
?: getTopLevelCallableSymbols(packageFqName, shortName)
|
||||
is LLFirModuleWithDependenciesSymbolProvider -> buildList {
|
||||
getTopLevelCallableSymbolsToWithoutDependencies(this, packageFqName, shortName)
|
||||
friendBuiltinsProvider?.getTopLevelCallableSymbolsTo(this, packageFqName, shortName)
|
||||
}
|
||||
else -> getTopLevelCallableSymbols(packageFqName, shortName)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user