Handle nullable case in '==' with smart cast using safe call
This commit is contained in:
+11
@@ -30,7 +30,9 @@ import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.psiUtil.endOffset
|
||||
import org.jetbrains.kotlin.psi.psiUtil.startOffset
|
||||
import org.jetbrains.kotlin.psi2ir.containsNull
|
||||
import org.jetbrains.kotlin.psi2ir.findSingleFunction
|
||||
import org.jetbrains.kotlin.psi2ir.intermediate.safeCallOnDispatchReceiver
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
|
||||
import org.jetbrains.kotlin.resolve.checkers.PrimitiveNumericComparisonInfo
|
||||
@@ -277,6 +279,15 @@ class OperatorExpressionGenerator(statementGenerator: StatementGenerator) : Stat
|
||||
operandType == targetType || operandNNType == targetType ->
|
||||
this
|
||||
|
||||
type.containsNull() ->
|
||||
safeCallOnDispatchReceiver(this@OperatorExpressionGenerator, startOffset, endOffset) { dispatchReceiver ->
|
||||
invokeConversionFunction(
|
||||
startOffset, endOffset,
|
||||
conversionFunction ?: throw AssertionError("No conversion function for $type ~> $targetType"),
|
||||
dispatchReceiver
|
||||
)
|
||||
}
|
||||
|
||||
else ->
|
||||
invokeConversionFunction(
|
||||
startOffset, endOffset,
|
||||
|
||||
+17
-1
@@ -67,4 +67,20 @@ class SafeCallReceiver(
|
||||
|
||||
return irBlock
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
fun IrExpression.safeCallOnDispatchReceiver(
|
||||
generator: GeneratorWithScope,
|
||||
startOffset: Int,
|
||||
endOffset: Int,
|
||||
ifNotNull: (IrExpression) -> IrExpression
|
||||
) =
|
||||
SafeCallReceiver(
|
||||
generator, startOffset, endOffset,
|
||||
extensionReceiver = null,
|
||||
dispatchReceiver = OnceExpressionValue(this),
|
||||
isAssignmentReceiver = false
|
||||
).call { dispatchReceiverValue, _ ->
|
||||
ifNotNull(dispatchReceiverValue!!.load())
|
||||
}
|
||||
Reference in New Issue
Block a user