FIR: Fix inference for case of non-nullable RHS of elvis
Some existing tests start failing after previous commits adding @Exact
attribute to `?:`
They have a form:
var x: String? = nullable()
if (x == null) {
x = nullable() ?: "" // considering @Exact the whole elvis is inferred to nullable from expect type
}
x.length // should be smart cast
This commit is contained in:
committed by
teamcityserver
parent
883b18a0c6
commit
3ec7866ead
+1
-1
@@ -14,7 +14,7 @@ FILE: ifElvisReturn.kt
|
|||||||
R|<local>/b|
|
R|<local>/b|
|
||||||
}
|
}
|
||||||
else -> {
|
else -> {
|
||||||
R|/materialize|<R|kotlin/Nothing|>() ?: ^foo Unit
|
R|/materialize|<R|B|>() ?: ^foo Unit
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+14
@@ -243,6 +243,20 @@ class FirControlFlowStatementsResolveTransformer(transformer: FirBodyResolveTran
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
session.typeContext.run {
|
||||||
|
if (result.typeRef.coneTypeSafe<ConeKotlinType>()?.isNullableType() == true
|
||||||
|
&& result.rhs.typeRef.coneTypeSafe<ConeKotlinType>()?.isNullableType() == false
|
||||||
|
) {
|
||||||
|
// Sometimes return type for special call for elvis operator might be nullable,
|
||||||
|
// but result is not nullable if the right type is not nullable
|
||||||
|
result.replaceTypeRef(
|
||||||
|
result.typeRef.withReplacedConeType(result.typeRef.coneType.makeConeTypeDefinitelyNotNullOrNotNull(session.typeContext))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dataFlowAnalyzer.exitElvis(elvisExpression)
|
dataFlowAnalyzer.exitElvis(elvisExpression)
|
||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user