From 68b4b8e946811f0713f23a6a0da5e783f52c47a2 Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Fri, 6 Jun 2014 13:55:24 +0400 Subject: [PATCH] KT-5182 Data flow info is lost for 'when' branches #KT-5158 Fixed #KT-4332 Fixed --- .../PatternMatchingTypingVisitor.java | 2 +- .../{WhenEntry.kt => WhenEntryAs.kt} | 2 +- .../dataFlowInfoTraversal/WhenEntryIs.kt | 24 +++++++++++++++++++ .../kt4332WhenBranches.kt | 9 +++++++ .../kt5182WhenBranches.kt | 13 ++++++++++ .../tests/nullabilityAndAutoCasts/kt2146.kt | 3 ++- .../checkers/JetDiagnosticsTestGenerated.java | 21 +++++++++++++--- 7 files changed, 68 insertions(+), 6 deletions(-) rename compiler/testData/diagnostics/tests/dataFlowInfoTraversal/{WhenEntry.kt => WhenEntryAs.kt} (92%) create mode 100644 compiler/testData/diagnostics/tests/dataFlowInfoTraversal/WhenEntryIs.kt create mode 100644 compiler/testData/diagnostics/tests/dataFlowInfoTraversal/kt4332WhenBranches.kt create mode 100644 compiler/testData/diagnostics/tests/dataFlowInfoTraversal/kt5182WhenBranches.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java index 60a491ae8dd..89dc437e390 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java @@ -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); } diff --git a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/WhenEntry.kt b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/WhenEntryAs.kt similarity index 92% rename from compiler/testData/diagnostics/tests/dataFlowInfoTraversal/WhenEntry.kt rename to compiler/testData/diagnostics/tests/dataFlowInfoTraversal/WhenEntryAs.kt index 0beb0170e89..36da7973f9d 100644 --- a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/WhenEntry.kt +++ b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/WhenEntryAs.kt @@ -4,7 +4,7 @@ fun foo(x: Number, y: Int) { y -> {} else -> {} } - x : Int + x : Int } fun bar(x: Number) { diff --git a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/WhenEntryIs.kt b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/WhenEntryIs.kt new file mode 100644 index 00000000000..77e4aa1f263 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/WhenEntryIs.kt @@ -0,0 +1,24 @@ +fun foo(x: Number, y: Int) { + when (x) { + is Int -> x : Int + y -> {} + else -> {} + } + x : Int +} + +fun bar(x: Number) { + when (x) { + is Int -> x : Int + else -> {} + } + x : Int +} + +fun whenWithoutSubject(x: Number) { + when { + (x is Int) -> x : Int + else -> {} + } + x : Int +} diff --git a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/kt4332WhenBranches.kt b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/kt4332WhenBranches.kt new file mode 100644 index 00000000000..37abb72c123 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/kt4332WhenBranches.kt @@ -0,0 +1,9 @@ +//KT-4332 when/autocast underperforms + +fun testWhen(t: String?, x: String?): Int { + return when { + t == null -> 0 + x == null -> 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 -> (t + x).length + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/kt5182WhenBranches.kt b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/kt5182WhenBranches.kt new file mode 100644 index 00000000000..5ed592bc268 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/kt5182WhenBranches.kt @@ -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 -> a.foo() //'foo' is unresolved, smart cast doesn't work + else -> a.foo() +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt2146.kt b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt2146.kt index f7d5bf56374..f4927096c3a 100644 --- a/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt2146.kt +++ b/compiler/testData/diagnostics/tests/nullabilityAndAutoCasts/kt2146.kt @@ -32,8 +32,9 @@ fun f4(s: Int?): Int { fun f5(s: Int?): Int { return when (s) { - s!! -> s s -> s + s!! -> s + s -> s else -> 0 } } diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 4e46d64d01a..c6ed8fc219c 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -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")