@@ -18824,6 +18824,7 @@ namespace ts {
18824
18824
18825
18825
function checkObjectLiteralAssignment(node: ObjectLiteralExpression, sourceType: Type): Type {
18826
18826
const properties = node.properties;
18827
+ checkGrammarForDisallowedTrailingComma(properties, Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma);
18827
18828
if (strictNullChecks && properties.length === 0) {
18828
18829
return checkNonNullType(sourceType, node);
18829
18830
}
@@ -18882,6 +18883,8 @@ namespace ts {
18882
18883
}
18883
18884
18884
18885
function checkArrayLiteralAssignment(node: ArrayLiteralExpression, sourceType: Type, checkMode?: CheckMode): Type {
18886
+ const elements = node.elements;
18887
+ checkGrammarForDisallowedTrailingComma(elements, Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma);
18885
18888
if (languageVersion < ScriptTarget.ES2015 && compilerOptions.downlevelIteration) {
18886
18889
checkExternalEmitHelpers(node, ExternalEmitHelpers.Read);
18887
18890
}
@@ -18890,7 +18893,6 @@ namespace ts {
18890
18893
// present (aka the tuple element property). This call also checks that the parentType is in
18891
18894
// fact an iterable or array (depending on target language).
18892
18895
const elementType = checkIteratedTypeOrElementType(sourceType, node, /*allowStringInput*/ false, /*allowAsyncIterables*/ false) || unknownType;
18893
- const elements = node.elements;
18894
18896
for (let i = 0; i < elements.length; i++) {
18895
18897
checkArrayLiteralDestructuringElementAssignment(node, sourceType, i, elementType, checkMode);
18896
18898
}
@@ -26067,11 +26069,9 @@ namespace ts {
26067
26069
return grammarErrorOnNode(asyncModifier, Diagnostics._0_modifier_cannot_be_used_here, "async");
26068
26070
}
26069
26071
26070
- function checkGrammarForDisallowedTrailingComma(list: NodeArray<Node>): boolean {
26072
+ function checkGrammarForDisallowedTrailingComma(list: NodeArray<Node>, diag = Diagnostics.Trailing_comma_not_allowed ): boolean {
26071
26073
if (list && list.hasTrailingComma) {
26072
- const start = list.end - ",".length;
26073
- const end = list.end;
26074
- return grammarErrorAtPos(list[0], start, end - start, Diagnostics.Trailing_comma_not_allowed);
26074
+ return grammarErrorAtPos(list[0], list.end - ",".length, ",".length, diag);
26075
26075
}
26076
26076
}
26077
26077
@@ -26093,9 +26093,7 @@ namespace ts {
26093
26093
if (i !== (parameterCount - 1)) {
26094
26094
return grammarErrorOnNode(parameter.dotDotDotToken, Diagnostics.A_rest_parameter_must_be_last_in_a_parameter_list);
26095
26095
}
26096
- if (parameters.hasTrailingComma) {
26097
- return grammarErrorOnNode(parameter.dotDotDotToken, Diagnostics.A_rest_parameter_may_not_have_a_trailing_comma);
26098
- }
26096
+ checkGrammarForDisallowedTrailingComma(parameters, Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma);
26099
26097
26100
26098
if (isBindingPattern(parameter.name)) {
26101
26099
return grammarErrorOnNode(parameter.name, Diagnostics.A_rest_element_cannot_contain_a_binding_pattern);
@@ -26709,6 +26707,7 @@ namespace ts {
26709
26707
if (node !== last(elements)) {
26710
26708
return grammarErrorOnNode(node, Diagnostics.A_rest_element_must_be_last_in_a_destructuring_pattern);
26711
26709
}
26710
+ checkGrammarForDisallowedTrailingComma(elements, Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma);
26712
26711
26713
26712
if (node.name.kind === SyntaxKind.ArrayBindingPattern || node.name.kind === SyntaxKind.ObjectBindingPattern) {
26714
26713
return grammarErrorOnNode(node.name, Diagnostics.A_rest_element_cannot_contain_a_binding_pattern);
0 commit comments