mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-05-19 20:37:00 -05:00
Fix issues in analysis of do..while and for..in/for..of
This commit is contained in:
@@ -636,6 +636,9 @@ namespace ts {
|
||||
}
|
||||
|
||||
function createFlowCondition(antecedent: FlowNode, expression: Expression, assumeTrue: boolean): FlowNode {
|
||||
if (antecedent.kind === FlowKind.Unreachable) {
|
||||
return antecedent;
|
||||
}
|
||||
if (!expression) {
|
||||
return assumeTrue ? antecedent : unreachableFlow;
|
||||
}
|
||||
@@ -696,16 +699,19 @@ namespace ts {
|
||||
|
||||
function bindDoStatement(node: DoStatement): void {
|
||||
const preDoLabel = createFlowLabel();
|
||||
const preConditionLabel = createFlowLabel();
|
||||
const postDoLabel = createFlowLabel();
|
||||
addAntecedent(preDoLabel, currentFlow);
|
||||
currentFlow = preDoLabel;
|
||||
const saveBreakTarget = breakTarget;
|
||||
const saveContinueTarget = continueTarget;
|
||||
breakTarget = postDoLabel;
|
||||
continueTarget = preDoLabel;
|
||||
continueTarget = preConditionLabel;
|
||||
bind(node.statement);
|
||||
breakTarget = saveBreakTarget;
|
||||
continueTarget = saveContinueTarget;
|
||||
addAntecedent(preConditionLabel, currentFlow);
|
||||
currentFlow = finishFlow(preConditionLabel);
|
||||
bind(node.expression);
|
||||
addAntecedent(preDoLabel, createFlowCondition(currentFlow, node.expression, /*assumeTrue*/ true));
|
||||
addAntecedent(postDoLabel, createFlowCondition(currentFlow, node.expression, /*assumeTrue*/ false));
|
||||
@@ -737,10 +743,10 @@ namespace ts {
|
||||
const preLoopLabel = createFlowLabel();
|
||||
const postLoopLabel = createFlowLabel();
|
||||
bind(node.initializer);
|
||||
bind(node.expression);
|
||||
addAntecedent(preLoopLabel, currentFlow);
|
||||
addAntecedent(postLoopLabel, currentFlow);
|
||||
currentFlow = preLoopLabel;
|
||||
bind(node.expression);
|
||||
addAntecedent(postLoopLabel, currentFlow);
|
||||
const saveBreakTarget = breakTarget;
|
||||
const saveContinueTarget = continueTarget;
|
||||
breakTarget = postLoopLabel;
|
||||
@@ -750,7 +756,6 @@ namespace ts {
|
||||
breakTarget = saveBreakTarget;
|
||||
continueTarget = saveContinueTarget;
|
||||
addAntecedent(preLoopLabel, currentFlow);
|
||||
addAntecedent(postLoopLabel, currentFlow);
|
||||
currentFlow = finishFlow(postLoopLabel);
|
||||
}
|
||||
|
||||
|
||||
@@ -8674,7 +8674,9 @@ namespace ts {
|
||||
const parent = node.parent;
|
||||
return parent.kind === SyntaxKind.BinaryExpression &&
|
||||
(<BinaryExpression>parent).operatorToken.kind === SyntaxKind.EqualsToken &&
|
||||
(<BinaryExpression>parent).left === node;
|
||||
(<BinaryExpression>parent).left === node ||
|
||||
(parent.kind === SyntaxKind.ForInStatement || parent.kind === SyntaxKind.ForOfStatement) &&
|
||||
(<ForInStatement | ForOfStatement>parent).initializer === node;
|
||||
}
|
||||
|
||||
function checkSpreadElementExpression(node: SpreadElementExpression, contextualMapper?: TypeMapper): Type {
|
||||
|
||||
Reference in New Issue
Block a user