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:
Dmitry Savvinov
2017-10-17 13:46:18 +03:00
parent a1778a7da8
commit 58b815d842
6 changed files with 43 additions and 8 deletions
@@ -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
View File
@@ -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");
@@ -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");