FIR: Add nullability smartcast after !is check

^KT-39072 Fixed
This commit is contained in:
Denis Zharkov
2020-06-11 13:44:09 +03:00
parent 24948a8b3f
commit 7b61bf9178
5 changed files with 57 additions and 4 deletions
@@ -237,7 +237,8 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
when (val operation = typeOperatorCall.operation) {
FirOperation.IS, FirOperation.NOT_IS -> {
val expressionVariable = variableStorage.createSyntheticVariable(typeOperatorCall)
val isNotNullCheck = operation == FirOperation.IS && type.nullability == ConeNullability.NOT_NULL
val isNotNullCheck = type.nullability == ConeNullability.NOT_NULL
val isRegularIs = operation == FirOperation.IS
if (operandVariable.isReal()) {
val hasTypeInfo = operandVariable typeEq type
val hasNotTypeInfo = operandVariable typeNotEq type
@@ -252,13 +253,13 @@ abstract class FirDataFlowAnalyzer<FLOW : Flow>(
flow.addTypeStatement(operandVariable typeEq any)
}
if (isNotNullCheck) {
flow.addImplication((expressionVariable eq true) implies (operandVariable typeEq any))
flow.addImplication((expressionVariable eq true) implies (operandVariable notEq null))
flow.addImplication((expressionVariable eq isRegularIs) implies (operandVariable typeEq any))
flow.addImplication((expressionVariable eq isRegularIs) implies (operandVariable notEq null))
}
} else {
if (isNotNullCheck) {
flow.addImplication((expressionVariable eq true) implies (operandVariable notEq null))
flow.addImplication((expressionVariable eq isRegularIs) implies (operandVariable notEq null))
}
}
}