KT-5182 Data flow info is lost for 'when' branches
#KT-5158 Fixed #KT-4332 Fixed
This commit is contained in:
+1
-1
@@ -106,7 +106,7 @@ public class PatternMatchingTypingVisitor extends ExpressionTypingVisitor {
|
||||
dataFlowInfoForEntryBody = elseDataFlowInfo;
|
||||
}
|
||||
else {
|
||||
dataFlowInfoForEntryBody = infosForCondition.thenInfo;
|
||||
dataFlowInfoForEntryBody = infosForCondition.thenInfo.and(elseDataFlowInfo);
|
||||
elseDataFlowInfo = elseDataFlowInfo.and(infosForCondition.elseInfo);
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -4,7 +4,7 @@ fun foo(x: Number, y: Int) {
|
||||
y -> {}
|
||||
else -> {}
|
||||
}
|
||||
<!TYPE_MISMATCH!>x<!> : Int
|
||||
<!DEBUG_INFO_AUTOCAST!>x<!> : Int
|
||||
}
|
||||
|
||||
fun bar(x: Number) {
|
||||
@@ -0,0 +1,24 @@
|
||||
fun foo(x: Number, y: Int) {
|
||||
when (x) {
|
||||
is Int -> <!DEBUG_INFO_AUTOCAST!>x<!> : Int
|
||||
y -> {}
|
||||
else -> {}
|
||||
}
|
||||
<!TYPE_MISMATCH!>x<!> : Int
|
||||
}
|
||||
|
||||
fun bar(x: Number) {
|
||||
when (x) {
|
||||
is Int -> <!DEBUG_INFO_AUTOCAST!>x<!> : Int
|
||||
else -> {}
|
||||
}
|
||||
<!TYPE_MISMATCH!>x<!> : Int
|
||||
}
|
||||
|
||||
fun whenWithoutSubject(x: Number) {
|
||||
when {
|
||||
(x is Int) -> <!DEBUG_INFO_AUTOCAST!>x<!> : Int
|
||||
else -> {}
|
||||
}
|
||||
<!TYPE_MISMATCH!>x<!> : Int
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
//KT-4332 when/autocast underperforms
|
||||
|
||||
fun testWhen(t: String?, x: String?): Int {
|
||||
return when {
|
||||
t == null -> 0
|
||||
x == null -> <!DEBUG_INFO_AUTOCAST!>t<!>.length // Wrong error report here. t can be inferred as not-null. (And it actually does if you replace when with if/else if)
|
||||
else -> (<!DEBUG_INFO_AUTOCAST!>t<!> + x).length
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
//KT-5182 Data flow info is lost for 'when' branches
|
||||
|
||||
open class A
|
||||
|
||||
class B: A() {
|
||||
fun foo() = 1
|
||||
}
|
||||
|
||||
fun foo(a: A) = when {
|
||||
a !is B -> 2
|
||||
true -> <!DEBUG_INFO_AUTOCAST!>a<!>.foo() //'foo' is unresolved, smart cast doesn't work
|
||||
else -> <!DEBUG_INFO_AUTOCAST!>a<!>.foo()
|
||||
}
|
||||
@@ -32,8 +32,9 @@ fun f4(s: Int?): Int {
|
||||
|
||||
fun f5(s: Int?): Int {
|
||||
return when (s) {
|
||||
s!! -> <!DEBUG_INFO_AUTOCAST!>s<!>
|
||||
s -> <!TYPE_MISMATCH!>s<!>
|
||||
s!! -> <!DEBUG_INFO_AUTOCAST!>s<!>
|
||||
s -> <!DEBUG_INFO_AUTOCAST!>s<!>
|
||||
else -> 0
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2014,6 +2014,16 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
|
||||
doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/IsExpression.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt4332WhenBranches.kt")
|
||||
public void testKt4332WhenBranches() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/kt4332WhenBranches.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("kt5182WhenBranches.kt")
|
||||
public void testKt5182WhenBranches() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/kt5182WhenBranches.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("ManyIfs.kt")
|
||||
public void testManyIfs() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/ManyIfs.kt");
|
||||
@@ -2074,9 +2084,14 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest {
|
||||
doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/When.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("WhenEntry.kt")
|
||||
public void testWhenEntry() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/WhenEntry.kt");
|
||||
@TestMetadata("WhenEntryAs.kt")
|
||||
public void testWhenEntryAs() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/WhenEntryAs.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("WhenEntryIs.kt")
|
||||
public void testWhenEntryIs() throws Exception {
|
||||
doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/WhenEntryIs.kt");
|
||||
}
|
||||
|
||||
@TestMetadata("WhenIn.kt")
|
||||
|
||||
Reference in New Issue
Block a user