mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-05 16:38:05 -06:00
Update control flow for nested binary exprs
This commit is contained in:
parent
8a15291541
commit
2b7e790732
@ -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;
|
||||
|
||||
@ -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))
|
||||
}
|
||||
|
||||
@ -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
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user