From 3cbdb57d5c192e531afa07e3d80784700b6d285d Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Wed, 7 Nov 2012 19:36:46 +0400 Subject: [PATCH] Retain data flow info after assignments in initializer #KT-2825 In Progress --- .../ExpressionTypingVisitorForStatements.java | 9 +++++--- .../AssignmentInInitializer.kt | 21 +++++++++++++++++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 +++++ 3 files changed, 32 insertions(+), 3 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/dataFlowInfoTraversal/AssignmentInInitializer.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java index f7e82616fd8..16cb1f03b2d 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorForStatements.java @@ -24,6 +24,7 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.diagnostics.Errors; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.*; +import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResults; import org.jetbrains.jet.lang.resolve.calls.results.OverloadResolutionResultsUtil; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; @@ -109,9 +110,11 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito VariableDescriptor propertyDescriptor = context.expressionTypingServices.getDescriptorResolver(). resolveLocalVariableDescriptor(scope.getContainingDeclaration(), scope, property, context.dataFlowInfo, context.trace); JetExpression initializer = property.getInitializer(); - if (property.getTypeRef() != null && initializer != null) { + DataFlowInfo dataFlowInfo = context.dataFlowInfo; + if (initializer != null) { JetType outType = propertyDescriptor.getType(); - facade.getTypeInfo(initializer, context.replaceExpectedType(outType).replaceScope(scope)).getType(); + JetTypeInfo typeInfo = facade.getTypeInfo(initializer, context.replaceExpectedType(outType).replaceScope(scope)); + dataFlowInfo = typeInfo.getDataFlowInfo(); } { @@ -121,7 +124,7 @@ public class ExpressionTypingVisitorForStatements extends ExpressionTypingVisito scope.addVariableDescriptor(propertyDescriptor); ModifiersChecker.create(context.trace).checkModifiersForLocalDeclaration(property); - return DataFlowUtils.checkStatementType(property, context, context.dataFlowInfo); + return DataFlowUtils.checkStatementType(property, context, dataFlowInfo); } @Override diff --git a/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/AssignmentInInitializer.kt b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/AssignmentInInitializer.kt new file mode 100644 index 00000000000..b99f106811b --- /dev/null +++ b/compiler/testData/diagnostics/tests/dataFlowInfoTraversal/AssignmentInInitializer.kt @@ -0,0 +1,21 @@ +// KT-2825 DataFlowInfo is not retained after assignment + +trait A + +trait B : A { + fun foo() +} + +fun baz(b: B) = b + +fun bar1(a: A) { + val b = a as B + a.foo() + b.foo() +} + +fun bar2(a: A) { + val b = baz(a as B) + a.foo() + b.foo() +} diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 79225fa9abb..23ec4925be5 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1141,6 +1141,11 @@ public class JetDiagnosticsTestGenerated extends AbstractDiagnosticsTestWithEage doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/ArrayAccess.kt"); } + @TestMetadata("AssignmentInInitializer.kt") + public void testAssignmentInInitializer() throws Exception { + doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/AssignmentInInitializer.kt"); + } + @TestMetadata("BinaryExpression.kt") public void testBinaryExpression() throws Exception { doTest("compiler/testData/diagnostics/tests/dataFlowInfoTraversal/BinaryExpression.kt");