Fix false USELESS_CAST in function with expression body
Note that current behaviour is made similar to the case with properties initializers/accessors, which means that more complex cases are not covered yet (see KT-20801) #KT-20802 fixed.
This commit is contained in:
@@ -272,8 +272,9 @@ object CastDiagnosticsUtil {
|
||||
// in unary expression, left argument can be a receiver
|
||||
is KtBinaryExpression, is KtUnaryExpression -> true
|
||||
|
||||
// Previously we've checked that there is no expected type, therefore cast in property has an effect on inference
|
||||
is KtProperty, is KtPropertyAccessor -> true
|
||||
// Previously we've checked that there is no expected type, therefore cast in property or
|
||||
// in function has an effect on inference and thus isn't useless
|
||||
is KtProperty, is KtPropertyAccessor, is KtNamedFunction, is KtFunctionLiteral -> true
|
||||
|
||||
else -> false
|
||||
}
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
fun <T> id(x: T): T = x
|
||||
|
||||
fun foo() = 1 as Any
|
||||
fun bar() = id(1) as Any
|
||||
fun baz() = (1 + 1) as Any
|
||||
|
||||
val functionLiteral1 = fun() = 1 as Any
|
||||
val functionLiteral2 = fun() = id(1) as Any
|
||||
val functionLiteral3 = fun() = (1 + 1) as Any
|
||||
|
||||
// TODO: this and more complex cases are not supported yet
|
||||
fun baz(b: Boolean) = if (b) 1 <!USELESS_CAST!>as Any<!> else 42 <!USELESS_CAST!>as Any?<!>
|
||||
@@ -0,0 +1,10 @@
|
||||
package
|
||||
|
||||
public val functionLiteral1: () -> kotlin.Any
|
||||
public val functionLiteral2: () -> kotlin.Any
|
||||
public val functionLiteral3: () -> kotlin.Any
|
||||
public fun bar(): kotlin.Any
|
||||
public fun baz(): kotlin.Any
|
||||
public fun baz(/*0*/ b: kotlin.Boolean): kotlin.Any?
|
||||
public fun foo(): kotlin.Any
|
||||
public fun </*0*/ T> id(/*0*/ x: T): T
|
||||
+6
-6
@@ -23,9 +23,9 @@ fun test() {
|
||||
val f = TODO() as Interface
|
||||
}
|
||||
|
||||
fun a() = TODO() <!USELESS_CAST!>as Any<!>
|
||||
fun b() = TODO() <!USELESS_CAST!>as Any?<!>
|
||||
fun c() = TODO() <!USELESS_CAST!>as OpenClass<!>
|
||||
fun d() = TODO() <!USELESS_CAST!>as FinalClass<!>
|
||||
fun e() = TODO() <!USELESS_CAST!>as AbstractClass<!>
|
||||
fun f() = TODO() <!USELESS_CAST!>as Interface<!>
|
||||
fun a() = TODO() as Any
|
||||
fun b() = TODO() as Any?
|
||||
fun c() = TODO() as OpenClass
|
||||
fun d() = TODO() as FinalClass
|
||||
fun e() = TODO() as AbstractClass
|
||||
fun f() = TODO() as Interface
|
||||
|
||||
@@ -2776,6 +2776,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("AsInExpressionBody.kt")
|
||||
public void testAsInExpressionBody() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/cast/AsInExpressionBody.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("AsInPropertyAndPropertyAccessor.kt")
|
||||
public void testAsInPropertyAndPropertyAccessor() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/cast/AsInPropertyAndPropertyAccessor.kt");
|
||||
|
||||
+6
@@ -2776,6 +2776,12 @@ public class DiagnosticsUsingJavacTestGenerated extends AbstractDiagnosticsUsing
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("AsInExpressionBody.kt")
|
||||
public void testAsInExpressionBody() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/cast/AsInExpressionBody.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("AsInPropertyAndPropertyAccessor.kt")
|
||||
public void testAsInPropertyAndPropertyAccessor() throws Exception {
|
||||
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/cast/AsInPropertyAndPropertyAccessor.kt");
|
||||
|
||||
Reference in New Issue
Block a user