From 2872a0799aa55c043a114bbac567f03d0fbcc060 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Tue, 13 Nov 2012 15:19:53 +0400 Subject: [PATCH] Retain data flow info after string template expressions --- .../types/expressions/BasicExpressionTypingVisitor.java | 8 ++++++-- .../tests/dataFlowInfoTraversal/StringTemplate.kt | 6 ++++++ .../jet/checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/dataFlowInfoTraversal/StringTemplate.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 1e0057142f5..5253c2dce84 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 @@ -1348,6 +1348,9 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { final ExpressionTypingContext context = contextWithExpectedType.replaceExpectedType(NO_EXPECTED_TYPE); final StringBuilder builder = new StringBuilder(); final CompileTimeConstant[] value = new CompileTimeConstant[1]; + final DataFlowInfo[] dataFlowInfo = new DataFlowInfo[1]; + dataFlowInfo[0] = context.dataFlowInfo; + for (JetStringTemplateEntry entry : expression.getEntries()) { entry.accept(new JetVisitorVoid() { @@ -1355,7 +1358,8 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { public void visitStringTemplateEntryWithExpression(JetStringTemplateEntryWithExpression entry) { JetExpression entryExpression = entry.getExpression(); if (entryExpression != null) { - facade.getTypeInfo(entryExpression, context); + JetTypeInfo typeInfo = facade.getTypeInfo(entryExpression, context.replaceDataFlowInfo(dataFlowInfo[0])); + dataFlowInfo[0] = typeInfo.getDataFlowInfo(); } value[0] = CompileTimeConstantResolver.OUT_OF_RANGE; } @@ -1383,7 +1387,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { if (value[0] != CompileTimeConstantResolver.OUT_OF_RANGE) { context.trace.record(BindingContext.COMPILE_TIME_VALUE, expression, new StringValue(builder.toString())); } - return DataFlowUtils.checkType(KotlinBuiltIns.getInstance().getStringType(), expression, contextWithExpectedType, context.dataFlowInfo); + return DataFlowUtils.checkType(KotlinBuiltIns.getInstance().getStringType(), expression, contextWithExpectedType, dataFlowInfo[0]); } @Override diff --git a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/StringTemplate.kt b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/StringTemplate.kt new file mode 100644 index 00000000000..5b81085f6ce --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/StringTemplate.kt @@ -0,0 +1,6 @@ +fun foo(x: Number, y: String?): String { + val result = "abcde $x ${x as Int} ${y!!} $x $y" + x : Int + y : String + return result +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index f010019fbb6..86ef6b9add7 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1261,6 +1261,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/Return.kt"); } + @TestMetadata("StringTemplate.kt") + public void testStringTemplate() throws Exception { + doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/StringTemplate.kt"); + } + @TestMetadata("ThisSuper.kt") public void testThisSuper() throws Exception { doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/ThisSuper.kt");