Skip to content

Commit 6121730

Browse files
committed
Merge pull request microsoft#2680 from Microsoft/fixArrowBindingPattern
Add support for parsing binding patterns in arrow function parameters
2 parents ad477c7 + 15df45d commit 6121730

File tree

7 files changed

+209
-0
lines changed

7 files changed

+209
-0
lines changed

src/compiler/parser.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3221,6 +3221,16 @@ module ts {
32213221
}
32223222
}
32233223

3224+
// If encounter "([" or "({", this could be the start of a binding pattern.
3225+
// Examples:
3226+
// ([ x ]) => { }
3227+
// ({ x }) => { }
3228+
// ([ x ])
3229+
// ({ x })
3230+
if (second === SyntaxKind.OpenBracketToken || second === SyntaxKind.OpenBraceToken) {
3231+
return Tristate.Unknown;
3232+
}
3233+
32243234
// Simple case: "(..."
32253235
// This is an arrow function with a rest parameter.
32263236
if (second === SyntaxKind.DotDotDotToken) {

tests/baselines/reference/arrowFunctionExpressions.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,17 @@ var d = n => c = n;
1313
var d = (n) => c = n;
1414
var d: (n: any) => any;
1515

16+
// Binding patterns in arrow functions
17+
var p1 = ([a]) => { };
18+
var p2 = ([...a]) => { };
19+
var p3 = ([, a]) => { };
20+
var p4 = ([, ...a]) => { };
21+
var p5 = ([a = 1]) => { };
22+
var p6 = ({ a }) => { };
23+
var p7 = ({ a: { b } }) => { };
24+
var p8 = ({ a = 1 }) => { };
25+
var p9 = ({ a: { b = 1 } = { b: 1 } }) => { };
26+
var p10 = ([{ value, done }]) => { };
1627

1728
// Arrow function used in class member initializer
1829
// Arrow function used in class member function
@@ -100,6 +111,37 @@ var c;
100111
var d = function (n) { return c = n; };
101112
var d = function (n) { return c = n; };
102113
var d;
114+
// Binding patterns in arrow functions
115+
var p1 = function (_a) {
116+
var a = _a[0];
117+
};
118+
var p2 = function (_a) {
119+
var a = _a.slice(0);
120+
};
121+
var p3 = function (_a) {
122+
var a = _a[1];
123+
};
124+
var p4 = function (_a) {
125+
var a = _a.slice(1);
126+
};
127+
var p5 = function (_a) {
128+
var _b = _a[0], a = _b === void 0 ? 1 : _b;
129+
};
130+
var p6 = function (_a) {
131+
var a = _a.a;
132+
};
133+
var p7 = function (_a) {
134+
var b = _a.a.b;
135+
};
136+
var p8 = function (_a) {
137+
var _b = _a.a, a = _b === void 0 ? 1 : _b;
138+
};
139+
var p9 = function (_a) {
140+
var _b = _a.a, _c = (_b === void 0 ? { b: 1 } : _b).b, b = _c === void 0 ? 1 : _c;
141+
};
142+
var p10 = function (_a) {
143+
var _b = _a[0], value = _b.value, done = _b.done;
144+
};
103145
// Arrow function used in class member initializer
104146
// Arrow function used in class member function
105147
var MyClass = (function () {

tests/baselines/reference/arrowFunctionExpressions.types

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,61 @@ var d: (n: any) => any;
5151
>d : (n: any) => any
5252
>n : any
5353

54+
// Binding patterns in arrow functions
55+
var p1 = ([a]) => { };
56+
>p1 : ([a]: [any]) => void
57+
>([a]) => { } : ([a]: [any]) => void
58+
>a : any
59+
60+
var p2 = ([...a]) => { };
61+
>p2 : ([...a]: any[]) => void
62+
>([...a]) => { } : ([...a]: any[]) => void
63+
>a : any[]
64+
65+
var p3 = ([, a]) => { };
66+
>p3 : ([, a]: [any, any]) => void
67+
>([, a]) => { } : ([, a]: [any, any]) => void
68+
>a : any
69+
70+
var p4 = ([, ...a]) => { };
71+
>p4 : ([, ...a]: any[]) => void
72+
>([, ...a]) => { } : ([, ...a]: any[]) => void
73+
>a : any[]
74+
75+
var p5 = ([a = 1]) => { };
76+
>p5 : ([a = 1]: [number]) => void
77+
>([a = 1]) => { } : ([a = 1]: [number]) => void
78+
>a : number
79+
80+
var p6 = ({ a }) => { };
81+
>p6 : ({ a }: { a: any; }) => void
82+
>({ a }) => { } : ({ a }: { a: any; }) => void
83+
>a : any
84+
85+
var p7 = ({ a: { b } }) => { };
86+
>p7 : ({ a: { b } }: { a: { b: any; }; }) => void
87+
>({ a: { b } }) => { } : ({ a: { b } }: { a: { b: any; }; }) => void
88+
>a : unknown
89+
>b : any
90+
91+
var p8 = ({ a = 1 }) => { };
92+
>p8 : ({ a = 1 }: { a?: number; }) => void
93+
>({ a = 1 }) => { } : ({ a = 1 }: { a?: number; }) => void
94+
>a : number
95+
96+
var p9 = ({ a: { b = 1 } = { b: 1 } }) => { };
97+
>p9 : ({ a: { b = 1 } = { b: 1 } }: { a?: { b: number; }; }) => void
98+
>({ a: { b = 1 } = { b: 1 } }) => { } : ({ a: { b = 1 } = { b: 1 } }: { a?: { b: number; }; }) => void
99+
>a : unknown
100+
>b : number
101+
>{ b: 1 } : { b: number; }
102+
>b : number
103+
104+
var p10 = ([{ value, done }]) => { };
105+
>p10 : ([{ value, done }]: [{ value: any; done: any; }]) => void
106+
>([{ value, done }]) => { } : ([{ value, done }]: [{ value: any; done: any; }]) => void
107+
>value : any
108+
>done : any
54109

55110
// Arrow function used in class member initializer
56111
// Arrow function used in class member function

tests/baselines/reference/emitArrowFunctionES6.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,18 @@ var f4 = (x: string, y: number, z=10) => { }
66
function foo(func: () => boolean) { }
77
foo(() => true);
88
foo(() => { return false; });
9+
10+
// Binding patterns in arrow functions
11+
var p1 = ([a]) => { };
12+
var p2 = ([...a]) => { };
13+
var p3 = ([, a]) => { };
14+
var p4 = ([, ...a]) => { };
15+
var p5 = ([a = 1]) => { };
16+
var p6 = ({ a }) => { };
17+
var p7 = ({ a: { b } }) => { };
18+
var p8 = ({ a = 1 }) => { };
19+
var p9 = ({ a: { b = 1 } = { b: 1 } }) => { };
20+
var p10 = ([{ value, done }]) => { };
921

1022

1123
//// [emitArrowFunctionES6.js]
@@ -16,3 +28,14 @@ var f4 = (x, y, z = 10) => { };
1628
function foo(func) { }
1729
foo(() => true);
1830
foo(() => { return false; });
31+
// Binding patterns in arrow functions
32+
var p1 = ([a]) => { };
33+
var p2 = ([...a]) => { };
34+
var p3 = ([, a]) => { };
35+
var p4 = ([, ...a]) => { };
36+
var p5 = ([a = 1]) => { };
37+
var p6 = ({ a }) => { };
38+
var p7 = ({ a: { b } }) => { };
39+
var p8 = ({ a = 1 }) => { };
40+
var p9 = ({ a: { b = 1 } = { b: 1 } }) => { };
41+
var p10 = ([{ value, done }]) => { };

tests/baselines/reference/emitArrowFunctionES6.types

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,59 @@ foo(() => { return false; });
3737
>foo : (func: () => boolean) => void
3838
>() => { return false; } : () => boolean
3939

40+
// Binding patterns in arrow functions
41+
var p1 = ([a]) => { };
42+
>p1 : ([a]: [any]) => void
43+
>([a]) => { } : ([a]: [any]) => void
44+
>a : any
45+
46+
var p2 = ([...a]) => { };
47+
>p2 : ([...a]: Iterable<any>) => void
48+
>([...a]) => { } : ([...a]: Iterable<any>) => void
49+
>a : any[]
50+
51+
var p3 = ([, a]) => { };
52+
>p3 : ([, a]: [any, any]) => void
53+
>([, a]) => { } : ([, a]: [any, any]) => void
54+
>a : any
55+
56+
var p4 = ([, ...a]) => { };
57+
>p4 : ([, ...a]: Iterable<any>) => void
58+
>([, ...a]) => { } : ([, ...a]: Iterable<any>) => void
59+
>a : any[]
60+
61+
var p5 = ([a = 1]) => { };
62+
>p5 : ([a = 1]: [number]) => void
63+
>([a = 1]) => { } : ([a = 1]: [number]) => void
64+
>a : number
65+
66+
var p6 = ({ a }) => { };
67+
>p6 : ({ a }: { a: any; }) => void
68+
>({ a }) => { } : ({ a }: { a: any; }) => void
69+
>a : any
70+
71+
var p7 = ({ a: { b } }) => { };
72+
>p7 : ({ a: { b } }: { a: { b: any; }; }) => void
73+
>({ a: { b } }) => { } : ({ a: { b } }: { a: { b: any; }; }) => void
74+
>a : unknown
75+
>b : any
76+
77+
var p8 = ({ a = 1 }) => { };
78+
>p8 : ({ a = 1 }: { a?: number; }) => void
79+
>({ a = 1 }) => { } : ({ a = 1 }: { a?: number; }) => void
80+
>a : number
81+
82+
var p9 = ({ a: { b = 1 } = { b: 1 } }) => { };
83+
>p9 : ({ a: { b = 1 } = { b: 1 } }: { a?: { b: number; }; }) => void
84+
>({ a: { b = 1 } = { b: 1 } }) => { } : ({ a: { b = 1 } = { b: 1 } }: { a?: { b: number; }; }) => void
85+
>a : unknown
86+
>b : number
87+
>{ b: 1 } : { b: number; }
88+
>b : number
89+
90+
var p10 = ([{ value, done }]) => { };
91+
>p10 : ([{ value, done }]: [{ value: any; done: any; }]) => void
92+
>([{ value, done }]) => { } : ([{ value, done }]: [{ value: any; done: any; }]) => void
93+
>value : any
94+
>done : any
95+

tests/cases/conformance/es6/arrowFunction/emitArrowFunctionES6.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,15 @@ var f4 = (x: string, y: number, z=10) => { }
66
function foo(func: () => boolean) { }
77
foo(() => true);
88
foo(() => { return false; });
9+
10+
// Binding patterns in arrow functions
11+
var p1 = ([a]) => { };
12+
var p2 = ([...a]) => { };
13+
var p3 = ([, a]) => { };
14+
var p4 = ([, ...a]) => { };
15+
var p5 = ([a = 1]) => { };
16+
var p6 = ({ a }) => { };
17+
var p7 = ({ a: { b } }) => { };
18+
var p8 = ({ a = 1 }) => { };
19+
var p9 = ({ a: { b = 1 } = { b: 1 } }) => { };
20+
var p10 = ([{ value, done }]) => { };

tests/cases/conformance/expressions/functions/arrowFunctionExpressions.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,17 @@ var d = n => c = n;
1212
var d = (n) => c = n;
1313
var d: (n: any) => any;
1414

15+
// Binding patterns in arrow functions
16+
var p1 = ([a]) => { };
17+
var p2 = ([...a]) => { };
18+
var p3 = ([, a]) => { };
19+
var p4 = ([, ...a]) => { };
20+
var p5 = ([a = 1]) => { };
21+
var p6 = ({ a }) => { };
22+
var p7 = ({ a: { b } }) => { };
23+
var p8 = ({ a = 1 }) => { };
24+
var p9 = ({ a: { b = 1 } = { b: 1 } }) => { };
25+
var p10 = ([{ value, done }]) => { };
1526

1627
// Arrow function used in class member initializer
1728
// Arrow function used in class member function

0 commit comments

Comments
 (0)