FIR diagnostics: extract mapUnsafeCallError
This commit is contained in:
+14
-4
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user