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 34b4b035276..dda016dbf63 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 @@ -1023,7 +1023,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor { else if (OperatorConventions.BOOLEAN_OPERATIONS.containsKey(operationType)) { JetType leftType = facade.getTypeInfo(left, context.replaceScope(context.scope)).getType(); WritableScopeImpl leftScope = newWritableScopeImpl(context, "Left scope of && or ||"); - DataFlowInfo flowInfoLeft = DataFlowUtils.extractDataFlowInfoFromCondition(left, operationType == JetTokens.ANDAND, leftScope, context); // TODO: This gets computed twice: here and in extractDataFlowInfoFromCondition() for the whole condition + DataFlowInfo flowInfoLeft = DataFlowUtils.extractDataFlowInfoFromCondition(left, operationType == JetTokens.ANDAND, context); // TODO: This gets computed twice: here and in extractDataFlowInfoFromCondition() for the whole condition WritableScopeImpl rightScope = operationType == JetTokens.ANDAND ? leftScope : newWritableScopeImpl(context, "Right scope of && or ||"); 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 a6ff90c604d..a3c5164af49 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 @@ -92,8 +92,8 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { WritableScopeImpl thenScope = newWritableScopeImpl(context, "Then scope"); WritableScopeImpl elseScope = newWritableScopeImpl(context, "Else scope"); - DataFlowInfo thenInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, true, thenScope, context); - DataFlowInfo elseInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, null, context); + DataFlowInfo thenInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, true, context); + DataFlowInfo elseInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, context); if (elseBranch == null) { if (thenBranch != null) { @@ -162,12 +162,12 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { JetExpression body = expression.getBody(); if (body != null) { WritableScopeImpl scopeToExtend = newWritableScopeImpl(context, "Scope extended in while's condition"); - DataFlowInfo conditionInfo = condition == null ? context.dataFlowInfo : DataFlowUtils.extractDataFlowInfoFromCondition(condition, true, scopeToExtend, context); + DataFlowInfo conditionInfo = condition == null ? context.dataFlowInfo : DataFlowUtils.extractDataFlowInfoFromCondition(condition, true, context); context.expressionTypingServices.getBlockReturnedTypeWithWritableScope(scopeToExtend, Collections.singletonList(body), CoercionStrategy.NO_COERCION, context.replaceDataFlowInfo(conditionInfo), context.trace); } DataFlowInfo dataFlowInfo; if (!containsBreak(expression, context)) { - dataFlowInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, null, context); + dataFlowInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, context); } else { dataFlowInfo = context.dataFlowInfo; @@ -237,7 +237,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor { checkCondition(conditionScope, condition, context); DataFlowInfo dataFlowInfo; if (!containsBreak(expression, context)) { - dataFlowInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, null, context); + dataFlowInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, context); } else { dataFlowInfo = context.dataFlowInfo; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DataFlowUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DataFlowUtils.java index 2eca636263b..d33b36fdadd 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DataFlowUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/DataFlowUtils.java @@ -25,7 +25,6 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowInfo; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowValue; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowValueFactory; -import org.jetbrains.jet.lang.resolve.scopes.WritableScope; import org.jetbrains.jet.lang.types.ErrorUtils; import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetTypeInfo; @@ -45,7 +44,7 @@ public class DataFlowUtils { } @NotNull - public static DataFlowInfo extractDataFlowInfoFromCondition(@Nullable JetExpression condition, final boolean conditionValue, @Nullable final WritableScope scopeToExtend, final ExpressionTypingContext context) { + public static DataFlowInfo extractDataFlowInfoFromCondition(@Nullable JetExpression condition, final boolean conditionValue, final ExpressionTypingContext context) { if (condition == null) return context.dataFlowInfo; final Ref result = new Ref(null); condition.accept(new JetVisitorVoid() { @@ -60,18 +59,11 @@ public class DataFlowUtils { public void visitBinaryExpression(JetBinaryExpression expression) { IElementType operationToken = expression.getOperationToken(); if (OperatorConventions.BOOLEAN_OPERATIONS.containsKey(operationToken)) { - WritableScope actualScopeToExtend; - if (operationToken == JetTokens.ANDAND) { - actualScopeToExtend = conditionValue ? scopeToExtend : null; - } - else { - actualScopeToExtend = conditionValue ? null : scopeToExtend; - } - DataFlowInfo dataFlowInfo = extractDataFlowInfoFromCondition(expression.getLeft(), conditionValue, actualScopeToExtend, context); + DataFlowInfo dataFlowInfo = extractDataFlowInfoFromCondition(expression.getLeft(), conditionValue, context); JetExpression expressionRight = expression.getRight(); if (expressionRight != null) { - DataFlowInfo rightInfo = extractDataFlowInfoFromCondition(expressionRight, conditionValue, actualScopeToExtend, context); + DataFlowInfo rightInfo = extractDataFlowInfoFromCondition(expressionRight, conditionValue, context); DataFlowInfo.CompositionOperator operator; if (operationToken == JetTokens.ANDAND) { operator = conditionValue ? DataFlowInfo.AND : DataFlowInfo.OR; @@ -122,7 +114,7 @@ public class DataFlowUtils { if (operationTokenType == JetTokens.EXCL) { JetExpression baseExpression = expression.getBaseExpression(); if (baseExpression != null) { - result.set(extractDataFlowInfoFromCondition(baseExpression, !conditionValue, scopeToExtend, context)); + result.set(extractDataFlowInfoFromCondition(baseExpression, !conditionValue, context)); } } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java index b562bc982ff..23e69de0113 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/PatternMatchingTypingVisitor.java @@ -235,8 +235,8 @@ public class PatternMatchingTypingVisitor extends ExpressionTypingVisitor { context.trace.report(TYPE_MISMATCH_IN_CONDITION.on(expression, type)); } else { - DataFlowInfo ifInfo = DataFlowUtils.extractDataFlowInfoFromCondition(expression, true, null, context); - DataFlowInfo elseInfo = DataFlowUtils.extractDataFlowInfoFromCondition(expression, false, null, context); + DataFlowInfo ifInfo = DataFlowUtils.extractDataFlowInfoFromCondition(expression, true, context); + DataFlowInfo elseInfo = DataFlowUtils.extractDataFlowInfoFromCondition(expression, false, context); return new DataFlowInfos(ifInfo, elseInfo); } return noChange(context);