Accurate representation of smart casts on complex expressions

This commit is contained in:
Mikhail Glukhikh
2015-12-08 17:30:01 +03:00
parent 7cd867b936
commit 745a3aeeac
11 changed files with 102 additions and 2 deletions
@@ -0,0 +1,9 @@
fun baz(s: String?): Int {
if (s == null) return 0
return when(s) {
"abc" -> s
else -> "xyz"
}.length
}
fun box() = if (baz("abc") == 3 && baz("") == 3 && baz(null) == 0) "OK" else "FAIL"
@@ -0,0 +1,10 @@
fun baz(s: String?): Int {
return <!DEBUG_INFO_SMARTCAST!>if (s == null) {
""
}
else {
val u: String? = null
if (u == null) return 0
u
}<!>.length
}
@@ -0,0 +1,3 @@
package
public fun baz(/*0*/ s: kotlin.String?): kotlin.Int
@@ -0,0 +1,20 @@
// Smart casts on complex expressions
fun baz(s: String?): Int {
if (s == null) return 0
return <!DEBUG_INFO_SMARTCAST!>when(<!DEBUG_INFO_SMARTCAST!>s<!>) {
"abc" -> s
else -> "xyz"
}<!>.length
}
var ss: String? = null
fun bar(): Int {
if (ss == null) return 0
// ss cannot be smart casted, so an error here
return when(ss) {
"abc" -> ss
else -> "xyz"
}<!UNSAFE_CALL!>.<!>length
}
@@ -0,0 +1,5 @@
package
public var ss: kotlin.String?
public fun bar(): kotlin.Int
public fun baz(/*0*/ s: kotlin.String?): kotlin.Int
@@ -15225,6 +15225,18 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest {
doTest(fileName);
}
@TestMetadata("smartCastOnIf.kt")
public void testSmartCastOnIf() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/smartCastOnIf.kt");
doTest(fileName);
}
@TestMetadata("smartCastOnWhen.kt")
public void testSmartCastOnWhen() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/smartCastOnWhen.kt");
doTest(fileName);
}
@TestMetadata("thisWithLabel.kt")
public void testThisWithLabel() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/thisWithLabel.kt");
@@ -7275,6 +7275,12 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/smartCasts/nullSmartCast.kt");
doTest(fileName);
}
@TestMetadata("whenSmartCast.kt")
public void testWhenSmartCast() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/codegen/box/smartCasts/whenSmartCast.kt");
doTest(fileName);
}
}
@TestMetadata("compiler/testData/codegen/box/specialBuiltins")