Condition do not declare variables any more
This commit is contained in:
+1
-1
@@ -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 ||");
|
||||||
|
|||||||
+5
-5
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user