[LL API] Avoid dependencies in compiled element searcher
Library modules depend on all other project modules. Such a simplification is useful for cross-library analysis. However, this seems to be rather harmful for PSI->FIR binding as there might be several versions of the same library in a project.
This commit is contained in:
+21
-9
@@ -7,14 +7,12 @@ 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.api.KtDeclarationAndFirDeclarationEqualityChecker
|
||||||
import org.jetbrains.kotlin.analysis.low.level.api.fir.project.structure.llFirModuleData
|
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.project.structure.getKtModule
|
import org.jetbrains.kotlin.analysis.project.structure.getKtModule
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.ExceptionAttachmentBuilder
|
import org.jetbrains.kotlin.analysis.utils.errors.ExceptionAttachmentBuilder
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.withClassEntry
|
import org.jetbrains.kotlin.analysis.utils.errors.withClassEntry
|
||||||
import org.jetbrains.kotlin.fir.declarations.*
|
import org.jetbrains.kotlin.fir.declarations.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.FirSymbolProvider
|
import org.jetbrains.kotlin.fir.resolve.providers.*
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredConstructors
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredFunctionSymbols
|
|
||||||
import org.jetbrains.kotlin.fir.resolve.providers.getClassDeclaredPropertySymbols
|
|
||||||
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
|
||||||
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
import org.jetbrains.kotlin.fir.symbols.impl.FirFunctionSymbol
|
||||||
@@ -55,11 +53,17 @@ internal class FirDeclarationForCompiledElementSearcher(private val symbolProvid
|
|||||||
val classId = declaration.getClassId()
|
val classId = declaration.getClassId()
|
||||||
?: errorWithFirSpecificEntries("Non-local class should have classId", psi = declaration)
|
?: errorWithFirSpecificEntries("Non-local class should have classId", psi = declaration)
|
||||||
|
|
||||||
val classCandidate = symbolProvider.getClassLikeSymbolByClassId(classId)
|
val classCandidate = when (symbolProvider) {
|
||||||
?: errorWithFirSpecificEntries("We should be able to find a symbol for $classId", psi = declaration) {
|
is LLFirModuleWithDependenciesSymbolProvider -> symbolProvider.getClassLikeSymbolByFqNameWithoutDependencies(classId)
|
||||||
|
else -> symbolProvider.getClassLikeSymbolByClassId(classId)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (classCandidate == null) {
|
||||||
|
errorWithFirSpecificEntries("We should be able to find a symbol for $classId", psi = declaration) {
|
||||||
withEntry("classId", classId) { it.asString() }
|
withEntry("classId", classId) { it.asString() }
|
||||||
withEntry("ktModule", declaration.getKtModule()) { it.moduleDescription }
|
withEntry("ktModule", declaration.getKtModule()) { it.moduleDescription }
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return classCandidate.fir
|
return classCandidate.fir
|
||||||
}
|
}
|
||||||
@@ -120,15 +124,23 @@ private fun FirSymbolProvider.findCallableCandidates(
|
|||||||
declaration: KtCallableDeclaration,
|
declaration: KtCallableDeclaration,
|
||||||
isTopLevel: Boolean
|
isTopLevel: Boolean
|
||||||
): List<FirCallableSymbol<*>> {
|
): List<FirCallableSymbol<*>> {
|
||||||
|
val shortName = declaration.nameAsSafeName
|
||||||
|
|
||||||
if (isTopLevel) {
|
if (isTopLevel) {
|
||||||
return getTopLevelCallableSymbols(declaration.containingKtFile.packageFqName, declaration.nameAsSafeName)
|
val packageFqName = declaration.containingKtFile.packageFqName
|
||||||
|
|
||||||
|
@OptIn(FirSymbolProviderInternals::class)
|
||||||
|
return when (this) {
|
||||||
|
is LLFirModuleWithDependenciesSymbolProvider -> getTopLevelCallableSymbolsWithoutDependencies(packageFqName, shortName)
|
||||||
|
else -> getTopLevelCallableSymbols(packageFqName, shortName)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
val containerClassId = declaration.containingClassOrObject?.getClassId()
|
val containerClassId = declaration.containingClassOrObject?.getClassId()
|
||||||
?: errorWithFirSpecificEntries("No containing non-local declaration found for", psi = declaration)
|
?: errorWithFirSpecificEntries("No containing non-local declaration found for", psi = declaration)
|
||||||
|
|
||||||
return getClassDeclaredFunctionSymbols(containerClassId, declaration.nameAsSafeName) +
|
return getClassDeclaredFunctionSymbols(containerClassId, shortName) +
|
||||||
getClassDeclaredPropertySymbols(containerClassId, declaration.nameAsSafeName)
|
getClassDeclaredPropertySymbols(containerClassId, shortName)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun representSameConstructor(psiConstructor: KtConstructor<*>, firConstructor: FirConstructor): Boolean {
|
private fun representSameConstructor(psiConstructor: KtConstructor<*>, firConstructor: FirConstructor): Boolean {
|
||||||
|
|||||||
Reference in New Issue
Block a user