FIR IDE: Make getContainingPsi work with ItLambdaParameter source

It prevented the code completion to work in positions like
`"hello".let { <caret> }`
This commit is contained in:
Roman Golyshev
2021-12-23 15:01:45 +03:00
committed by teamcity
parent 1dd76fa637
commit 287c23269a
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.fir.components
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.KtFakeSourceElementKind
import org.jetbrains.kotlin.KtRealSourceElementKind
import org.jetbrains.kotlin.analysis.api.assertIsValidAndAccessible
import org.jetbrains.kotlin.analysis.api.components.KtSymbolContainingDeclarationProvider
import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSession
import org.jetbrains.kotlin.analysis.api.fir.symbols.KtFirReceiverParameterSymbol
@@ -22,6 +23,7 @@ import org.jetbrains.kotlin.fir.declarations.FirDeclaration
import org.jetbrains.kotlin.psi
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtDestructuringDeclaration
import org.jetbrains.kotlin.psi.KtFunctionLiteral
import org.jetbrains.kotlin.psi.KtPrimaryConstructor
import org.jetbrains.kotlin.psi.KtProperty
@@ -30,6 +32,8 @@ internal class KtFirSymbolContainingDeclarationProvider(
override val token: ValidityToken,
) : KtSymbolContainingDeclarationProvider(), KtFirAnalysisSessionComponent {
override fun getContainingDeclaration(symbol: KtSymbol): KtSymbolWithKind? {
assertIsValidAndAccessible()
if (symbol is KtReceiverParameterSymbol) {
return (symbol as KtFirReceiverParameterSymbol).firRef.withFir {
firSymbolBuilder.buildSymbol(it) as KtSymbolWithKind
@@ -93,6 +97,7 @@ internal class KtFirSymbolContainingDeclarationProvider(
return source.psi as KtDeclaration
KtFakeSourceElementKind.PropertyFromParameter -> return source.psi?.parentOfType<KtPrimaryConstructor>()!!
KtFakeSourceElementKind.DefaultAccessor -> return source.psi as KtProperty
KtFakeSourceElementKind.ItLambdaParameter -> return source.psi as KtFunctionLiteral
KtRealSourceElementKind -> source.psi!!
else -> error("Unexpected FirSourceElement: kind=${source.kind} element=${source.psi!!::class.simpleName}")
}