From f84ebba85280f2da961798b93cb2f802f7fdfcbe Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Fri, 10 Apr 2015 12:11:28 -0700 Subject: [PATCH] Rest assignment element allows nested destructuring (fixes #2156) --- src/compiler/checker.ts | 2 +- tests/baselines/reference/for-of49.errors.txt | 8 +++++--- .../restElementWithAssignmentPattern1.errors.txt | 15 +++++++++++++++ .../restElementWithAssignmentPattern1.js | 7 +++++++ .../restElementWithAssignmentPattern2.errors.txt | 16 ++++++++++++++++ .../restElementWithAssignmentPattern2.js | 7 +++++++ .../restElementWithAssignmentPattern3.errors.txt | 16 ++++++++++++++++ .../restElementWithAssignmentPattern3.js | 9 +++++++++ .../restElementWithAssignmentPattern4.errors.txt | 14 ++++++++++++++ .../restElementWithAssignmentPattern4.js | 9 +++++++++ .../restElementWithAssignmentPattern5.js | 8 ++++++++ .../restElementWithAssignmentPattern5.types | 14 ++++++++++++++ .../restElementWithAssignmentPattern1.ts | 3 +++ .../restElementWithAssignmentPattern2.ts | 3 +++ .../restElementWithAssignmentPattern3.ts | 3 +++ .../restElementWithAssignmentPattern4.ts | 3 +++ .../restElementWithAssignmentPattern5.ts | 2 ++ 17 files changed, 135 insertions(+), 4 deletions(-) create mode 100644 tests/baselines/reference/restElementWithAssignmentPattern1.errors.txt create mode 100644 tests/baselines/reference/restElementWithAssignmentPattern1.js create mode 100644 tests/baselines/reference/restElementWithAssignmentPattern2.errors.txt create mode 100644 tests/baselines/reference/restElementWithAssignmentPattern2.js create mode 100644 tests/baselines/reference/restElementWithAssignmentPattern3.errors.txt create mode 100644 tests/baselines/reference/restElementWithAssignmentPattern3.js create mode 100644 tests/baselines/reference/restElementWithAssignmentPattern4.errors.txt create mode 100644 tests/baselines/reference/restElementWithAssignmentPattern4.js create mode 100644 tests/baselines/reference/restElementWithAssignmentPattern5.js create mode 100644 tests/baselines/reference/restElementWithAssignmentPattern5.types create mode 100644 tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern1.ts create mode 100644 tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern2.ts create mode 100644 tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern3.ts create mode 100644 tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern4.ts create mode 100644 tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern5.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c3e3eb4ae15..259d805aeb0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7634,7 +7634,7 @@ module ts { } else { if (i === elements.length - 1) { - checkReferenceAssignment((e).expression, createArrayType(elementType), contextualMapper); + checkDestructuringAssignment((e).expression, createArrayType(elementType), contextualMapper); } else { error(e, Diagnostics.A_rest_element_must_be_last_in_an_array_destructuring_pattern); diff --git a/tests/baselines/reference/for-of49.errors.txt b/tests/baselines/reference/for-of49.errors.txt index d5bc314e678..aaf29f5bfe3 100644 --- a/tests/baselines/reference/for-of49.errors.txt +++ b/tests/baselines/reference/for-of49.errors.txt @@ -1,12 +1,14 @@ -tests/cases/conformance/es6/for-ofStatements/for-of49.ts(3,13): error TS2364: Invalid left-hand side of assignment expression. +tests/cases/conformance/es6/for-ofStatements/for-of49.ts(3,14): error TS2322: Type 'string | boolean' is not assignable to type 'boolean'. + Type 'string' is not assignable to type 'boolean'. ==== tests/cases/conformance/es6/for-ofStatements/for-of49.ts (1 errors) ==== var k: string, v: boolean; var map = new Map([["", true]]); for ([k, ...[v]] of map) { - ~~~ -!!! error TS2364: Invalid left-hand side of assignment expression. + ~ +!!! error TS2322: Type 'string | boolean' is not assignable to type 'boolean'. +!!! error TS2322: Type 'string' is not assignable to type 'boolean'. k; v; } \ No newline at end of file diff --git a/tests/baselines/reference/restElementWithAssignmentPattern1.errors.txt b/tests/baselines/reference/restElementWithAssignmentPattern1.errors.txt new file mode 100644 index 00000000000..2e1046c9317 --- /dev/null +++ b/tests/baselines/reference/restElementWithAssignmentPattern1.errors.txt @@ -0,0 +1,15 @@ +tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern1.ts(2,6): error TS2322: Type 'string | number' is not assignable to type 'string'. + Type 'number' is not assignable to type 'string'. +tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern1.ts(2,9): error TS2322: Type 'string | number' is not assignable to type 'number'. + Type 'string' is not assignable to type 'number'. + + +==== tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern1.ts (2 errors) ==== + var a: string, b: number; + [...[a, b = 0]] = ["", 1]; + ~ +!!! error TS2322: Type 'string | number' is not assignable to type 'string'. +!!! error TS2322: Type 'number' is not assignable to type 'string'. + ~ +!!! error TS2322: Type 'string | number' is not assignable to type 'number'. +!!! error TS2322: Type 'string' is not assignable to type 'number'. \ No newline at end of file diff --git a/tests/baselines/reference/restElementWithAssignmentPattern1.js b/tests/baselines/reference/restElementWithAssignmentPattern1.js new file mode 100644 index 00000000000..34574022868 --- /dev/null +++ b/tests/baselines/reference/restElementWithAssignmentPattern1.js @@ -0,0 +1,7 @@ +//// [restElementWithAssignmentPattern1.ts] +var a: string, b: number; +[...[a, b = 0]] = ["", 1]; + +//// [restElementWithAssignmentPattern1.js] +var a, b; +[...[a, b = 0]] = ["", 1]; diff --git a/tests/baselines/reference/restElementWithAssignmentPattern2.errors.txt b/tests/baselines/reference/restElementWithAssignmentPattern2.errors.txt new file mode 100644 index 00000000000..4b620b19a7a --- /dev/null +++ b/tests/baselines/reference/restElementWithAssignmentPattern2.errors.txt @@ -0,0 +1,16 @@ +tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern2.ts(2,5): error TS2461: Type '{ 0: string; b: number; }' is not an array type. +tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern2.ts(2,10): error TS2322: Type 'string | number' is not assignable to type 'string'. + Type 'number' is not assignable to type 'string'. +tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern2.ts(2,18): error TS2459: Type '(string | number)[]' has no property 'b' and no string index signature. + + +==== tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern2.ts (3 errors) ==== + var a: string, b: number; + [...{ 0: a = "", b }] = ["", 1]; + ~~~~~~~~~~~~~~~~ +!!! error TS2461: Type '{ 0: string; b: number; }' is not an array type. + ~ +!!! error TS2322: Type 'string | number' is not assignable to type 'string'. +!!! error TS2322: Type 'number' is not assignable to type 'string'. + ~ +!!! error TS2459: Type '(string | number)[]' has no property 'b' and no string index signature. \ No newline at end of file diff --git a/tests/baselines/reference/restElementWithAssignmentPattern2.js b/tests/baselines/reference/restElementWithAssignmentPattern2.js new file mode 100644 index 00000000000..66c4428ea41 --- /dev/null +++ b/tests/baselines/reference/restElementWithAssignmentPattern2.js @@ -0,0 +1,7 @@ +//// [restElementWithAssignmentPattern2.ts] +var a: string, b: number; +[...{ 0: a = "", b }] = ["", 1]; + +//// [restElementWithAssignmentPattern2.js] +var a, b; +[...{ 0: a = "", b }] = ["", 1]; diff --git a/tests/baselines/reference/restElementWithAssignmentPattern3.errors.txt b/tests/baselines/reference/restElementWithAssignmentPattern3.errors.txt new file mode 100644 index 00000000000..6906bdde36f --- /dev/null +++ b/tests/baselines/reference/restElementWithAssignmentPattern3.errors.txt @@ -0,0 +1,16 @@ +tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern3.ts(3,6): error TS2322: Type 'string | number' is not assignable to type 'string'. + Type 'number' is not assignable to type 'string'. +tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern3.ts(3,9): error TS2322: Type 'string | number' is not assignable to type 'number'. + Type 'string' is not assignable to type 'number'. + + +==== tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern3.ts (2 errors) ==== + var a: string, b: number; + var tuple: [string, number] = ["", 1]; + [...[a, b = 0]] = tuple; + ~ +!!! error TS2322: Type 'string | number' is not assignable to type 'string'. +!!! error TS2322: Type 'number' is not assignable to type 'string'. + ~ +!!! error TS2322: Type 'string | number' is not assignable to type 'number'. +!!! error TS2322: Type 'string' is not assignable to type 'number'. \ No newline at end of file diff --git a/tests/baselines/reference/restElementWithAssignmentPattern3.js b/tests/baselines/reference/restElementWithAssignmentPattern3.js new file mode 100644 index 00000000000..405d39446d0 --- /dev/null +++ b/tests/baselines/reference/restElementWithAssignmentPattern3.js @@ -0,0 +1,9 @@ +//// [restElementWithAssignmentPattern3.ts] +var a: string, b: number; +var tuple: [string, number] = ["", 1]; +[...[a, b = 0]] = tuple; + +//// [restElementWithAssignmentPattern3.js] +var a, b; +var tuple = ["", 1]; +[a, b = 0] = tuple.slice(0); diff --git a/tests/baselines/reference/restElementWithAssignmentPattern4.errors.txt b/tests/baselines/reference/restElementWithAssignmentPattern4.errors.txt new file mode 100644 index 00000000000..258d0915239 --- /dev/null +++ b/tests/baselines/reference/restElementWithAssignmentPattern4.errors.txt @@ -0,0 +1,14 @@ +tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern4.ts(3,10): error TS2322: Type 'string | number' is not assignable to type 'string'. + Type 'number' is not assignable to type 'string'. +tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern4.ts(3,18): error TS2459: Type '(string | number)[]' has no property 'b' and no string index signature. + + +==== tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern4.ts (2 errors) ==== + var a: string, b: number; + var tuple: [string, number] = ["", 1]; + [...{ 0: a = "", b }] = tuple; + ~ +!!! error TS2322: Type 'string | number' is not assignable to type 'string'. +!!! error TS2322: Type 'number' is not assignable to type 'string'. + ~ +!!! error TS2459: Type '(string | number)[]' has no property 'b' and no string index signature. \ No newline at end of file diff --git a/tests/baselines/reference/restElementWithAssignmentPattern4.js b/tests/baselines/reference/restElementWithAssignmentPattern4.js new file mode 100644 index 00000000000..801510252a2 --- /dev/null +++ b/tests/baselines/reference/restElementWithAssignmentPattern4.js @@ -0,0 +1,9 @@ +//// [restElementWithAssignmentPattern4.ts] +var a: string, b: number; +var tuple: [string, number] = ["", 1]; +[...{ 0: a = "", b }] = tuple; + +//// [restElementWithAssignmentPattern4.js] +var a, b; +var tuple = ["", 1]; +{ 0: a = "", b: b } = tuple.slice(0); diff --git a/tests/baselines/reference/restElementWithAssignmentPattern5.js b/tests/baselines/reference/restElementWithAssignmentPattern5.js new file mode 100644 index 00000000000..4d4068abcd9 --- /dev/null +++ b/tests/baselines/reference/restElementWithAssignmentPattern5.js @@ -0,0 +1,8 @@ +//// [restElementWithAssignmentPattern5.ts] +var s: string, s2: string; +[...[s, s2]] = ["", ""]; + +//// [restElementWithAssignmentPattern5.js] +var s, s2; +_a = ["", ""], [s, s2] = _a.slice(0); +var _a; diff --git a/tests/baselines/reference/restElementWithAssignmentPattern5.types b/tests/baselines/reference/restElementWithAssignmentPattern5.types new file mode 100644 index 00000000000..8bb6f5845e5 --- /dev/null +++ b/tests/baselines/reference/restElementWithAssignmentPattern5.types @@ -0,0 +1,14 @@ +=== tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern5.ts === +var s: string, s2: string; +>s : string +>s2 : string + +[...[s, s2]] = ["", ""]; +>[...[s, s2]] = ["", ""] : string[] +>[...[s, s2]] : string[] +>...[s, s2] : string +>[s, s2] : string[] +>s : string +>s2 : string +>["", ""] : string[] + diff --git a/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern1.ts b/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern1.ts new file mode 100644 index 00000000000..51fb8ef4a77 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern1.ts @@ -0,0 +1,3 @@ +//@target: ES6 +var a: string, b: number; +[...[a, b = 0]] = ["", 1]; \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern2.ts b/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern2.ts new file mode 100644 index 00000000000..db2defa95d7 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern2.ts @@ -0,0 +1,3 @@ +//@target: ES6 +var a: string, b: number; +[...{ 0: a = "", b }] = ["", 1]; \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern3.ts b/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern3.ts new file mode 100644 index 00000000000..839711498c2 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern3.ts @@ -0,0 +1,3 @@ +var a: string, b: number; +var tuple: [string, number] = ["", 1]; +[...[a, b = 0]] = tuple; \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern4.ts b/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern4.ts new file mode 100644 index 00000000000..5b1ad000529 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern4.ts @@ -0,0 +1,3 @@ +var a: string, b: number; +var tuple: [string, number] = ["", 1]; +[...{ 0: a = "", b }] = tuple; \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern5.ts b/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern5.ts new file mode 100644 index 00000000000..b7656f99fd6 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/restElementWithAssignmentPattern5.ts @@ -0,0 +1,2 @@ +var s: string, s2: string; +[...[s, s2]] = ["", ""]; \ No newline at end of file