This commit is contained in:
kingwl
2020-04-02 15:33:39 +08:00
parent 944bcf8459
commit ff4fca527d
14 changed files with 126 additions and 124 deletions
+8 -6
View File
@@ -932,6 +932,9 @@ namespace ts {
case SyntaxKind.BinaryExpression:
switch ((<BinaryExpression>expr).operatorToken.kind) {
case SyntaxKind.EqualsToken:
case SyntaxKind.BarBarEqualsToken:
case SyntaxKind.AmpersandAmpersandEqualsToken:
case SyntaxKind.QuestionQuestionEqualsToken:
return isNarrowableOperand((<BinaryExpression>expr).left);
case SyntaxKind.CommaToken:
return isNarrowableOperand((<BinaryExpression>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[],
+1 -1
View File
@@ -2594,7 +2594,7 @@ namespace ts {
switch (parent.kind) {
case SyntaxKind.BinaryExpression:
const binaryOperator = (<BinaryExpression>parent).operatorToken.kind;
return isAssignmentOperator(binaryOperator) && (<BinaryExpression>parent).left === node ?
return isAssignmentOperator(binaryOperator) && !isLogicalAssignmentOperator(binaryOperator) && (<BinaryExpression>parent).left === node ?
binaryOperator === SyntaxKind.EqualsToken ? AssignmentKind.Definite : AssignmentKind.Compound :
AssignmentKind.None;
case SyntaxKind.PrefixUnaryExpression:
@@ -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
@@ -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
@@ -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
@@ -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; }
@@ -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; }
@@ -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; }
@@ -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
@@ -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
@@ -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
@@ -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
}
@@ -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
}
@@ -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
}