[Analysis API FIR] add additional information to exceptions from call resolution
This commit is contained in:
+18
-4
@@ -69,6 +69,7 @@ import org.jetbrains.kotlin.util.OperatorNameConventions.EQUALS
|
|||||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
|
import org.jetbrains.kotlin.analysis.utils.errors.buildErrorWithAttachment
|
||||||
|
import org.jetbrains.kotlin.analysis.utils.errors.shouldIjPlatformExceptionBeRethrown
|
||||||
import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry
|
import org.jetbrains.kotlin.analysis.utils.errors.withPsiEntry
|
||||||
|
|
||||||
internal class KtFirCallResolver(
|
internal class KtFirCallResolver(
|
||||||
@@ -85,7 +86,7 @@ internal class KtFirCallResolver(
|
|||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun resolveCall(psi: KtElement): KtCallInfo? {
|
override fun resolveCall(psi: KtElement): KtCallInfo? = wrapError(psi) {
|
||||||
val ktCallInfos = getCallInfo(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall ->
|
val ktCallInfos = getCallInfo(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall ->
|
||||||
listOfNotNull(
|
listOfNotNull(
|
||||||
toKtCallInfo(
|
toKtCallInfo(
|
||||||
@@ -96,7 +97,7 @@ internal class KtFirCallResolver(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
check(ktCallInfos.size <= 1) { "Should only return 1 KtCallInfo" }
|
check(ktCallInfos.size <= 1) { "Should only return 1 KtCallInfo" }
|
||||||
return ktCallInfos.singleOrNull()
|
ktCallInfos.singleOrNull()
|
||||||
}
|
}
|
||||||
|
|
||||||
private inline fun <T> getCallInfo(
|
private inline fun <T> getCallInfo(
|
||||||
@@ -792,8 +793,8 @@ internal class KtFirCallResolver(
|
|||||||
return mapOf(typeParameter to elementType)
|
return mapOf(typeParameter to elementType)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun collectCallCandidates(psi: KtElement): List<KtCallCandidateInfo> {
|
override fun collectCallCandidates(psi: KtElement): List<KtCallCandidateInfo> = wrapError(psi) {
|
||||||
return getCallInfo(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall ->
|
getCallInfo(psi) { psiToResolve, resolveCalleeExpressionOfFunctionCall, resolveFragmentOfCall ->
|
||||||
collectCallCandidates(
|
collectCallCandidates(
|
||||||
psiToResolve,
|
psiToResolve,
|
||||||
resolveCalleeExpressionOfFunctionCall,
|
resolveCalleeExpressionOfFunctionCall,
|
||||||
@@ -1172,4 +1173,17 @@ internal class KtFirCallResolver(
|
|||||||
psi.getOrBuildFir(firResolveSession)?.let { withFirEntry("fir", it) }
|
psi.getOrBuildFir(firResolveSession)?.let { withFirEntry("fir", it) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private inline fun <R> 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) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user