From d629fe2d9164e1a49b5081f5969c5fc197905a16 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 13 Nov 2012 18:47:00 +0400 Subject: [PATCH] Retain data flow info after 'for' loop range expressions --- .../types/expressions/ControlStructureTypingVisitor.java | 7 +++++-- .../tests/dataFlowInfoTraversal/ForLoopRange.kt | 6 ++++++ .../jet/checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/dataFlowInfoTraversal/ForLoopRange.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java index 1c1372cc39d..46d99b312d9 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ControlStructureTypingVisitor.java @@ -258,8 +258,10 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { ExpressionTypingContext context = contextWithExpectedType.replaceExpectedType(TypeUtils.NO_EXPECTED_TYPE); JetExpression loopRange = expression.getLoopRange(); JetType expectedParameterType = null; + DataFlowInfo dataFlowInfo = context.dataFlowInfo; if (loopRange != null) { ExpressionReceiver loopRangeReceiver = getExpressionReceiver(facade, loopRange, context.replaceScope(context.scope)); + dataFlowInfo = facade.getTypeInfo(loopRange, context).getDataFlowInfo(); if (loopRangeReceiver != null) { expectedParameterType = checkIterableConvention(loopRangeReceiver, context); } @@ -284,10 +286,11 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { JetExpression body = expression.getBody(); if (body != null) { - context.expressionTypingServices.getBlockReturnedTypeWithWritableScope(loopScope, Collections.singletonList(body), CoercionStrategy.NO_COERCION, context, context.trace); + context.expressionTypingServices.getBlockReturnedTypeWithWritableScope(loopScope, Collections.singletonList(body), + CoercionStrategy.NO_COERCION, context.replaceDataFlowInfo(dataFlowInfo), context.trace); } - return DataFlowUtils.checkType(KotlinBuiltIns.getInstance().getUnitType(), expression, contextWithExpectedType, context.dataFlowInfo); + return DataFlowUtils.checkType(KotlinBuiltIns.getInstance().getUnitType(), expression, contextWithExpectedType, dataFlowInfo); } private static VariableDescriptor createLoopParameterDescriptor( diff --git a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/ForLoopRange.kt b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/ForLoopRange.kt new file mode 100644 index 00000000000..4999262a9e2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/ForLoopRange.kt @@ -0,0 +1,6 @@ +fun foo(arr: Array?) { + for (x in arr!!) { + arr : Array + } + arr : Array +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 83274659366..5fc6beb0084 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1231,6 +1231,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/For.kt"); } + @TestMetadata("ForLoopRange.kt") + public void testForLoopRange() throws Exception { + doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/ForLoopRange.kt"); + } + @TestMetadata("FunctionLiteral.kt") public void testFunctionLiteral() throws Exception { doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/FunctionLiteral.kt");