From 287c23269a834d21af5ad3cafbc94e554bc8ea70 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Thu, 23 Dec 2021 15:01:45 +0300 Subject: [PATCH] FIR IDE: Make `getContainingPsi` work with `ItLambdaParameter` source It prevented the code completion to work in positions like `"hello".let { }` --- .../components/KtFirSymbolContainingDeclarationProvider.kt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt index a1389810c24..d94c9691aca 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirSymbolContainingDeclarationProvider.kt @@ -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()!! 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}") }