FIR diagnostics: extract mapUnsafeCallError

This commit is contained in:
Mikhail Glukhikh
2021-03-11 17:49:56 +03:00
parent bb790195a2
commit 1f15ce2d26
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.declarations.isInfix
import org.jetbrains.kotlin.fir.declarations.isOperator import org.jetbrains.kotlin.fir.declarations.isOperator
import org.jetbrains.kotlin.fir.diagnostics.* import org.jetbrains.kotlin.fir.diagnostics.*
import org.jetbrains.kotlin.fir.resolve.calls.InapplicableWrongReceiver import org.jetbrains.kotlin.fir.resolve.calls.InapplicableWrongReceiver
import org.jetbrains.kotlin.fir.resolve.calls.ResolutionDiagnostic
import org.jetbrains.kotlin.fir.resolve.calls.VarargArgumentOutsideParentheses import org.jetbrains.kotlin.fir.resolve.calls.VarargArgumentOutsideParentheses
import org.jetbrains.kotlin.fir.resolve.diagnostics.* import org.jetbrains.kotlin.fir.resolve.diagnostics.*
import org.jetbrains.kotlin.fir.types.* import org.jetbrains.kotlin.fir.types.*
@@ -62,12 +63,11 @@ private fun ConeKotlinType.isEffectivelyNotNull(): Boolean {
} }
} }
private fun mapInapplicableCandidateError( private fun mapUnsafeCallError(
diagnostic: ConeInapplicableCandidateError, diagnostic: ConeInapplicableCandidateError,
source: FirSourceElement, source: FirSourceElement,
): FirDiagnostic<*> { rootCause: ResolutionDiagnostic?,
// TODO: Need to distinguish SMARTCAST_IMPOSSIBLE ): FirDiagnostic<*>? {
val rootCause = diagnostic.candidate.diagnostics.find { it.applicability == diagnostic.applicability }
if (rootCause != null && if (rootCause != null &&
rootCause is InapplicableWrongReceiver && rootCause is InapplicableWrongReceiver &&
rootCause.actualType?.isNullable == true && rootCause.actualType?.isNullable == true &&
@@ -96,6 +96,16 @@ private fun mapInapplicableCandidateError(
return FirErrors.UNSAFE_CALL.on(source, rootCause.actualType!!) return FirErrors.UNSAFE_CALL.on(source, rootCause.actualType!!)
} }
return null
}
private fun mapInapplicableCandidateError(
diagnostic: ConeInapplicableCandidateError,
source: FirSourceElement,
): FirDiagnostic<*> {
// TODO: Need to distinguish SMARTCAST_IMPOSSIBLE
val rootCause = diagnostic.candidate.diagnostics.find { it.applicability == diagnostic.applicability }
mapUnsafeCallError(diagnostic, source, rootCause)?.let { return it }
return when (rootCause) { return when (rootCause) {
is VarargArgumentOutsideParentheses -> FirErrors.VARARG_OUTSIDE_PARENTHESES.on(rootCause.argument.source ?: source) is VarargArgumentOutsideParentheses -> FirErrors.VARARG_OUTSIDE_PARENTHESES.on(rootCause.argument.source ?: source)