diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt index dbda1b43848..e5d9b2a9ee6 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirCallResolver.kt @@ -69,6 +69,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.safeAs import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment +import org.jetbrains.kotlin.analysis.utils.errors.shouldIjPlatformExceptionBeRethrown import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry internal class KtFirCallResolver( @@ -85,7 +86,7 @@ internal class KtFirCallResolver( result } - override fun resolveCall(psi: KtElement): KtCallInfo? { + override fun resolveCall(psi: KtElement): KtCallInfo? = wrapError(psi) { val ktCallInfos = getCallInfo(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall -> listOfNotNull( toKtCallInfo( @@ -96,7 +97,7 @@ internal class KtFirCallResolver( ) } check(ktCallInfos.size <= 1) { "Should only return 1 KtCallInfo" } - return ktCallInfos.singleOrNull() + ktCallInfos.singleOrNull() } private inline fun getCallInfo( @@ -792,8 +793,8 @@ internal class KtFirCallResolver( return mapOf(typeParameter to elementType) } - override fun collectCallCandidates(psi: KtElement): List { - return getCallInfo(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall -> + override fun collectCallCandidates(psi: KtElement): List = wrapError(psi) { + getCallInfo(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall -> collectCallCandidates( psiToResolve, resolveCalleeExpressionOfFunctionCall, @@ -1172,4 +1173,17 @@ internal class KtFirCallResolver( psi.getOrBuildFir(firResolveSession)?.let { withFirEntry("fir", it) } } } + + private inline fun wrapError(element: KtElement, action: () -> R): R { + return try { + action() + } catch (e: Throwable) { + if (shouldIjPlatformExceptionBeRethrown(e)) throw e + buildErrorWithAttachment("Error during resolving call ${element::class.java.name}", cause = e) { + withPsiEntry("psi", element) + element.getOrBuildFir(firResolveSession)?.let { withFirEntry("fir", it) } + } + } + + } }