From d19a824b14a2933bb68f0b86f6eb3692133b2fa0 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 12 Nov 2012 18:49:07 +0400 Subject: [PATCH] Retain data flow info after elvis operator #KT-2825 In Progress --- .../expressions/BasicExpressionTypingVisitor.java | 10 ++++++---- .../dataFlowInfoTraversal/BinaryExpressionElvis.kt | 14 ++++++++++++++ .../jet/checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 3 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/dataFlowInfoTraversal/BinaryExpressionElvis.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java index 51a206a5bb1..1e0057142f5 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/BasicExpressionTypingVisitor.java @@ -1171,10 +1171,12 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { result = booleanType; } else if (operationType == JetTokens.ELVIS) { - JetType leftType = facade.getTypeInfo(left, context.replaceScope(context.scope)).getType(); - JetType rightType = right == null - ? null - : facade.getTypeInfo(right, contextWithExpectedType.replaceScope(context.scope)).getType(); + JetTypeInfo leftTypeInfo = facade.getTypeInfo(left, context); + JetType leftType = leftTypeInfo.getType(); + dataFlowInfo = leftTypeInfo.getDataFlowInfo(); + + ExpressionTypingContext newContext = contextWithExpectedType.replaceDataFlowInfo(dataFlowInfo).replaceScope(context.scope); + JetType rightType = right == null ? null : facade.getTypeInfo(right, newContext).getType(); if (leftType != null) { if (!leftType.isNullable()) { context.trace.report(USELESS_ELVIS.on(left, leftType)); diff --git a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/BinaryExpressionElvis.kt b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/BinaryExpressionElvis.kt new file mode 100644 index 00000000000..f9940025c3b --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/BinaryExpressionElvis.kt @@ -0,0 +1,14 @@ +fun foo(x: Int?): Int = x!! + +fun elvis(x: Number?): Int { + val result = (x as Int?) ?: foo(x) + x : Int? + return result +} + + +fun elvisWithRHSTypeInfo(x: Number?): Any? { + val result = x ?: x!! + x : Int? + return result +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 6b638f03ff4..79225fa9abb 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1161,6 +1161,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/BinaryExpressionContainsConvention.kt"); } + @TestMetadata("BinaryExpressionElvis.kt") + public void testBinaryExpressionElvis() throws Exception { + doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/BinaryExpressionElvis.kt"); + } + @TestMetadata("BinaryExpressionEqualsConvention.kt") public void testBinaryExpressionEqualsConvention() throws Exception { doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/BinaryExpressionEqualsConvention.kt");