[Analysis API] add ability for a custom element navigation for a KtResolveExtensionFile
^KT-57930
This commit is contained in:
committed by
Space Team
parent
51eaa3f9cf
commit
0d0b1b7945
+17
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user