[FIR] Fix missing USELESS_CAST

`FirUselessTypeOperationCallChecker` always checks exact types matching for `as` operator

Simplify code of cast checker and utils

^KT-56629 Fixed
^KT-56615 Fixed
^KT-59820 Fixed
This commit is contained in:
Ivan Kochurkin
2023-10-19 20:35:03 +02:00
committed by Space Team
parent 2f8026f335
commit d50c6f1b6d
21 changed files with 209 additions and 121 deletions
@@ -15,7 +15,7 @@ fun test(x: Int?) {
foo(x as? Number)
if (x is Int) {
val b = x as? Int
val b = x <!USELESS_CAST!>as? Int<!>
}
}
@@ -1,51 +0,0 @@
fun asCall() {
1 <!USELESS_CAST!>as Int<!>
1 <!CAST_NEVER_SUCCEEDS!>as<!> Byte
1 <!CAST_NEVER_SUCCEEDS!>as<!> Short
1 <!CAST_NEVER_SUCCEEDS!>as<!> Long
1 <!CAST_NEVER_SUCCEEDS!>as<!> Char
1 <!CAST_NEVER_SUCCEEDS!>as<!> Double
1 <!CAST_NEVER_SUCCEEDS!>as<!> Float
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Int
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Byte
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Short
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Long
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Char
1.0 <!USELESS_CAST!>as Double<!>
1.0 <!CAST_NEVER_SUCCEEDS!>as<!> Float
1f <!CAST_NEVER_SUCCEEDS!>as<!> Int
1f <!CAST_NEVER_SUCCEEDS!>as<!> Byte
1f <!CAST_NEVER_SUCCEEDS!>as<!> Short
1f <!CAST_NEVER_SUCCEEDS!>as<!> Long
1f <!CAST_NEVER_SUCCEEDS!>as<!> Char
1f <!CAST_NEVER_SUCCEEDS!>as<!> Double
1f <!USELESS_CAST!>as Float<!>
}
fun asSafe() {
1 as? Int
1 <!CAST_NEVER_SUCCEEDS!>as?<!> Byte
1 <!CAST_NEVER_SUCCEEDS!>as?<!> Short
1 <!CAST_NEVER_SUCCEEDS!>as?<!> Long
1 <!CAST_NEVER_SUCCEEDS!>as?<!> Char
1 <!CAST_NEVER_SUCCEEDS!>as?<!> Double
1 <!CAST_NEVER_SUCCEEDS!>as?<!> Float
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Int
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Byte
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Short
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Long
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Char
1.0 as? Double
1.0 <!CAST_NEVER_SUCCEEDS!>as?<!> Float
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Int
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Byte
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Short
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Long
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Char
1f <!CAST_NEVER_SUCCEEDS!>as?<!> Double
1f as? Float
}
+1
View File
@@ -1,3 +1,4 @@
// FIR_IDENTICAL
fun asCall() {
1 <!USELESS_CAST!>as Int<!>
1 <!CAST_NEVER_SUCCEEDS!>as<!> Byte
+36
View File
@@ -0,0 +1,36 @@
// ISSUE: KT-56629, KT-56615
class Klass
fun foo(arg: Klass) {
arg <!USELESS_CAST!>as Klass<!>
arg <!USELESS_CAST!>as? Klass<!>
}
fun test_1(a: Any?) {
(a as String?)!!
a.length
(a <!USELESS_CAST!>as? String<!>)!!
a.length
}
fun test_3(a: Any?) {
a as String
a <!USELESS_CAST!>as String<!>
}
fun test_4(a: Any?) {
a as String
a <!USELESS_CAST!>as? String<!>
}
fun test_5(a: Any?) {
(a as? String)!!
a.length
(a <!USELESS_CAST!>as String<!>)
}
fun test_6(a: Any?) {
(a as? String)!!
a.length
(a <!USELESS_CAST!>as? String<!>)
}
+36
View File
@@ -0,0 +1,36 @@
// ISSUE: KT-56629, KT-56615
class Klass
fun foo(arg: Klass) {
arg <!USELESS_CAST!>as Klass<!>
arg <!USELESS_CAST!>as? Klass<!>
}
fun test_1(a: Any?) {
(a as String?)!!
a<!UNSAFE_CALL!>.<!>length
(a <!USELESS_CAST!>as? String<!>)!!
<!DEBUG_INFO_SMARTCAST!>a<!>.length
}
fun test_3(a: Any?) {
a as String
a <!USELESS_CAST!>as String<!>
}
fun test_4(a: Any?) {
a as String
a <!USELESS_CAST!>as? String<!>
}
fun test_5(a: Any?) {
(a as? String)!!
<!DEBUG_INFO_SMARTCAST!>a<!>.length
(a <!USELESS_CAST!>as String<!>)
}
fun test_6(a: Any?) {
(a as? String)!!
<!DEBUG_INFO_SMARTCAST!>a<!>.length
(a <!USELESS_CAST!>as? String<!>)
}