Skip to content

Commit 6286c75

Browse files
author
Andy
authored
Allow rest parameter trailing commas in ambient contexts (microsoft#23139)
1 parent c4a504b commit 6286c75

6 files changed

+37
-16
lines changed

src/compiler/checker.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -26662,7 +26662,9 @@ namespace ts {
2666226662
if (i !== (parameterCount - 1)) {
2666326663
return grammarErrorOnNode(parameter.dotDotDotToken, Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list);
2666426664
}
26665-
checkGrammarForDisallowedTrailingComma(parameters, Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma);
26665+
if (!(parameter.flags & NodeFlags.Ambient)) { // Allow `...foo,` in ambient declarations; see GH#23070
26666+
checkGrammarForDisallowedTrailingComma(parameters, Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma);
26667+
}
2666626668

2666726669
if (isBindingPattern(parameter.name)) {
2666826670
return grammarErrorOnNode(parameter.name, Diagnostics.A_rest_element_cannot_contain_a_binding_pattern);

tests/baselines/reference/trailingCommasInFunctionParametersAndArguments.errors.txt

+3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ tests/cases/conformance/es7/trailingCommasInFunctionParametersAndArguments.ts(5,
1010
~
1111
!!! error TS1013: A rest parameter or binding pattern may not have a trailing comma.
1212

13+
// Allowed for ambient declarations
14+
declare function f25(...args,): void;
15+
1316
f2(...[],);
1417

1518
// Not confused by overloads

tests/baselines/reference/trailingCommasInFunctionParametersAndArguments.js

+3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ f1(1,);
55

66
function f2(...args,) {}
77

8+
// Allowed for ambient declarations
9+
declare function f25(...args,): void;
10+
811
f2(...[],);
912

1013
// Not confused by overloads

tests/baselines/reference/trailingCommasInFunctionParametersAndArguments.symbols

+20-15
Original file line numberDiff line numberDiff line change
@@ -10,47 +10,52 @@ function f2(...args,) {}
1010
>f2 : Symbol(f2, Decl(trailingCommasInFunctionParametersAndArguments.ts, 2, 7))
1111
>args : Symbol(args, Decl(trailingCommasInFunctionParametersAndArguments.ts, 4, 12))
1212

13+
// Allowed for ambient declarations
14+
declare function f25(...args,): void;
15+
>f25 : Symbol(f25, Decl(trailingCommasInFunctionParametersAndArguments.ts, 4, 24))
16+
>args : Symbol(args, Decl(trailingCommasInFunctionParametersAndArguments.ts, 7, 21))
17+
1318
f2(...[],);
1419
>f2 : Symbol(f2, Decl(trailingCommasInFunctionParametersAndArguments.ts, 2, 7))
1520

1621
// Not confused by overloads
1722
declare function f3(x, ): number;
18-
>f3 : Symbol(f3, Decl(trailingCommasInFunctionParametersAndArguments.ts, 6, 11), Decl(trailingCommasInFunctionParametersAndArguments.ts, 9, 33))
19-
>x : Symbol(x, Decl(trailingCommasInFunctionParametersAndArguments.ts, 9, 20))
23+
>f3 : Symbol(f3, Decl(trailingCommasInFunctionParametersAndArguments.ts, 9, 11), Decl(trailingCommasInFunctionParametersAndArguments.ts, 12, 33))
24+
>x : Symbol(x, Decl(trailingCommasInFunctionParametersAndArguments.ts, 12, 20))
2025

2126
declare function f3(x, y,): string;
22-
>f3 : Symbol(f3, Decl(trailingCommasInFunctionParametersAndArguments.ts, 6, 11), Decl(trailingCommasInFunctionParametersAndArguments.ts, 9, 33))
23-
>x : Symbol(x, Decl(trailingCommasInFunctionParametersAndArguments.ts, 10, 20))
24-
>y : Symbol(y, Decl(trailingCommasInFunctionParametersAndArguments.ts, 10, 22))
27+
>f3 : Symbol(f3, Decl(trailingCommasInFunctionParametersAndArguments.ts, 9, 11), Decl(trailingCommasInFunctionParametersAndArguments.ts, 12, 33))
28+
>x : Symbol(x, Decl(trailingCommasInFunctionParametersAndArguments.ts, 13, 20))
29+
>y : Symbol(y, Decl(trailingCommasInFunctionParametersAndArguments.ts, 13, 22))
2530

2631
<number>f3(1,);
27-
>f3 : Symbol(f3, Decl(trailingCommasInFunctionParametersAndArguments.ts, 6, 11), Decl(trailingCommasInFunctionParametersAndArguments.ts, 9, 33))
32+
>f3 : Symbol(f3, Decl(trailingCommasInFunctionParametersAndArguments.ts, 9, 11), Decl(trailingCommasInFunctionParametersAndArguments.ts, 12, 33))
2833

2934
<string>f3(1, 2,);
30-
>f3 : Symbol(f3, Decl(trailingCommasInFunctionParametersAndArguments.ts, 6, 11), Decl(trailingCommasInFunctionParametersAndArguments.ts, 9, 33))
35+
>f3 : Symbol(f3, Decl(trailingCommasInFunctionParametersAndArguments.ts, 9, 11), Decl(trailingCommasInFunctionParametersAndArguments.ts, 12, 33))
3136

3237
// Works for constructors too
3338
class X {
34-
>X : Symbol(X, Decl(trailingCommasInFunctionParametersAndArguments.ts, 13, 18))
39+
>X : Symbol(X, Decl(trailingCommasInFunctionParametersAndArguments.ts, 16, 18))
3540

3641
constructor(a,) { }
37-
>a : Symbol(a, Decl(trailingCommasInFunctionParametersAndArguments.ts, 17, 16))
42+
>a : Symbol(a, Decl(trailingCommasInFunctionParametersAndArguments.ts, 20, 16))
3843

3944
// See trailingCommasInGetter.ts
4045
set x(value,) { }
41-
>x : Symbol(X.x, Decl(trailingCommasInFunctionParametersAndArguments.ts, 17, 23))
42-
>value : Symbol(value, Decl(trailingCommasInFunctionParametersAndArguments.ts, 19, 10))
46+
>x : Symbol(X.x, Decl(trailingCommasInFunctionParametersAndArguments.ts, 20, 23))
47+
>value : Symbol(value, Decl(trailingCommasInFunctionParametersAndArguments.ts, 22, 10))
4348
}
4449
interface Y {
45-
>Y : Symbol(Y, Decl(trailingCommasInFunctionParametersAndArguments.ts, 20, 1))
50+
>Y : Symbol(Y, Decl(trailingCommasInFunctionParametersAndArguments.ts, 23, 1))
4651

4752
new(x,);
48-
>x : Symbol(x, Decl(trailingCommasInFunctionParametersAndArguments.ts, 22, 8))
53+
>x : Symbol(x, Decl(trailingCommasInFunctionParametersAndArguments.ts, 25, 8))
4954

5055
(x,);
51-
>x : Symbol(x, Decl(trailingCommasInFunctionParametersAndArguments.ts, 23, 5))
56+
>x : Symbol(x, Decl(trailingCommasInFunctionParametersAndArguments.ts, 26, 5))
5257
}
5358

5459
new X(1,);
55-
>X : Symbol(X, Decl(trailingCommasInFunctionParametersAndArguments.ts, 13, 18))
60+
>X : Symbol(X, Decl(trailingCommasInFunctionParametersAndArguments.ts, 16, 18))
5661

tests/baselines/reference/trailingCommasInFunctionParametersAndArguments.types

+5
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ function f2(...args,) {}
1212
>f2 : (...args: any[]) => void
1313
>args : any[]
1414

15+
// Allowed for ambient declarations
16+
declare function f25(...args,): void;
17+
>f25 : (...args: any[]) => void
18+
>args : any[]
19+
1520
f2(...[],);
1621
>f2(...[],) : void
1722
>f2 : (...args: any[]) => void

tests/cases/conformance/es7/trailingCommasInFunctionParametersAndArguments.ts

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ f1(1,);
66

77
function f2(...args,) {}
88

9+
// Allowed for ambient declarations
10+
declare function f25(...args,): void;
11+
912
f2(...[],);
1013

1114
// Not confused by overloads

0 commit comments

Comments
 (0)