mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
KT-86909 [kotlin] Cleanup: pass KaSession as context parameter instead of extension receiver
GitOrigin-RevId: c2871483af3df855532aa6b7902f556e760330c2
This commit is contained in:
committed by
intellij-monorepo-bot
parent
65a0e1ddc5
commit
da7d48a0e1
+1
-1
@@ -29,7 +29,7 @@ internal class KaBaseKDocReference(element: KDocName) : KDocReference(element),
|
||||
referenceTargetSymbols.flatMap { symbol ->
|
||||
when (symbol) {
|
||||
is KaSyntheticJavaPropertySymbol -> listOfNotNull(symbol.javaGetterSymbol.psi, symbol.javaSetterSymbol?.psi)
|
||||
is KaSymbol -> getPsiDeclarations(symbol)
|
||||
is KaSymbol -> symbol.getPsiDeclarations()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+13
-9
@@ -10,6 +10,8 @@ import org.jetbrains.kotlin.analysis.api.symbols.KaBackingFieldSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KaCallableSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KaSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.containingSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.intersectionOverriddenSymbols
|
||||
import org.jetbrains.kotlin.idea.references.KtReference
|
||||
import org.jetbrains.kotlin.idea.references.isConstructorOf
|
||||
import org.jetbrains.kotlin.idea.references.mainReference
|
||||
@@ -29,7 +31,7 @@ internal sealed interface KaBaseReference : KtReference, KaResolvableReferenceBr
|
||||
fun getResolvedToPsi(analysisSession: KaSession, referenceTargetSymbols: Collection<KaSymbol>): Collection<PsiElement> =
|
||||
with(analysisSession) {
|
||||
referenceTargetSymbols.flatMap { symbol ->
|
||||
getPsiDeclarations(symbol)
|
||||
symbol.getPsiDeclarations()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,22 +70,24 @@ internal sealed interface KaBaseReference : KtReference, KaResolvableReferenceBr
|
||||
}
|
||||
}
|
||||
|
||||
internal fun KaSession.getPsiDeclarations(symbol: KaSymbol): Collection<PsiElement> {
|
||||
context(_: KaSession)
|
||||
internal fun KaSymbol.getPsiDeclarations(): Collection<PsiElement> {
|
||||
val intersectionOverriddenSymbolsOrSingle = when {
|
||||
symbol.origin == KaSymbolOrigin.INTERSECTION_OVERRIDE && symbol is KaCallableSymbol -> symbol.intersectionOverriddenSymbols
|
||||
else -> listOf(symbol)
|
||||
this.origin == KaSymbolOrigin.INTERSECTION_OVERRIDE && this is KaCallableSymbol -> this.intersectionOverriddenSymbols
|
||||
else -> listOf(this)
|
||||
}
|
||||
|
||||
return intersectionOverriddenSymbolsOrSingle.mapNotNull { unwrapPsi(it) }
|
||||
return intersectionOverriddenSymbolsOrSingle.mapNotNull { it.unwrapPsi() }
|
||||
}
|
||||
|
||||
private fun KaSession.unwrapPsi(symbol: KaSymbol): PsiElement? = when {
|
||||
symbol is KaBackingFieldSymbol -> unwrapPsi(symbol.owningProperty)
|
||||
context(_: KaSession)
|
||||
private fun KaSymbol.unwrapPsi(): PsiElement? = when {
|
||||
this is KaBackingFieldSymbol -> this.owningProperty.unwrapPsi()
|
||||
|
||||
// For declarations generated by compiler plugins, `symbol.psi` is undefined and most probably is `null`.
|
||||
// To make the navigation work reasonably for the plugins which generate declarations inside existing
|
||||
// user-defined declarations, we use `containingSymbol` to navigate to the containing declaration.
|
||||
symbol.origin == KaSymbolOrigin.PLUGIN && symbol.psi == null -> symbol.containingSymbol?.let { unwrapPsi(it) }
|
||||
this.origin == KaSymbolOrigin.PLUGIN && this.psi == null -> this.containingSymbol?.unwrapPsi()
|
||||
|
||||
else -> symbol.psi
|
||||
else -> this.psi
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user