From 87bb5e3cbbd1536eb1c395a6ea739bf18292412a Mon Sep 17 00:00:00 2001 From: Kevin Gibbons Date: Mon, 4 Jun 2018 14:47:07 -0700 Subject: [PATCH] Allow trailing commas after-rest elements in destructuring --- src/compiler/checker.ts | 6 ++-- ...trailingCommasInBindingPatterns.errors.txt | 7 +++++ .../trailingCommasInBindingPatterns.js | 13 ++++++++ .../trailingCommasInBindingPatterns.symbols | 17 ++++++++++ .../trailingCommasInBindingPatterns.types | 31 +++++++++++++++++++ .../es7/trailingCommasInBindingPatterns.ts | 7 +++++ 6 files changed, 78 insertions(+), 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6260779767..f6f849a16f 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -20111,7 +20111,6 @@ namespace ts { function checkObjectLiteralAssignment(node: ObjectLiteralExpression, sourceType: Type): Type { const properties = node.properties; - checkGrammarForDisallowedTrailingComma(properties, Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma); if (strictNullChecks && properties.length === 0) { return checkNonNullType(sourceType, node); } @@ -20122,7 +20121,7 @@ namespace ts { } /** Note: If property cannot be a SpreadAssignment, then allProperties does not need to be provided */ - function checkObjectLiteralDestructuringPropertyAssignment(objectLiteralType: Type, property: ObjectLiteralElementLike, allProperties?: ReadonlyArray) { + function checkObjectLiteralDestructuringPropertyAssignment(objectLiteralType: Type, property: ObjectLiteralElementLike, allProperties?: NodeArray) { if (property.kind === SyntaxKind.PropertyAssignment || property.kind === SyntaxKind.ShorthandPropertyAssignment) { const name = property.name; if (name.kind === SyntaxKind.ComputedPropertyName) { @@ -20162,6 +20161,7 @@ namespace ts { } } const type = getRestType(objectLiteralType, nonRestNames, objectLiteralType.symbol); + checkGrammarForDisallowedTrailingComma(allProperties, Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma); return checkDestructuringAssignment(property.expression, type); } else { @@ -20171,7 +20171,6 @@ namespace ts { function checkArrayLiteralAssignment(node: ArrayLiteralExpression, sourceType: Type, checkMode?: CheckMode): Type { const elements = node.elements; - checkGrammarForDisallowedTrailingComma(elements, Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma); if (languageVersion < ScriptTarget.ES2015 && compilerOptions.downlevelIteration) { checkExternalEmitHelpers(node, ExternalEmitHelpers.Read); } @@ -20223,6 +20222,7 @@ namespace ts { error((restExpression).operatorToken, Diagnostics.A_rest_element_cannot_have_an_initializer); } else { + checkGrammarForDisallowedTrailingComma(node.elements, Diagnostics.A_rest_parameter_or_binding_pattern_may_not_have_a_trailing_comma); return checkDestructuringAssignment(restExpression, createArrayType(elementType), checkMode); } } diff --git a/tests/baselines/reference/trailingCommasInBindingPatterns.errors.txt b/tests/baselines/reference/trailingCommasInBindingPatterns.errors.txt index e337e1aefa..422673c659 100644 --- a/tests/baselines/reference/trailingCommasInBindingPatterns.errors.txt +++ b/tests/baselines/reference/trailingCommasInBindingPatterns.errors.txt @@ -18,4 +18,11 @@ tests/cases/conformance/es7/trailingCommasInBindingPatterns.ts(5,7): error TS101 ({...d,} = {}); ~ !!! error TS1013: A rest parameter or binding pattern may not have a trailing comma. + + // Allowed for non-rest elements + const [e,] = []; + const {f,} = {}; + let g, h; + ([g,] = []); + ({h,} = {}); \ No newline at end of file diff --git a/tests/baselines/reference/trailingCommasInBindingPatterns.js b/tests/baselines/reference/trailingCommasInBindingPatterns.js index e26a93ccae..0c51acc8af 100644 --- a/tests/baselines/reference/trailingCommasInBindingPatterns.js +++ b/tests/baselines/reference/trailingCommasInBindingPatterns.js @@ -4,6 +4,13 @@ const {...b,} = {}; let c, d; ([...c,] = []); ({...d,} = {}); + +// Allowed for non-rest elements +const [e,] = []; +const {f,} = {}; +let g, h; +([g,] = []); +({h,} = {}); //// [trailingCommasInBindingPatterns.js] @@ -21,3 +28,9 @@ var b = __rest({}, []); var c, d; (c = [].slice(0)); (d = __rest({}, [])); +// Allowed for non-rest elements +var e = [][0]; +var f = {}.f; +var g, h; +(g = [][0]); +(h = {}.h); diff --git a/tests/baselines/reference/trailingCommasInBindingPatterns.symbols b/tests/baselines/reference/trailingCommasInBindingPatterns.symbols index c4c49175ca..492f1acb71 100644 --- a/tests/baselines/reference/trailingCommasInBindingPatterns.symbols +++ b/tests/baselines/reference/trailingCommasInBindingPatterns.symbols @@ -15,3 +15,20 @@ let c, d; ({...d,} = {}); >d : Symbol(d, Decl(trailingCommasInBindingPatterns.ts, 2, 6)) +// Allowed for non-rest elements +const [e,] = []; +>e : Symbol(e, Decl(trailingCommasInBindingPatterns.ts, 7, 7)) + +const {f,} = {}; +>f : Symbol(f, Decl(trailingCommasInBindingPatterns.ts, 8, 7)) + +let g, h; +>g : Symbol(g, Decl(trailingCommasInBindingPatterns.ts, 9, 3)) +>h : Symbol(h, Decl(trailingCommasInBindingPatterns.ts, 9, 6)) + +([g,] = []); +>g : Symbol(g, Decl(trailingCommasInBindingPatterns.ts, 9, 3)) + +({h,} = {}); +>h : Symbol(h, Decl(trailingCommasInBindingPatterns.ts, 11, 2)) + diff --git a/tests/baselines/reference/trailingCommasInBindingPatterns.types b/tests/baselines/reference/trailingCommasInBindingPatterns.types index aee6d21ad5..087bb0c0b3 100644 --- a/tests/baselines/reference/trailingCommasInBindingPatterns.types +++ b/tests/baselines/reference/trailingCommasInBindingPatterns.types @@ -26,3 +26,34 @@ let c, d; >d : any >{} : {} +// Allowed for non-rest elements +const [e,] = []; +>e : any +>[] : any +>[] : undefined[] + +const {f,} = {}; +>f : any +>{} : any +>{} : {} + +let g, h; +>g : any +>h : any + +([g,] = []); +>([g,] = []) : any +>[g,] = [] : any +>[g,] : [any] +>g : any +>[] : any +>[] : undefined[] + +({h,} = {}); +>({h,} = {}) : any +>{h,} = {} : any +>{h,} : { h: any; } +>h : any +>{} : any +>{} : {} + diff --git a/tests/cases/conformance/es7/trailingCommasInBindingPatterns.ts b/tests/cases/conformance/es7/trailingCommasInBindingPatterns.ts index db1935f265..6323111b04 100644 --- a/tests/cases/conformance/es7/trailingCommasInBindingPatterns.ts +++ b/tests/cases/conformance/es7/trailingCommasInBindingPatterns.ts @@ -3,3 +3,10 @@ const {...b,} = {}; let c, d; ([...c,] = []); ({...d,} = {}); + +// Allowed for non-rest elements +const [e,] = []; +const {f,} = {}; +let g, h; +([g,] = []); +({h,} = {});