FIR: add missing ArgumentTypeMismatch.isMismatchDueToNullability after rebase
This commit is contained in:
+7
-1
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.lexer.KtTokens
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.model.*
|
||||
import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability
|
||||
import org.jetbrains.kotlin.resolve.calls.tower.isSuccess
|
||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||
import org.jetbrains.kotlin.utils.addIfNotNull
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
@@ -230,7 +231,12 @@ private fun ConstraintSystemError.toDiagnostic(
|
||||
}
|
||||
|
||||
argument?.let {
|
||||
return FirErrors.ARGUMENT_TYPE_MISMATCH.on(it.source ?: source, lowerConeType, upperConeType)
|
||||
return FirErrors.ARGUMENT_TYPE_MISMATCH.on(
|
||||
it.source ?: source,
|
||||
lowerConeType,
|
||||
upperConeType,
|
||||
isArgumentTypeMismatchDueToNullability(lowerConeType, upperConeType, typeContext)
|
||||
)
|
||||
}
|
||||
|
||||
when (position) {
|
||||
|
||||
@@ -333,6 +333,18 @@ private fun Candidate.captureTypeFromExpressionOrNull(argumentType: ConeKotlinTy
|
||||
) as? ConeKotlinType
|
||||
}
|
||||
|
||||
fun isArgumentTypeMismatchDueToNullability(
|
||||
argumentType: ConeKotlinType,
|
||||
actualExpectedType: ConeKotlinType,
|
||||
typeContext: ConeTypeContext
|
||||
): Boolean {
|
||||
return AbstractTypeChecker.isSubtypeOf(
|
||||
typeContext,
|
||||
argumentType,
|
||||
actualExpectedType.withNullability(ConeNullability.NULLABLE, typeContext)
|
||||
)
|
||||
}
|
||||
|
||||
private fun checkApplicabilityForArgumentType(
|
||||
csBuilder: ConstraintSystemBuilder,
|
||||
argument: FirExpression,
|
||||
@@ -375,18 +387,14 @@ private fun checkApplicabilityForArgumentType(
|
||||
return type
|
||||
}
|
||||
|
||||
// Reaching here means argument types mismatch, and we want to record whether it's due to the nullability by checking a subtype
|
||||
// relation with nullable expected type.
|
||||
val isMismatchDueToNullability = argumentType.canBeNull && !actualExpectedType.isNullable && AbstractTypeChecker.isSubtypeOf(
|
||||
context.session.typeContext,
|
||||
argumentType,
|
||||
actualExpectedType.withNullability(ConeNullability.NULLABLE, context.session.typeContext)
|
||||
)
|
||||
|
||||
return ArgumentTypeMismatch(
|
||||
tryGetConeTypeThatCompatibleWithKtType(actualExpectedType),
|
||||
tryGetConeTypeThatCompatibleWithKtType(argumentType),
|
||||
argument,
|
||||
isMismatchDueToNullability
|
||||
// Reaching here means argument types mismatch, and we want to record whether it's due to the nullability by checking a subtype
|
||||
// relation with nullable expected type.
|
||||
isArgumentTypeMismatchDueToNullability(argumentType, actualExpectedType, context.session.typeContext)
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
+11
-5
@@ -8,15 +8,14 @@ package org.jetbrains.kotlin.fir.resolve.inference
|
||||
import org.jetbrains.kotlin.fir.FirSession
|
||||
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
||||
import org.jetbrains.kotlin.fir.expressions.FirCallableReferenceAccess
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.ArgumentTypeMismatch
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.Candidate
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.CheckerSink
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.ResolutionContext
|
||||
import org.jetbrains.kotlin.fir.resolve.calls.*
|
||||
import org.jetbrains.kotlin.fir.resolve.createFunctionalType
|
||||
import org.jetbrains.kotlin.fir.resolve.inference.model.ConeArgumentConstraintPosition
|
||||
import org.jetbrains.kotlin.fir.typeContext
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.ConstraintSystemBuilder
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.addSubtypeConstraintIfCompatible
|
||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
|
||||
fun Candidate.preprocessLambdaArgument(
|
||||
@@ -57,7 +56,14 @@ fun Candidate.preprocessLambdaArgument(
|
||||
csBuilder.addSubtypeConstraint(lambdaType, expectedType, position)
|
||||
} else {
|
||||
if (!csBuilder.addSubtypeConstraintIfCompatible(lambdaType, expectedType, position)) {
|
||||
sink.reportDiagnostic(ArgumentTypeMismatch(lambdaType, expectedType, argument))
|
||||
sink.reportDiagnostic(
|
||||
ArgumentTypeMismatch(
|
||||
lambdaType,
|
||||
expectedType,
|
||||
argument,
|
||||
isArgumentTypeMismatchDueToNullability(lambdaType, expectedType, context.session.typeContext)
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user