diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirAnalysisSessionComponent.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirAnalysisSessionComponent.kt index a59a96e917f..585447bd126 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirAnalysisSessionComponent.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirAnalysisSessionComponent.kt @@ -43,8 +43,13 @@ internal interface KtFirAnalysisSessionComponent { fun FirPsiDiagnostic.asKtDiagnostic(): KtDiagnosticWithPsi<*> = KT_DIAGNOSTIC_CONVERTER.convert(analysisSession, this as FirDiagnostic) - fun ConeDiagnostic.asKtDiagnostic(source: FirSourceElement, qualifiedAccessSource: FirSourceElement?): KtDiagnosticWithPsi<*>? { + fun ConeDiagnostic.asKtDiagnostic( + source: FirSourceElement, + qualifiedAccessSource: FirSourceElement?, + diagnosticCache: MutableList + ): KtDiagnosticWithPsi<*>? { val firDiagnostic = toFirDiagnostics(source, qualifiedAccessSource).firstOrNull() ?: return null + diagnosticCache += firDiagnostic check(firDiagnostic is FirPsiDiagnostic) return firDiagnostic.asKtDiagnostic() } diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCallResolver.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCallResolver.kt index f15575560d6..bd0a8944ba6 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCallResolver.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirCallResolver.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.components import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.fir.FirSourceElement +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic import org.jetbrains.kotlin.fir.expressions.* import org.jetbrains.kotlin.fir.realPsi import org.jetbrains.kotlin.fir.references.FirErrorNamedReference @@ -39,6 +40,7 @@ internal class KtFirCallResolver( override val analysisSession: KtFirAnalysisSession, override val token: ValidityToken, ) : KtCallResolver(), KtFirAnalysisSessionComponent { + private val diagnosticCache = mutableListOf() override fun resolveCall(call: KtBinaryExpression): KtCall? = withValidityAssertion { when (val fir = call.getOrBuildFir(firResolveState)) { @@ -180,13 +182,15 @@ internal class KtFirCallResolver( private fun FirErrorNamedReference.createErrorCallTarget(qualifiedAccessSource: FirSourceElement?): KtErrorCallTarget = KtErrorCallTarget( getCandidateSymbols().mapNotNull { it.fir.buildSymbol(firSymbolBuilder) as? KtFunctionLikeSymbol }, - source?.let { diagnostic.asKtDiagnostic(it, qualifiedAccessSource) } ?: KtNonBoundToPsiErrorDiagnostic(factoryName = null, diagnostic.reason, token) + source?.let { diagnostic.asKtDiagnostic(it, qualifiedAccessSource, diagnosticCache) } + ?: KtNonBoundToPsiErrorDiagnostic(factoryName = null, diagnostic.reason, token) ) private fun FirErrorReferenceWithCandidate.createErrorCallTarget(qualifiedAccessSource: FirSourceElement?): KtErrorCallTarget = KtErrorCallTarget( getCandidateSymbols().mapNotNull { it.fir.buildSymbol(firSymbolBuilder) as? KtFunctionLikeSymbol }, - source?.let { diagnostic.asKtDiagnostic(it,qualifiedAccessSource) } ?: KtNonBoundToPsiErrorDiagnostic(factoryName = null, diagnostic.reason, token) + source?.let { diagnostic.asKtDiagnostic(it, qualifiedAccessSource, diagnosticCache) } + ?: KtNonBoundToPsiErrorDiagnostic(factoryName = null, diagnostic.reason, token) ) private fun FirResolvedNamedReference.getKtFunctionOrConstructorSymbol(): KtFunctionLikeSymbol? = diff --git a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirDiagnosticProvider.kt b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirDiagnosticProvider.kt index 58da2b16cb5..cd3db1b382f 100644 --- a/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirDiagnosticProvider.kt +++ b/idea/idea-frontend-fir/src/org/jetbrains/kotlin/idea/frontend/api/fir/components/KtFirDiagnosticProvider.kt @@ -5,6 +5,7 @@ package org.jetbrains.kotlin.idea.frontend.api.fir.components +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirDiagnostic import org.jetbrains.kotlin.idea.fir.low.level.api.api.DiagnosticCheckerFilter import org.jetbrains.kotlin.idea.fir.low.level.api.api.collectDiagnosticsForFile import org.jetbrains.kotlin.idea.fir.low.level.api.api.getDiagnostics @@ -21,6 +22,7 @@ internal class KtFirDiagnosticProvider( override val analysisSession: KtFirAnalysisSession, override val token: ValidityToken, ) : KtDiagnosticProvider(), KtFirAnalysisSessionComponent { + override fun getDiagnosticsForElement( element: KtElement, filter: KtDiagnosticCheckerFilter