From 27b1f1ddad08fd13df12618a643c6b71e6077b44 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 7 Apr 2015 17:20:11 +0300 Subject: [PATCH] Test and implementation for KT-6819. Now when entry condition data flow information is used for subsequent conditions. #KT-6819 Fixed --- .../types/expressions/PatternMatchingTypingVisitor.java | 4 +++- .../diagnostics/tests/smartCasts/varnotnull/kt6819.kt | 7 +++++++ .../diagnostics/tests/smartCasts/varnotnull/kt6819.txt | 3 +++ .../kotlin/checkers/JetDiagnosticsTestGenerated.java | 6 ++++++ 4 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.kt create mode 100644 compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PatternMatchingTypingVisitor.java b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PatternMatchingTypingVisitor.java index e46728049ed..b12b0b1123d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PatternMatchingTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/kotlin/types/expressions/PatternMatchingTypingVisitor.java @@ -143,15 +143,17 @@ public class PatternMatchingTypingVisitor extends ExpressionTypingVisitor { } DataFlowInfos infos = null; + ExpressionTypingContext contextForCondition = context; for (JetWhenCondition condition : whenEntry.getConditions()) { DataFlowInfos conditionInfos = checkWhenCondition(subjectExpression, subjectType, condition, - context, subjectDataFlowValue); + contextForCondition, subjectDataFlowValue); if (infos != null) { infos = new DataFlowInfos(infos.thenInfo.or(conditionInfos.thenInfo), infos.elseInfo.and(conditionInfos.elseInfo)); } else { infos = conditionInfos; } + contextForCondition = contextForCondition.replaceDataFlowInfo(conditionInfos.elseInfo); } return infos != null ? infos : new DataFlowInfos(context.dataFlowInfo); } diff --git a/compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.kt b/compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.kt new file mode 100644 index 00000000000..d32ad6dbb29 --- /dev/null +++ b/compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.kt @@ -0,0 +1,7 @@ +public fun test(o: String?): Boolean { + return when { + // Data flow info should propagate from o == null to o.length() + o == null, o.length() == 0 -> false + else -> true + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.txt b/compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.txt new file mode 100644 index 00000000000..5b4901bc4ba --- /dev/null +++ b/compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.txt @@ -0,0 +1,3 @@ +package + +public fun test(/*0*/ o: kotlin.String?): kotlin.Boolean diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java index 0f6e9994c57..b8e717880d9 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/JetDiagnosticsTestGenerated.java @@ -11412,6 +11412,12 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt5907var.kt"); doTest(fileName); } + + @TestMetadata("kt6819.kt") + public void testKt6819() throws Exception { + String fileName = JetTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/smartCasts/varnotnull/kt6819.kt"); + doTest(fileName); + } } }