diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2490c32fedc..5b84423fded 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -12729,6 +12729,11 @@ module ts { if (node !== elements[elements.length - 1]) { return grammarErrorOnNode(node, Diagnostics.A_rest_element_must_be_last_in_an_array_destructuring_pattern); } + + if (node.name.kind === SyntaxKind.ArrayBindingPattern || node.name.kind === SyntaxKind.ObjectBindingPattern) { + return grammarErrorOnNode(node.name, Diagnostics.A_rest_element_cannot_contain_a_binding_pattern); + } + if (node.initializer) { // Error on equals token which immediate precedes the initializer return grammarErrorAtPos(getSourceFileOfNode(node), node.initializer.pos - 1, 1, Diagnostics.A_rest_element_cannot_have_an_initializer); diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 0271ac73105..851b90f61c8 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -363,6 +363,7 @@ module ts { External_module_0_uses_export_and_cannot_be_used_with_export_Asterisk: { code: 2498, category: DiagnosticCategory.Error, key: "External module '{0}' uses 'export =' and cannot be used with 'export *'." }, An_interface_can_only_extend_an_identifier_Slashqualified_name_with_optional_type_arguments: { code: 2499, category: DiagnosticCategory.Error, key: "An interface can only extend an identifier/qualified-name with optional type arguments." }, A_class_can_only_implement_an_identifier_Slashqualified_name_with_optional_type_arguments: { code: 2500, category: DiagnosticCategory.Error, key: "A class can only implement an identifier/qualified-name with optional type arguments." }, + A_rest_element_cannot_contain_a_binding_pattern: { code: 2501, category: DiagnosticCategory.Error, key: "A rest element cannot contain a binding pattern." }, Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." }, Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." }, Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported interface has or is using private name '{1}'." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 063a0d50ef5..258f98357b7 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1439,6 +1439,10 @@ "category": "Error", "code": 2500 }, + "A rest element cannot contain a binding pattern.": { + "category": "Error", + "code": 2501 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/tests/baselines/reference/restElementWithBindingPattern.errors.txt b/tests/baselines/reference/restElementWithBindingPattern.errors.txt new file mode 100644 index 00000000000..671b722db73 --- /dev/null +++ b/tests/baselines/reference/restElementWithBindingPattern.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/es6/destructuring/restElementWithBindingPattern.ts(1,9): error TS2501: A rest element cannot contain a binding pattern. + + +==== tests/cases/conformance/es6/destructuring/restElementWithBindingPattern.ts (1 errors) ==== + var [...[a, b]] = [0, 1]; + ~~~~~~ +!!! error TS2501: A rest element cannot contain a binding pattern. \ No newline at end of file diff --git a/tests/baselines/reference/restElementWithBindingPattern.js b/tests/baselines/reference/restElementWithBindingPattern.js new file mode 100644 index 00000000000..4c6bc11df66 --- /dev/null +++ b/tests/baselines/reference/restElementWithBindingPattern.js @@ -0,0 +1,5 @@ +//// [restElementWithBindingPattern.ts] +var [...[a, b]] = [0, 1]; + +//// [restElementWithBindingPattern.js] +var _a = [0, 1], [a, b] = _a.slice(0); diff --git a/tests/baselines/reference/restElementWithBindingPattern2.errors.txt b/tests/baselines/reference/restElementWithBindingPattern2.errors.txt new file mode 100644 index 00000000000..9645a028a4e --- /dev/null +++ b/tests/baselines/reference/restElementWithBindingPattern2.errors.txt @@ -0,0 +1,10 @@ +tests/cases/conformance/es6/destructuring/restElementWithBindingPattern2.ts(1,9): error TS2501: A rest element cannot contain a binding pattern. +tests/cases/conformance/es6/destructuring/restElementWithBindingPattern2.ts(1,16): error TS2459: Type 'number[]' has no property 'b' and no string index signature. + + +==== tests/cases/conformance/es6/destructuring/restElementWithBindingPattern2.ts (2 errors) ==== + var [...{0: a, b }] = [0, 1]; + ~~~~~~~~~~ +!!! error TS2501: A rest element cannot contain a binding pattern. + ~ +!!! error TS2459: Type 'number[]' has no property 'b' and no string index signature. \ No newline at end of file diff --git a/tests/baselines/reference/restElementWithBindingPattern2.js b/tests/baselines/reference/restElementWithBindingPattern2.js new file mode 100644 index 00000000000..0aedebf103c --- /dev/null +++ b/tests/baselines/reference/restElementWithBindingPattern2.js @@ -0,0 +1,5 @@ +//// [restElementWithBindingPattern2.ts] +var [...{0: a, b }] = [0, 1]; + +//// [restElementWithBindingPattern2.js] +var _a = [0, 1], { 0: a, b } = _a.slice(0); diff --git a/tests/cases/conformance/es6/destructuring/restElementWithBindingPattern.ts b/tests/cases/conformance/es6/destructuring/restElementWithBindingPattern.ts new file mode 100644 index 00000000000..960445aa10d --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/restElementWithBindingPattern.ts @@ -0,0 +1 @@ +var [...[a, b]] = [0, 1]; \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/restElementWithBindingPattern2.ts b/tests/cases/conformance/es6/destructuring/restElementWithBindingPattern2.ts new file mode 100644 index 00000000000..3861d20cf9f --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/restElementWithBindingPattern2.ts @@ -0,0 +1 @@ +var [...{0: a, b }] = [0, 1]; \ No newline at end of file