From 2e6500d8480ee57f5f7bc0221b3f7c4da9cee52d Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 12 Nov 2012 18:22:37 +0400 Subject: [PATCH] Retain data flow info after in (contains) #KT-2825 In Progress --- .../BasicExpressionTypingVisitor.java | 28 +++++++++++++++---- .../ExpressionTypingVisitorDispatcher.java | 2 +- .../BinaryExpressionContainsConvention.kt | 5 ++++ .../checkers/JetDiagnosticsTestGenerated.java | 5 ++++ 4 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/dataFlowInfoTraversal/BinaryExpressionContainsConvention.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 c7179acd18c..da041f7fdb1 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 @@ -19,6 +19,7 @@ package org.jetbrains.jet.lang.types.expressions; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.intellij.lang.ASTNode; +import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; @@ -1143,7 +1144,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { result = ErrorUtils.createErrorType("No right argument"); // TODO return JetTypeInfo.create(null, dataFlowInfo); } - checkInExpression(expression, expression.getOperationReference(), expression.getLeft(), expression.getRight(), context); + dataFlowInfo = checkInExpression(expression, expression.getOperationReference(), left, right, context).getSecond(); result = booleanType; } else if (OperatorConventions.BOOLEAN_OPERATIONS.containsKey(operationType)) { @@ -1188,16 +1189,33 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { return DataFlowUtils.checkType(result, expression, contextWithExpectedType, dataFlowInfo); } - public boolean checkInExpression(JetElement callElement, @NotNull JetSimpleNameExpression operationSign, @Nullable JetExpression left, @NotNull JetExpression right, ExpressionTypingContext context) { + @NotNull + public Pair checkInExpression( + JetElement callElement, + @NotNull JetSimpleNameExpression operationSign, + @Nullable JetExpression left, + @NotNull JetExpression right, + ExpressionTypingContext context + ) { + ExpressionTypingContext contextWithNoExpectedType = context.replaceExpectedType(NO_EXPECTED_TYPE); + DataFlowInfo dataFlowInfo = facade.getTypeInfo(right, contextWithNoExpectedType).getDataFlowInfo(); + Name name = Name.identifier("contains"); - ExpressionReceiver receiver = safeGetExpressionReceiver(facade, right, context.replaceExpectedType(NO_EXPECTED_TYPE)); - OverloadResolutionResults resolutionResult = context.resolveCallWithGivenName( + ExpressionReceiver receiver = safeGetExpressionReceiver(facade, right, contextWithNoExpectedType); + ExpressionTypingContext contextWithDataFlow = context.replaceDataFlowInfo(dataFlowInfo); + + OverloadResolutionResults resolutionResult = contextWithDataFlow.resolveCallWithGivenName( CallMaker.makeCallWithExpressions(callElement, receiver, null, operationSign, Collections.singletonList(left)), operationSign, name); JetType containsType = OverloadResolutionResultsUtil.getResultType(resolutionResult); ensureBooleanResult(operationSign, name, containsType, context); - return resolutionResult.isSuccess(); + + if (left != null) { + dataFlowInfo = facade.getTypeInfo(left, contextWithDataFlow).getDataFlowInfo(); + } + + return Pair.create(resolutionResult.isSuccess(), dataFlowInfo); } private void ensureNonemptyIntersectionOfOperandTypes(JetBinaryExpression expression, ExpressionTypingContext context) { diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorDispatcher.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorDispatcher.java index fcaa738f1ef..e2eeccb6c78 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorDispatcher.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingVisitorDispatcher.java @@ -74,7 +74,7 @@ public class ExpressionTypingVisitorDispatcher extends JetVisitor