From 88c68be12d4cedbc69c384f0de6e8af27a8ab2d5 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Sat, 6 Aug 2022 21:05:32 +0200 Subject: [PATCH] [Analysis API FIR] add additional information to exceptions from call resolution --- .../api/fir/components/KtFirCallResolver.kt | 22 +++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) 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) } + } + } + + } }