AA: fix PSI finding for FIR callable fake overrides

This commit is contained in:
Mikhail Glukhikh
2023-10-20 18:38:16 +02:00
committed by Space Team
parent 5bd9b282a0
commit cba9f1c559
@@ -10,9 +10,12 @@ import org.jetbrains.kotlin.KtFakeSourceElement
import org.jetbrains.kotlin.KtFakeSourceElementKind import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.KtRealPsiSourceElement import org.jetbrains.kotlin.KtRealPsiSourceElement
import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.FirElement
import org.jetbrains.kotlin.fir.declarations.FirCallableDeclaration
import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.psi
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.unwrapFakeOverridesOrDelegated
private val allowedFakeElementKinds = setOf( private val allowedFakeElementKinds = setOf(
KtFakeSourceElementKind.FromUseSiteTarget, KtFakeSourceElementKind.FromUseSiteTarget,
@@ -33,8 +36,13 @@ internal fun FirElement.getAllowedPsi() = when (val source = source) {
fun FirElement.findPsi(): PsiElement? = fun FirElement.findPsi(): PsiElement? =
getAllowedPsi() getAllowedPsi()
fun FirBasedSymbol<*>.findPsi(): PsiElement? = fun FirBasedSymbol<*>.findPsi(): PsiElement? {
fir.findPsi() ?: FirSyntheticFunctionInterfaceSourceProvider.findPsi(fir) return if (this is FirCallableSymbol<*>) {
fir.unwrapFakeOverridesOrDelegated().findPsi()
} else {
fir.findPsi()
} ?: FirSyntheticFunctionInterfaceSourceProvider.findPsi(fir)
}
/** /**
* Finds [PsiElement] which will be used as go-to referenced element for [KtPsiReference] * Finds [PsiElement] which will be used as go-to referenced element for [KtPsiReference]
@@ -42,5 +50,9 @@ fun FirBasedSymbol<*>.findPsi(): PsiElement? =
* Otherwise, behaves the same way as [findPsi] returns exact PSI declaration corresponding to passed [FirDeclaration] * Otherwise, behaves the same way as [findPsi] returns exact PSI declaration corresponding to passed [FirDeclaration]
*/ */
fun FirDeclaration.findReferencePsi(): PsiElement? { fun FirDeclaration.findReferencePsi(): PsiElement? {
return psi ?: FirSyntheticFunctionInterfaceSourceProvider.findPsi(this) return if (this is FirCallableDeclaration) {
} unwrapFakeOverridesOrDelegated().psi
} else {
psi
} ?: FirSyntheticFunctionInterfaceSourceProvider.findPsi(this)
}