[FIR] Comparison to String implies smart cast to String

When the left-hand side of an equality comparison is known to be a
String, and the equality condition resolves to true, then the right-hand
side can be smart-cast to a String as well. This was working for String
expressions on the left-hand side but not for String constants.

^KT-57513 Fixed
This commit is contained in:
Brian Norman
2023-10-03 14:37:12 -05:00
committed by Space Team
parent c19fc3ced3
commit ccda8ae23d
5 changed files with 89 additions and 6 deletions
@@ -23,3 +23,31 @@ fun gav(i: TestWithEquals?, j: TestWithEquals?) {
if (i == j) foo(i)
}
}
fun string(foo: Any) {
val string = ""
if ("" == foo) foo.length
if (string == foo) foo.length
if (foo == "") foo.<!UNRESOLVED_REFERENCE!>length<!>
}
fun int(foo: Any) {
val int = 1
if (1 == foo) foo.<!UNRESOLVED_REFERENCE!>plus<!>(1)
if (int == foo) foo.<!UNRESOLVED_REFERENCE!>plus<!>(1)
if (foo == 1) foo.<!UNRESOLVED_REFERENCE!>plus<!>(1)
}
fun long(foo: Any) {
val long = 1L
if (1L == foo) foo.<!UNRESOLVED_REFERENCE!>plus<!>(1L)
if (long == foo) foo.<!UNRESOLVED_REFERENCE!>plus<!>(1L)
if (foo == 1L) foo.<!UNRESOLVED_REFERENCE!>plus<!>(1L)
}
fun char(foo: Any) {
val char = 'a'
if ('a' == foo) foo.<!UNRESOLVED_REFERENCE!>compareTo<!>('a')
if (char == foo) foo.<!UNRESOLVED_REFERENCE!>compareTo<!>('a')
if (foo == 'a') foo.<!UNRESOLVED_REFERENCE!>compareTo<!>('a')
}