[Analysis API] add ability for a custom element navigation for a KtResolveExtensionFile

^KT-57930
This commit is contained in:
Ilya Kirillov
2023-04-18 08:35:00 +02:00
committed by Space Team
parent 51eaa3f9cf
commit 0d0b1b7945
5 changed files with 71 additions and 7 deletions
@@ -13,11 +13,15 @@ import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
import org.jetbrains.kotlin.analysis.low.level.api.fir.resolve.extensions.psiTargetsProvider
import org.jetbrains.kotlin.analysis.project.structure.KtModuleStructureInternals
import org.jetbrains.kotlin.psi.KtFile
interface KtFirReference : KtReference, KtSymbolBasedReference {
fun getResolvedToPsi(analysisSession: KtAnalysisSession, referenceTargetSymbols: Collection<KtSymbol>): Collection<PsiElement> =
with(analysisSession) {
referenceTargetSymbols.flatMap { symbol ->
symbol.getPsiForGeneratedExtensionSymbol()?.let { return@flatMap it }
when (symbol) {
is KtFirSymbol<*> -> getPsiDeclarations(symbol)
else -> listOfNotNull(symbol.psi)
@@ -25,6 +29,19 @@ interface KtFirReference : KtReference, KtSymbolBasedReference {
}
}
context(KtAnalysisSession)
@OptIn(KtModuleStructureInternals::class)
private fun KtSymbol.getPsiForGeneratedExtensionSymbol(): Collection<PsiElement>? {
// TODO symbols generated by KtResolveExtension should probably have their own KtSymbolOrigin, now it's KtSymbolOrigin.SOURCE
if (origin != KtSymbolOrigin.SOURCE) return null
val psi = psi ?: return null
val ktFile = psi.containingFile as? KtFile ?: return null
val psiTargetsProvider = ktFile.virtualFile?.psiTargetsProvider ?: return null
return with(psiTargetsProvider) {
getReferenceTargetsForSymbol(this@getPsiForGeneratedExtensionSymbol)
}
}
fun getResolvedToPsi(analysisSession: KtAnalysisSession): Collection<PsiElement> =
with(analysisSession) {
getResolvedToPsi(analysisSession, resolveToSymbols())