Update control flow for nested binary exprs

This commit is contained in:
Ron Buckton 2020-10-29 13:32:32 -07:00
parent 8a15291541
commit 2b7e790732
4 changed files with 504 additions and 33 deletions

View File

@ -1608,7 +1608,7 @@ namespace ts {
* If `node` is a BinaryExpression, adds it to the local work stack, otherwise recursively binds it
*/
function maybeBind(node: Node) {
if (node && isBinaryExpression(node)) {
if (node && isBinaryExpression(node) && !isDestructuringAssignment(node)) {
stackIndex++;
workStacks.expr[stackIndex] = node;
workStacks.state[stackIndex] = BindBinaryExpressionFlowState.BindThenBindChildren;

View File

@ -1,70 +1,218 @@
=== tests/cases/conformance/controlFlow/controlFlowAssignmentPatternOrder.ts ===
// https://github.com/microsoft/TypeScript/pull/41094#issuecomment-716044363
declare function f(): void;
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
{
let a: 0 | 1 = 0;
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 2, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7))
let b: 0 | 1 | 9;
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 4, 7))
[{ [(a = 1)]: b } = [9, a] as const] = [];
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 4, 6))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 2, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 2, 7))
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 5, 6))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 4, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7))
const bb: 0 = b;
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 5, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 3, 7))
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 6, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 4, 7))
}
{
let a: 0 | 1 = 1;
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 8, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7))
let b: 0 | 1 | 9;
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 10, 7))
[{ [a]: b } = [9, a = 0] as const] = [];
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 10, 6))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 8, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 8, 7))
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 11, 6))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 10, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7))
const bb: 9 = b;
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 11, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 9, 7))
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 12, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 10, 7))
}
{
let a: 0 | 1 = 0;
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 14, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7))
let b: 0 | 1 | 8 | 9;
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 16, 7))
[{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const];
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 16, 6))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 14, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 14, 7))
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 17, 6))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 16, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7))
const bb: 0 | 8 = b;
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 17, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 15, 7))
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 18, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 16, 7))
}
{
let a: 0 | 1 = 1;
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 20, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7))
let b: 0 | 1 | 8 | 9;
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 22, 7))
[{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const];
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 22, 6))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 20, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 20, 7))
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 23, 6))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 22, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7))
const bb: 0 | 8 = b;
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 23, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 21, 7))
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 24, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 22, 7))
}
// same as above but on left of a binary expression
{
let a: 0 | 1 = 0;
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 28, 7))
let b: 0 | 1 | 9;
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 29, 7))
[{ [(a = 1)]: b } = [9, a] as const] = [], f();
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 30, 6))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 28, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 29, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 28, 7))
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
const bb: 0 = b;
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 31, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 29, 7))
}
{
let a: 0 | 1 = 1;
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 34, 7))
let b: 0 | 1 | 9;
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 35, 7))
[{ [a]: b } = [9, a = 0] as const] = [], f();
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 36, 6))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 34, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 35, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 34, 7))
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
const bb: 9 = b;
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 37, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 35, 7))
}
{
let a: 0 | 1 = 0;
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 40, 7))
let b: 0 | 1 | 8 | 9;
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 41, 7))
[{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const], f();
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 42, 6))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 40, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 41, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 40, 7))
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
const bb: 0 | 8 = b;
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 43, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 41, 7))
}
{
let a: 0 | 1 = 1;
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 46, 7))
let b: 0 | 1 | 8 | 9;
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 47, 7))
[{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const], f();
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 48, 6))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 46, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 47, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 46, 7))
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
const bb: 0 | 8 = b;
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 49, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 47, 7))
}
// same as above but on right of a binary expression
{
let a: 0 | 1 = 0;
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 53, 7))
let b: 0 | 1 | 9;
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 54, 7))
f(), [{ [(a = 1)]: b } = [9, a] as const] = [];
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 55, 11))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 53, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 54, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 53, 7))
const bb: 0 = b;
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 56, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 54, 7))
}
{
let a: 0 | 1 = 1;
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 59, 7))
let b: 0 | 1 | 9;
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 60, 7))
f(), [{ [a]: b } = [9, a = 0] as const] = [];
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 61, 11))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 59, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 60, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 59, 7))
const bb: 9 = b;
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 62, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 60, 7))
}
{
let a: 0 | 1 = 0;
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 65, 7))
let b: 0 | 1 | 8 | 9;
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 66, 7))
f(), [{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const];
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
>[(a = 1)] : Symbol([(a = 1)], Decl(controlFlowAssignmentPatternOrder.ts, 67, 11))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 65, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 66, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 65, 7))
const bb: 0 | 8 = b;
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 68, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 66, 7))
}
{
let a: 0 | 1 = 1;
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 71, 7))
let b: 0 | 1 | 8 | 9;
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 72, 7))
f(), [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const];
>f : Symbol(f, Decl(controlFlowAssignmentPatternOrder.ts, 0, 0))
>[a] : Symbol([a], Decl(controlFlowAssignmentPatternOrder.ts, 73, 11))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 71, 7))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 72, 7))
>a : Symbol(a, Decl(controlFlowAssignmentPatternOrder.ts, 71, 7))
const bb: 0 | 8 = b;
>bb : Symbol(bb, Decl(controlFlowAssignmentPatternOrder.ts, 74, 9))
>b : Symbol(b, Decl(controlFlowAssignmentPatternOrder.ts, 72, 7))
}

View File

@ -1,5 +1,7 @@
=== tests/cases/conformance/controlFlow/controlFlowAssignmentPatternOrder.ts ===
// https://github.com/microsoft/TypeScript/pull/41094#issuecomment-716044363
declare function f(): void;
>f : () => void
{
let a: 0 | 1 = 0;
>a : 0 | 1
@ -122,3 +124,273 @@
>bb : 0 | 8
>b : 0 | 8
}
// same as above but on left of a binary expression
{
let a: 0 | 1 = 0;
>a : 0 | 1
>0 : 0
let b: 0 | 1 | 9;
>b : 0 | 1 | 9
[{ [(a = 1)]: b } = [9, a] as const] = [], f();
>[{ [(a = 1)]: b } = [9, a] as const] = [], f() : void
>[{ [(a = 1)]: b } = [9, a] as const] = [] : []
>[{ [(a = 1)]: b } = [9, a] as const] : [readonly [9, 0]]
>{ [(a = 1)]: b } = [9, a] as const : readonly [9, 0]
>{ [(a = 1)]: b } : { 1: 0 | 1 | 9; }
>[(a = 1)] : 0 | 1 | 9
>(a = 1) : 1
>a = 1 : 1
>a : 0 | 1
>1 : 1
>b : 0 | 1 | 9
>[9, a] as const : readonly [9, 0]
>[9, a] : readonly [9, 0]
>9 : 9
>a : 0
>[] : []
>f() : void
>f : () => void
const bb: 0 = b;
>bb : 0
>b : 0
}
{
let a: 0 | 1 = 1;
>a : 0 | 1
>1 : 1
let b: 0 | 1 | 9;
>b : 0 | 1 | 9
[{ [a]: b } = [9, a = 0] as const] = [], f();
>[{ [a]: b } = [9, a = 0] as const] = [], f() : void
>[{ [a]: b } = [9, a = 0] as const] = [] : []
>[{ [a]: b } = [9, a = 0] as const] : [readonly [9, 0]]
>{ [a]: b } = [9, a = 0] as const : readonly [9, 0]
>{ [a]: b } : { 0: 0 | 1 | 9; }
>[a] : 0 | 1 | 9
>a : 0
>b : 0 | 1 | 9
>[9, a = 0] as const : readonly [9, 0]
>[9, a = 0] : readonly [9, 0]
>9 : 9
>a = 0 : 0
>a : 0 | 1
>0 : 0
>[] : []
>f() : void
>f : () => void
const bb: 9 = b;
>bb : 9
>b : 9
}
{
let a: 0 | 1 = 0;
>a : 0 | 1
>0 : 0
let b: 0 | 1 | 8 | 9;
>b : 0 | 1 | 9 | 8
[{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const], f();
>[{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const], f() : void
>[{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const] : [readonly [9, 8]]
>[{ [(a = 1)]: b } = [9, a] as const] : [readonly [9, 0]]
>{ [(a = 1)]: b } = [9, a] as const : readonly [9, 0]
>{ [(a = 1)]: b } : { 1: 0 | 1 | 9 | 8; }
>[(a = 1)] : 0 | 1 | 9 | 8
>(a = 1) : 1
>a = 1 : 1
>a : 0 | 1
>1 : 1
>b : 0 | 1 | 9 | 8
>[9, a] as const : readonly [9, 0]
>[9, a] : readonly [9, 0]
>9 : 9
>a : 0
>[[9, 8] as const] : [readonly [9, 8]]
>[9, 8] as const : readonly [9, 8]
>[9, 8] : readonly [9, 8]
>9 : 9
>8 : 8
>f() : void
>f : () => void
const bb: 0 | 8 = b;
>bb : 0 | 8
>b : 0 | 8
}
{
let a: 0 | 1 = 1;
>a : 0 | 1
>1 : 1
let b: 0 | 1 | 8 | 9;
>b : 0 | 1 | 9 | 8
[{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const], f();
>[{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const], f() : void
>[{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const] : [readonly [8, 9]]
>[{ [a]: b } = [a = 0, 9] as const] : [readonly [0, 9]]
>{ [a]: b } = [a = 0, 9] as const : readonly [0, 9]
>{ [a]: b } : { 0: 0 | 1 | 9 | 8; }
>[a] : 0 | 1 | 9 | 8
>a : 0
>b : 0 | 1 | 9 | 8
>[a = 0, 9] as const : readonly [0, 9]
>[a = 0, 9] : readonly [0, 9]
>a = 0 : 0
>a : 0 | 1
>0 : 0
>9 : 9
>[[8, 9] as const] : [readonly [8, 9]]
>[8, 9] as const : readonly [8, 9]
>[8, 9] : readonly [8, 9]
>8 : 8
>9 : 9
>f() : void
>f : () => void
const bb: 0 | 8 = b;
>bb : 0 | 8
>b : 0 | 8
}
// same as above but on right of a binary expression
{
let a: 0 | 1 = 0;
>a : 0 | 1
>0 : 0
let b: 0 | 1 | 9;
>b : 0 | 1 | 9
f(), [{ [(a = 1)]: b } = [9, a] as const] = [];
>f(), [{ [(a = 1)]: b } = [9, a] as const] = [] : []
>f() : void
>f : () => void
>[{ [(a = 1)]: b } = [9, a] as const] = [] : []
>[{ [(a = 1)]: b } = [9, a] as const] : [readonly [9, 0]]
>{ [(a = 1)]: b } = [9, a] as const : readonly [9, 0]
>{ [(a = 1)]: b } : { 1: 0 | 1 | 9; }
>[(a = 1)] : 0 | 1 | 9
>(a = 1) : 1
>a = 1 : 1
>a : 0 | 1
>1 : 1
>b : 0 | 1 | 9
>[9, a] as const : readonly [9, 0]
>[9, a] : readonly [9, 0]
>9 : 9
>a : 0
>[] : []
const bb: 0 = b;
>bb : 0
>b : 0
}
{
let a: 0 | 1 = 1;
>a : 0 | 1
>1 : 1
let b: 0 | 1 | 9;
>b : 0 | 1 | 9
f(), [{ [a]: b } = [9, a = 0] as const] = [];
>f(), [{ [a]: b } = [9, a = 0] as const] = [] : []
>f() : void
>f : () => void
>[{ [a]: b } = [9, a = 0] as const] = [] : []
>[{ [a]: b } = [9, a = 0] as const] : [readonly [9, 0]]
>{ [a]: b } = [9, a = 0] as const : readonly [9, 0]
>{ [a]: b } : { 0: 0 | 1 | 9; }
>[a] : 0 | 1 | 9
>a : 0
>b : 0 | 1 | 9
>[9, a = 0] as const : readonly [9, 0]
>[9, a = 0] : readonly [9, 0]
>9 : 9
>a = 0 : 0
>a : 0 | 1
>0 : 0
>[] : []
const bb: 9 = b;
>bb : 9
>b : 9
}
{
let a: 0 | 1 = 0;
>a : 0 | 1
>0 : 0
let b: 0 | 1 | 8 | 9;
>b : 0 | 1 | 9 | 8
f(), [{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const];
>f(), [{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const] : [readonly [9, 8]]
>f() : void
>f : () => void
>[{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const] : [readonly [9, 8]]
>[{ [(a = 1)]: b } = [9, a] as const] : [readonly [9, 0]]
>{ [(a = 1)]: b } = [9, a] as const : readonly [9, 0]
>{ [(a = 1)]: b } : { 1: 0 | 1 | 9 | 8; }
>[(a = 1)] : 0 | 1 | 9 | 8
>(a = 1) : 1
>a = 1 : 1
>a : 0 | 1
>1 : 1
>b : 0 | 1 | 9 | 8
>[9, a] as const : readonly [9, 0]
>[9, a] : readonly [9, 0]
>9 : 9
>a : 0
>[[9, 8] as const] : [readonly [9, 8]]
>[9, 8] as const : readonly [9, 8]
>[9, 8] : readonly [9, 8]
>9 : 9
>8 : 8
const bb: 0 | 8 = b;
>bb : 0 | 8
>b : 0 | 8
}
{
let a: 0 | 1 = 1;
>a : 0 | 1
>1 : 1
let b: 0 | 1 | 8 | 9;
>b : 0 | 1 | 9 | 8
f(), [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const];
>f(), [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const] : [readonly [8, 9]]
>f() : void
>f : () => void
>[{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const] : [readonly [8, 9]]
>[{ [a]: b } = [a = 0, 9] as const] : [readonly [0, 9]]
>{ [a]: b } = [a = 0, 9] as const : readonly [0, 9]
>{ [a]: b } : { 0: 0 | 1 | 9 | 8; }
>[a] : 0 | 1 | 9 | 8
>a : 0
>b : 0 | 1 | 9 | 8
>[a = 0, 9] as const : readonly [0, 9]
>[a = 0, 9] : readonly [0, 9]
>a = 0 : 0
>a : 0 | 1
>0 : 0
>9 : 9
>[[8, 9] as const] : [readonly [8, 9]]
>[8, 9] as const : readonly [8, 9]
>[8, 9] : readonly [8, 9]
>8 : 8
>9 : 9
const bb: 0 | 8 = b;
>bb : 0 | 8
>b : 0 | 8
}

View File

@ -2,6 +2,7 @@
// @noEmit: true
// https://github.com/microsoft/TypeScript/pull/41094#issuecomment-716044363
declare function f(): void;
{
let a: 0 | 1 = 0;
let b: 0 | 1 | 9;
@ -25,4 +26,54 @@
let b: 0 | 1 | 8 | 9;
[{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const];
const bb: 0 | 8 = b;
}
// same as above but on left of a binary expression
{
let a: 0 | 1 = 0;
let b: 0 | 1 | 9;
[{ [(a = 1)]: b } = [9, a] as const] = [], f();
const bb: 0 = b;
}
{
let a: 0 | 1 = 1;
let b: 0 | 1 | 9;
[{ [a]: b } = [9, a = 0] as const] = [], f();
const bb: 9 = b;
}
{
let a: 0 | 1 = 0;
let b: 0 | 1 | 8 | 9;
[{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const], f();
const bb: 0 | 8 = b;
}
{
let a: 0 | 1 = 1;
let b: 0 | 1 | 8 | 9;
[{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const], f();
const bb: 0 | 8 = b;
}
// same as above but on right of a binary expression
{
let a: 0 | 1 = 0;
let b: 0 | 1 | 9;
f(), [{ [(a = 1)]: b } = [9, a] as const] = [];
const bb: 0 = b;
}
{
let a: 0 | 1 = 1;
let b: 0 | 1 | 9;
f(), [{ [a]: b } = [9, a = 0] as const] = [];
const bb: 9 = b;
}
{
let a: 0 | 1 = 0;
let b: 0 | 1 | 8 | 9;
f(), [{ [(a = 1)]: b } = [9, a] as const] = [[9, 8] as const];
const bb: 0 | 8 = b;
}
{
let a: 0 | 1 = 1;
let b: 0 | 1 | 8 | 9;
f(), [{ [a]: b } = [a = 0, 9] as const] = [[8, 9] as const];
const bb: 0 | 8 = b;
}