Condition do not declare variables any more

This commit is contained in:
Andrey Breslav
2012-09-05 15:04:49 +04:00
parent 6de633d0cb
commit 7c4322cd2c
4 changed files with 12 additions and 20 deletions
@@ -1023,7 +1023,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
else if (OperatorConventions.BOOLEAN_OPERATIONS.containsKey(operationType)) { else if (OperatorConventions.BOOLEAN_OPERATIONS.containsKey(operationType)) {
JetType leftType = facade.getTypeInfo(left, context.replaceScope(context.scope)).getType(); JetType leftType = facade.getTypeInfo(left, context.replaceScope(context.scope)).getType();
WritableScopeImpl leftScope = newWritableScopeImpl(context, "Left scope of && or ||"); 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 WritableScopeImpl rightScope = operationType == JetTokens.ANDAND
? leftScope ? leftScope
: newWritableScopeImpl(context, "Right scope of && or ||"); : newWritableScopeImpl(context, "Right scope of && or ||");
@@ -92,8 +92,8 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
WritableScopeImpl thenScope = newWritableScopeImpl(context, "Then scope"); WritableScopeImpl thenScope = newWritableScopeImpl(context, "Then scope");
WritableScopeImpl elseScope = newWritableScopeImpl(context, "Else scope"); WritableScopeImpl elseScope = newWritableScopeImpl(context, "Else scope");
DataFlowInfo thenInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, true, thenScope, context); DataFlowInfo thenInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, true, context);
DataFlowInfo elseInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, null, context); DataFlowInfo elseInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, context);
if (elseBranch == null) { if (elseBranch == null) {
if (thenBranch != null) { if (thenBranch != null) {
@@ -162,12 +162,12 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
JetExpression body = expression.getBody(); JetExpression body = expression.getBody();
if (body != null) { if (body != null) {
WritableScopeImpl scopeToExtend = newWritableScopeImpl(context, "Scope extended in while's condition"); 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); context.expressionTypingServices.getBlockReturnedTypeWithWritableScope(scopeToExtend, Collections.singletonList(body), CoercionStrategy.NO_COERCION, context.replaceDataFlowInfo(conditionInfo), context.trace);
} }
DataFlowInfo dataFlowInfo; DataFlowInfo dataFlowInfo;
if (!containsBreak(expression, context)) { if (!containsBreak(expression, context)) {
dataFlowInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, null, context); dataFlowInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, context);
} }
else { else {
dataFlowInfo = context.dataFlowInfo; dataFlowInfo = context.dataFlowInfo;
@@ -237,7 +237,7 @@ public class ControlStructureTypingVisitor extends ExpressionTypingVisitor {
checkCondition(conditionScope, condition, context); checkCondition(conditionScope, condition, context);
DataFlowInfo dataFlowInfo; DataFlowInfo dataFlowInfo;
if (!containsBreak(expression, context)) { if (!containsBreak(expression, context)) {
dataFlowInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, null, context); dataFlowInfo = DataFlowUtils.extractDataFlowInfoFromCondition(condition, false, context);
} }
else { else {
dataFlowInfo = context.dataFlowInfo; dataFlowInfo = context.dataFlowInfo;
@@ -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.DataFlowInfo;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowValue; import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowValue;
import org.jetbrains.jet.lang.resolve.calls.autocasts.DataFlowValueFactory; 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.ErrorUtils;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.JetTypeInfo; import org.jetbrains.jet.lang.types.JetTypeInfo;
@@ -45,7 +44,7 @@ public class DataFlowUtils {
} }
@NotNull @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; if (condition == null) return context.dataFlowInfo;
final Ref<DataFlowInfo> result = new Ref<DataFlowInfo>(null); final Ref<DataFlowInfo> result = new Ref<DataFlowInfo>(null);
condition.accept(new JetVisitorVoid() { condition.accept(new JetVisitorVoid() {
@@ -60,18 +59,11 @@ public class DataFlowUtils {
public void visitBinaryExpression(JetBinaryExpression expression) { public void visitBinaryExpression(JetBinaryExpression expression) {
IElementType operationToken = expression.getOperationToken(); IElementType operationToken = expression.getOperationToken();
if (OperatorConventions.BOOLEAN_OPERATIONS.containsKey(operationToken)) { 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(); JetExpression expressionRight = expression.getRight();
if (expressionRight != null) { if (expressionRight != null) {
DataFlowInfo rightInfo = extractDataFlowInfoFromCondition(expressionRight, conditionValue, actualScopeToExtend, context); DataFlowInfo rightInfo = extractDataFlowInfoFromCondition(expressionRight, conditionValue, context);
DataFlowInfo.CompositionOperator operator; DataFlowInfo.CompositionOperator operator;
if (operationToken == JetTokens.ANDAND) { if (operationToken == JetTokens.ANDAND) {
operator = conditionValue ? DataFlowInfo.AND : DataFlowInfo.OR; operator = conditionValue ? DataFlowInfo.AND : DataFlowInfo.OR;
@@ -122,7 +114,7 @@ public class DataFlowUtils {
if (operationTokenType == JetTokens.EXCL) { if (operationTokenType == JetTokens.EXCL) {
JetExpression baseExpression = expression.getBaseExpression(); JetExpression baseExpression = expression.getBaseExpression();
if (baseExpression != null) { if (baseExpression != null) {
result.set(extractDataFlowInfoFromCondition(baseExpression, !conditionValue, scopeToExtend, context)); result.set(extractDataFlowInfoFromCondition(baseExpression, !conditionValue, context));
} }
} }
} }
@@ -235,8 +235,8 @@ public class PatternMatchingTypingVisitor extends ExpressionTypingVisitor {
context.trace.report(TYPE_MISMATCH_IN_CONDITION.on(expression, type)); context.trace.report(TYPE_MISMATCH_IN_CONDITION.on(expression, type));
} }
else { else {
DataFlowInfo ifInfo = DataFlowUtils.extractDataFlowInfoFromCondition(expression, true, null, context); DataFlowInfo ifInfo = DataFlowUtils.extractDataFlowInfoFromCondition(expression, true, context);
DataFlowInfo elseInfo = DataFlowUtils.extractDataFlowInfoFromCondition(expression, false, null, context); DataFlowInfo elseInfo = DataFlowUtils.extractDataFlowInfoFromCondition(expression, false, context);
return new DataFlowInfos(ifInfo, elseInfo); return new DataFlowInfos(ifInfo, elseInfo);
} }
return noChange(context); return noChange(context);