From ff4fca527dab06e89f15c862b9e27de77a3c84ae Mon Sep 17 00:00:00 2001 From: kingwl Date: Thu, 2 Apr 2020 15:33:39 +0800 Subject: [PATCH] Fix cfa --- src/compiler/binder.ts | 14 ++++--- src/compiler/utilities.ts | 2 +- .../logicalAssignment1(target=es2015).types | 10 ++--- .../logicalAssignment1(target=es2020).types | 10 ++--- .../logicalAssignment1(target=esnext).types | 10 ++--- .../logicalAssignment2(target=es2015).types | 38 +++++++++---------- .../logicalAssignment2(target=es2020).types | 38 +++++++++---------- .../logicalAssignment2(target=esnext).types | 38 +++++++++---------- .../logicalAssignment3(target=es2015).types | 22 +++++------ .../logicalAssignment3(target=es2020).types | 22 +++++------ .../logicalAssignment3(target=esnext).types | 22 +++++------ .../logicalAssignment5(target=es2015).types | 8 ++-- .../logicalAssignment5(target=es2020).types | 8 ++-- .../logicalAssignment5(target=esnext).types | 8 ++-- 14 files changed, 126 insertions(+), 124 deletions(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index a7272d8a7e0..599338b1505 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -932,6 +932,9 @@ namespace ts { case SyntaxKind.BinaryExpression: switch ((expr).operatorToken.kind) { case SyntaxKind.EqualsToken: + case SyntaxKind.BarBarEqualsToken: + case SyntaxKind.AmpersandAmpersandEqualsToken: + case SyntaxKind.QuestionQuestionEqualsToken: return isNarrowableOperand((expr).left); case SyntaxKind.CommaToken: return isNarrowableOperand((expr).right); @@ -1047,7 +1050,7 @@ namespace ts { function isLogicalAssignmentExpressioin(node: Node) { while (true) { if (isParenthesizedExpression(node)) { - node = node.expression + node = node.expression; } else { return isBinaryExpression(node) && isLogicalAssignmentOperator(node.operatorToken.kind); @@ -1194,11 +1197,14 @@ namespace ts { else { bindCondition(node.left, trueTarget, preRightLabel); } - currentFlow = finishFlowLabel(preRightLabel); bind(node.operatorToken); + doWithConditionalBranches(bind, node.right, trueTarget, falseTarget); bindAssignmentTargetFlow(node.left); + + addAntecedent(trueTarget, createFlowCondition(FlowFlags.TrueCondition, currentFlow, node)); + addAntecedent(falseTarget, createFlowCondition(FlowFlags.FalseCondition, currentFlow, node)); } function bindReturnOrThrow(node: ReturnStatement | ThrowStatement): void { @@ -1488,10 +1494,6 @@ namespace ts { } function bindBinaryExpressionFlow(node: BinaryExpression) { - const flow = currentFlow - if (flow) { - - } const workStacks: { expr: BinaryExpression[], state: BindBinaryExpressionFlowState[], diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 4448e0f18bb..58a6933429f 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -2594,7 +2594,7 @@ namespace ts { switch (parent.kind) { case SyntaxKind.BinaryExpression: const binaryOperator = (parent).operatorToken.kind; - return isAssignmentOperator(binaryOperator) && (parent).left === node ? + return isAssignmentOperator(binaryOperator) && !isLogicalAssignmentOperator(binaryOperator) && (parent).left === node ? binaryOperator === SyntaxKind.EqualsToken ? AssignmentKind.Definite : AssignmentKind.Compound : AssignmentKind.None; case SyntaxKind.PrefixUnaryExpression: diff --git a/tests/baselines/reference/logicalAssignment1(target=es2015).types b/tests/baselines/reference/logicalAssignment1(target=es2015).types index 98bae7b837c..29a224ecef7 100644 --- a/tests/baselines/reference/logicalAssignment1(target=es2015).types +++ b/tests/baselines/reference/logicalAssignment1(target=es2015).types @@ -60,16 +60,16 @@ f ??= 42 g &&= 42 >g &&= 42 : 0 | 42 ->g : number +>g : 0 | 1 | 42 >42 : 42 h ||= 42 ->h ||= 42 : number ->h : number +>h ||= 42 : 1 | 42 +>h : 0 | 1 | 42 >42 : 42 i ??= 42 ->i ??= 42 : number ->i : number +>i ??= 42 : 0 | 1 | 42 +>i : 0 | 1 | 42 >42 : 42 diff --git a/tests/baselines/reference/logicalAssignment1(target=es2020).types b/tests/baselines/reference/logicalAssignment1(target=es2020).types index 98bae7b837c..29a224ecef7 100644 --- a/tests/baselines/reference/logicalAssignment1(target=es2020).types +++ b/tests/baselines/reference/logicalAssignment1(target=es2020).types @@ -60,16 +60,16 @@ f ??= 42 g &&= 42 >g &&= 42 : 0 | 42 ->g : number +>g : 0 | 1 | 42 >42 : 42 h ||= 42 ->h ||= 42 : number ->h : number +>h ||= 42 : 1 | 42 +>h : 0 | 1 | 42 >42 : 42 i ??= 42 ->i ??= 42 : number ->i : number +>i ??= 42 : 0 | 1 | 42 +>i : 0 | 1 | 42 >42 : 42 diff --git a/tests/baselines/reference/logicalAssignment1(target=esnext).types b/tests/baselines/reference/logicalAssignment1(target=esnext).types index 98bae7b837c..29a224ecef7 100644 --- a/tests/baselines/reference/logicalAssignment1(target=esnext).types +++ b/tests/baselines/reference/logicalAssignment1(target=esnext).types @@ -60,16 +60,16 @@ f ??= 42 g &&= 42 >g &&= 42 : 0 | 42 ->g : number +>g : 0 | 1 | 42 >42 : 42 h ||= 42 ->h ||= 42 : number ->h : number +>h ||= 42 : 1 | 42 +>h : 0 | 1 | 42 >42 : 42 i ??= 42 ->i ??= 42 : number ->i : number +>i ??= 42 : 0 | 1 | 42 +>i : 0 | 1 | 42 >42 : 42 diff --git a/tests/baselines/reference/logicalAssignment2(target=es2015).types b/tests/baselines/reference/logicalAssignment2(target=es2015).types index e0940ed6806..53090c51e59 100644 --- a/tests/baselines/reference/logicalAssignment2(target=es2015).types +++ b/tests/baselines/reference/logicalAssignment2(target=es2015).types @@ -30,34 +30,34 @@ declare const c: A a.baz &&= result.baz >a.baz &&= result.baz : "" | 0 | 1 | 42 | undefined ->a.baz : string | number | undefined +>a.baz : "" | 0 | 1 | 42 | undefined >a : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined b.baz ||= result.baz ->b.baz ||= result.baz : string | number | undefined ->b.baz : string | number | undefined +>b.baz ||= result.baz : "" | 0 | 1 | 42 | undefined +>b.baz : "" | 0 | 1 | 42 | undefined >b : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined c.baz ??= result.baz ->c.baz ??= result.baz : string | number | undefined ->c.baz : string | number | undefined +>c.baz ??= result.baz : "" | 0 | 1 | 42 | undefined +>c.baz : "" | 0 | 1 | 42 | undefined >c : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined a.foo["baz"] &&= result.foo.baz >a.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined ->a.foo["baz"] : string | number | undefined +>a.foo["baz"] : "" | 0 | 1 | 42 | undefined >a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >a : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } @@ -70,7 +70,7 @@ a.foo["baz"] &&= result.foo.baz b.foo["baz"] &&= result.foo.baz >b.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined ->b.foo["baz"] : string | number | undefined +>b.foo["baz"] : "" | 0 | 1 | 42 | undefined >b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >b : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } @@ -83,7 +83,7 @@ b.foo["baz"] &&= result.foo.baz c.foo["baz"] &&= result.foo.baz >c.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined ->c.foo["baz"] : string | number | undefined +>c.foo["baz"] : "" | 0 | 1 | 42 | undefined >c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >c : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } @@ -96,14 +96,14 @@ c.foo["baz"] &&= result.foo.baz a.foo.bar().baz &&= result.foo.bar().baz >a.foo.bar().baz &&= result.foo.bar().baz : "" | 0 | 1 | 42 | undefined ->a.foo.bar().baz : string | number | undefined +>a.foo.bar().baz : "" | 0 | 1 | 42 | undefined >a.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >a.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } >a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >a : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >bar : () => { baz: "" | 0 | 1 | 42 | undefined; } ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.foo.bar().baz : "" | 0 | 1 | 42 | undefined >result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } @@ -114,15 +114,15 @@ a.foo.bar().baz &&= result.foo.bar().baz >baz : "" | 0 | 1 | 42 | undefined b.foo.bar().baz ||= result.foo.bar().baz ->b.foo.bar().baz ||= result.foo.bar().baz : string | number | undefined ->b.foo.bar().baz : string | number | undefined +>b.foo.bar().baz ||= result.foo.bar().baz : "" | 0 | 1 | 42 | undefined +>b.foo.bar().baz : "" | 0 | 1 | 42 | undefined >b.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >b.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } >b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >b : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >bar : () => { baz: "" | 0 | 1 | 42 | undefined; } ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.foo.bar().baz : "" | 0 | 1 | 42 | undefined >result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } @@ -133,15 +133,15 @@ b.foo.bar().baz ||= result.foo.bar().baz >baz : "" | 0 | 1 | 42 | undefined c.foo.bar().baz ??= result.foo.bar().baz ->c.foo.bar().baz ??= result.foo.bar().baz : string | number | undefined ->c.foo.bar().baz : string | number | undefined +>c.foo.bar().baz ??= result.foo.bar().baz : "" | 0 | 1 | 42 | undefined +>c.foo.bar().baz : "" | 0 | 1 | 42 | undefined >c.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >c.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } >c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >c : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >bar : () => { baz: "" | 0 | 1 | 42 | undefined; } ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.foo.bar().baz : "" | 0 | 1 | 42 | undefined >result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } diff --git a/tests/baselines/reference/logicalAssignment2(target=es2020).types b/tests/baselines/reference/logicalAssignment2(target=es2020).types index e0940ed6806..53090c51e59 100644 --- a/tests/baselines/reference/logicalAssignment2(target=es2020).types +++ b/tests/baselines/reference/logicalAssignment2(target=es2020).types @@ -30,34 +30,34 @@ declare const c: A a.baz &&= result.baz >a.baz &&= result.baz : "" | 0 | 1 | 42 | undefined ->a.baz : string | number | undefined +>a.baz : "" | 0 | 1 | 42 | undefined >a : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined b.baz ||= result.baz ->b.baz ||= result.baz : string | number | undefined ->b.baz : string | number | undefined +>b.baz ||= result.baz : "" | 0 | 1 | 42 | undefined +>b.baz : "" | 0 | 1 | 42 | undefined >b : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined c.baz ??= result.baz ->c.baz ??= result.baz : string | number | undefined ->c.baz : string | number | undefined +>c.baz ??= result.baz : "" | 0 | 1 | 42 | undefined +>c.baz : "" | 0 | 1 | 42 | undefined >c : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined a.foo["baz"] &&= result.foo.baz >a.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined ->a.foo["baz"] : string | number | undefined +>a.foo["baz"] : "" | 0 | 1 | 42 | undefined >a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >a : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } @@ -70,7 +70,7 @@ a.foo["baz"] &&= result.foo.baz b.foo["baz"] &&= result.foo.baz >b.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined ->b.foo["baz"] : string | number | undefined +>b.foo["baz"] : "" | 0 | 1 | 42 | undefined >b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >b : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } @@ -83,7 +83,7 @@ b.foo["baz"] &&= result.foo.baz c.foo["baz"] &&= result.foo.baz >c.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined ->c.foo["baz"] : string | number | undefined +>c.foo["baz"] : "" | 0 | 1 | 42 | undefined >c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >c : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } @@ -96,14 +96,14 @@ c.foo["baz"] &&= result.foo.baz a.foo.bar().baz &&= result.foo.bar().baz >a.foo.bar().baz &&= result.foo.bar().baz : "" | 0 | 1 | 42 | undefined ->a.foo.bar().baz : string | number | undefined +>a.foo.bar().baz : "" | 0 | 1 | 42 | undefined >a.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >a.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } >a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >a : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >bar : () => { baz: "" | 0 | 1 | 42 | undefined; } ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.foo.bar().baz : "" | 0 | 1 | 42 | undefined >result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } @@ -114,15 +114,15 @@ a.foo.bar().baz &&= result.foo.bar().baz >baz : "" | 0 | 1 | 42 | undefined b.foo.bar().baz ||= result.foo.bar().baz ->b.foo.bar().baz ||= result.foo.bar().baz : string | number | undefined ->b.foo.bar().baz : string | number | undefined +>b.foo.bar().baz ||= result.foo.bar().baz : "" | 0 | 1 | 42 | undefined +>b.foo.bar().baz : "" | 0 | 1 | 42 | undefined >b.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >b.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } >b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >b : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >bar : () => { baz: "" | 0 | 1 | 42 | undefined; } ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.foo.bar().baz : "" | 0 | 1 | 42 | undefined >result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } @@ -133,15 +133,15 @@ b.foo.bar().baz ||= result.foo.bar().baz >baz : "" | 0 | 1 | 42 | undefined c.foo.bar().baz ??= result.foo.bar().baz ->c.foo.bar().baz ??= result.foo.bar().baz : string | number | undefined ->c.foo.bar().baz : string | number | undefined +>c.foo.bar().baz ??= result.foo.bar().baz : "" | 0 | 1 | 42 | undefined +>c.foo.bar().baz : "" | 0 | 1 | 42 | undefined >c.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >c.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } >c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >c : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >bar : () => { baz: "" | 0 | 1 | 42 | undefined; } ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.foo.bar().baz : "" | 0 | 1 | 42 | undefined >result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } diff --git a/tests/baselines/reference/logicalAssignment2(target=esnext).types b/tests/baselines/reference/logicalAssignment2(target=esnext).types index e0940ed6806..53090c51e59 100644 --- a/tests/baselines/reference/logicalAssignment2(target=esnext).types +++ b/tests/baselines/reference/logicalAssignment2(target=esnext).types @@ -30,34 +30,34 @@ declare const c: A a.baz &&= result.baz >a.baz &&= result.baz : "" | 0 | 1 | 42 | undefined ->a.baz : string | number | undefined +>a.baz : "" | 0 | 1 | 42 | undefined >a : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined b.baz ||= result.baz ->b.baz ||= result.baz : string | number | undefined ->b.baz : string | number | undefined +>b.baz ||= result.baz : "" | 0 | 1 | 42 | undefined +>b.baz : "" | 0 | 1 | 42 | undefined >b : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined c.baz ??= result.baz ->c.baz ??= result.baz : string | number | undefined ->c.baz : string | number | undefined +>c.baz ??= result.baz : "" | 0 | 1 | 42 | undefined +>c.baz : "" | 0 | 1 | 42 | undefined >c : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined a.foo["baz"] &&= result.foo.baz >a.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined ->a.foo["baz"] : string | number | undefined +>a.foo["baz"] : "" | 0 | 1 | 42 | undefined >a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >a : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } @@ -70,7 +70,7 @@ a.foo["baz"] &&= result.foo.baz b.foo["baz"] &&= result.foo.baz >b.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined ->b.foo["baz"] : string | number | undefined +>b.foo["baz"] : "" | 0 | 1 | 42 | undefined >b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >b : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } @@ -83,7 +83,7 @@ b.foo["baz"] &&= result.foo.baz c.foo["baz"] &&= result.foo.baz >c.foo["baz"] &&= result.foo.baz : "" | 0 | 1 | 42 | undefined ->c.foo["baz"] : string | number | undefined +>c.foo["baz"] : "" | 0 | 1 | 42 | undefined >c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >c : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } @@ -96,14 +96,14 @@ c.foo["baz"] &&= result.foo.baz a.foo.bar().baz &&= result.foo.bar().baz >a.foo.bar().baz &&= result.foo.bar().baz : "" | 0 | 1 | 42 | undefined ->a.foo.bar().baz : string | number | undefined +>a.foo.bar().baz : "" | 0 | 1 | 42 | undefined >a.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >a.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } >a.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >a : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >bar : () => { baz: "" | 0 | 1 | 42 | undefined; } ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.foo.bar().baz : "" | 0 | 1 | 42 | undefined >result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } @@ -114,15 +114,15 @@ a.foo.bar().baz &&= result.foo.bar().baz >baz : "" | 0 | 1 | 42 | undefined b.foo.bar().baz ||= result.foo.bar().baz ->b.foo.bar().baz ||= result.foo.bar().baz : string | number | undefined ->b.foo.bar().baz : string | number | undefined +>b.foo.bar().baz ||= result.foo.bar().baz : "" | 0 | 1 | 42 | undefined +>b.foo.bar().baz : "" | 0 | 1 | 42 | undefined >b.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >b.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } >b.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >b : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >bar : () => { baz: "" | 0 | 1 | 42 | undefined; } ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.foo.bar().baz : "" | 0 | 1 | 42 | undefined >result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } @@ -133,15 +133,15 @@ b.foo.bar().baz ||= result.foo.bar().baz >baz : "" | 0 | 1 | 42 | undefined c.foo.bar().baz ??= result.foo.bar().baz ->c.foo.bar().baz ??= result.foo.bar().baz : string | number | undefined ->c.foo.bar().baz : string | number | undefined +>c.foo.bar().baz ??= result.foo.bar().baz : "" | 0 | 1 | 42 | undefined +>c.foo.bar().baz : "" | 0 | 1 | 42 | undefined >c.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >c.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } >c.foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >c : A >foo : { bar(): { baz: "" | 0 | 1 | 42 | undefined; }; baz: "" | 0 | 1 | 42 | undefined; } >bar : () => { baz: "" | 0 | 1 | 42 | undefined; } ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.foo.bar().baz : "" | 0 | 1 | 42 | undefined >result.foo.bar() : { baz: "" | 0 | 1 | 42 | undefined; } >result.foo.bar : () => { baz: "" | 0 | 1 | 42 | undefined; } diff --git a/tests/baselines/reference/logicalAssignment3(target=es2015).types b/tests/baselines/reference/logicalAssignment3(target=es2015).types index c18cad97c33..34ee2dc3901 100644 --- a/tests/baselines/reference/logicalAssignment3(target=es2015).types +++ b/tests/baselines/reference/logicalAssignment3(target=es2015).types @@ -18,30 +18,30 @@ declare const c: A; (a.baz) &&= result.baz; >(a.baz) &&= result.baz : "" | 0 | 1 | 42 | undefined ->(a.baz) : string | number | undefined ->a.baz : string | number | undefined +>(a.baz) : "" | 0 | 1 | 42 | undefined +>a.baz : "" | 0 | 1 | 42 | undefined >a : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined (b.baz) ||= result.baz; ->(b.baz) ||= result.baz : string | number | undefined ->(b.baz) : string | number | undefined ->b.baz : string | number | undefined +>(b.baz) ||= result.baz : "" | 0 | 1 | 42 | undefined +>(b.baz) : "" | 0 | 1 | 42 | undefined +>b.baz : "" | 0 | 1 | 42 | undefined >b : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined (c.baz) ??= result.baz; ->(c.baz) ??= result.baz : string | number | undefined ->(c.baz) : string | number | undefined ->c.baz : string | number | undefined +>(c.baz) ??= result.baz : "" | 0 | 1 | 42 | undefined +>(c.baz) : "" | 0 | 1 | 42 | undefined +>c.baz : "" | 0 | 1 | 42 | undefined >c : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined diff --git a/tests/baselines/reference/logicalAssignment3(target=es2020).types b/tests/baselines/reference/logicalAssignment3(target=es2020).types index c18cad97c33..34ee2dc3901 100644 --- a/tests/baselines/reference/logicalAssignment3(target=es2020).types +++ b/tests/baselines/reference/logicalAssignment3(target=es2020).types @@ -18,30 +18,30 @@ declare const c: A; (a.baz) &&= result.baz; >(a.baz) &&= result.baz : "" | 0 | 1 | 42 | undefined ->(a.baz) : string | number | undefined ->a.baz : string | number | undefined +>(a.baz) : "" | 0 | 1 | 42 | undefined +>a.baz : "" | 0 | 1 | 42 | undefined >a : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined (b.baz) ||= result.baz; ->(b.baz) ||= result.baz : string | number | undefined ->(b.baz) : string | number | undefined ->b.baz : string | number | undefined +>(b.baz) ||= result.baz : "" | 0 | 1 | 42 | undefined +>(b.baz) : "" | 0 | 1 | 42 | undefined +>b.baz : "" | 0 | 1 | 42 | undefined >b : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined (c.baz) ??= result.baz; ->(c.baz) ??= result.baz : string | number | undefined ->(c.baz) : string | number | undefined ->c.baz : string | number | undefined +>(c.baz) ??= result.baz : "" | 0 | 1 | 42 | undefined +>(c.baz) : "" | 0 | 1 | 42 | undefined +>c.baz : "" | 0 | 1 | 42 | undefined >c : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined diff --git a/tests/baselines/reference/logicalAssignment3(target=esnext).types b/tests/baselines/reference/logicalAssignment3(target=esnext).types index c18cad97c33..34ee2dc3901 100644 --- a/tests/baselines/reference/logicalAssignment3(target=esnext).types +++ b/tests/baselines/reference/logicalAssignment3(target=esnext).types @@ -18,30 +18,30 @@ declare const c: A; (a.baz) &&= result.baz; >(a.baz) &&= result.baz : "" | 0 | 1 | 42 | undefined ->(a.baz) : string | number | undefined ->a.baz : string | number | undefined +>(a.baz) : "" | 0 | 1 | 42 | undefined +>a.baz : "" | 0 | 1 | 42 | undefined >a : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined (b.baz) ||= result.baz; ->(b.baz) ||= result.baz : string | number | undefined ->(b.baz) : string | number | undefined ->b.baz : string | number | undefined +>(b.baz) ||= result.baz : "" | 0 | 1 | 42 | undefined +>(b.baz) : "" | 0 | 1 | 42 | undefined +>b.baz : "" | 0 | 1 | 42 | undefined >b : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined (c.baz) ??= result.baz; ->(c.baz) ??= result.baz : string | number | undefined ->(c.baz) : string | number | undefined ->c.baz : string | number | undefined +>(c.baz) ??= result.baz : "" | 0 | 1 | 42 | undefined +>(c.baz) : "" | 0 | 1 | 42 | undefined +>c.baz : "" | 0 | 1 | 42 | undefined >c : A ->baz : string | number | undefined +>baz : "" | 0 | 1 | 42 | undefined >result.baz : "" | 0 | 1 | 42 | undefined >result : A >baz : "" | 0 | 1 | 42 | undefined diff --git a/tests/baselines/reference/logicalAssignment5(target=es2015).types b/tests/baselines/reference/logicalAssignment5(target=es2015).types index 694c3db90a5..82ed2ab2d2f 100644 --- a/tests/baselines/reference/logicalAssignment5(target=es2015).types +++ b/tests/baselines/reference/logicalAssignment5(target=es2015).types @@ -51,8 +51,8 @@ function foo3 (f?: (a: number) => void) { >a : any f(42) ->f(42) : any ->f : undefined +>f(42) : void +>f : ((a: number) => void) | undefined >42 : 42 } @@ -126,8 +126,8 @@ function bar3 (f?: (a: number) => void) { >a : any f(42) ->f(42) : any ->f : undefined +>f(42) : void +>f : ((a: number) => void) | undefined >42 : 42 } diff --git a/tests/baselines/reference/logicalAssignment5(target=es2020).types b/tests/baselines/reference/logicalAssignment5(target=es2020).types index 694c3db90a5..82ed2ab2d2f 100644 --- a/tests/baselines/reference/logicalAssignment5(target=es2020).types +++ b/tests/baselines/reference/logicalAssignment5(target=es2020).types @@ -51,8 +51,8 @@ function foo3 (f?: (a: number) => void) { >a : any f(42) ->f(42) : any ->f : undefined +>f(42) : void +>f : ((a: number) => void) | undefined >42 : 42 } @@ -126,8 +126,8 @@ function bar3 (f?: (a: number) => void) { >a : any f(42) ->f(42) : any ->f : undefined +>f(42) : void +>f : ((a: number) => void) | undefined >42 : 42 } diff --git a/tests/baselines/reference/logicalAssignment5(target=esnext).types b/tests/baselines/reference/logicalAssignment5(target=esnext).types index 694c3db90a5..82ed2ab2d2f 100644 --- a/tests/baselines/reference/logicalAssignment5(target=esnext).types +++ b/tests/baselines/reference/logicalAssignment5(target=esnext).types @@ -51,8 +51,8 @@ function foo3 (f?: (a: number) => void) { >a : any f(42) ->f(42) : any ->f : undefined +>f(42) : void +>f : ((a: number) => void) | undefined >42 : 42 } @@ -126,8 +126,8 @@ function bar3 (f?: (a: number) => void) { >a : any f(42) ->f(42) : any ->f : undefined +>f(42) : void +>f : ((a: number) => void) | undefined >42 : 42 }