From 1d793f4c5e9ab398854ca168b7921b0940c281da Mon Sep 17 00:00:00 2001 From: Yui T Date: Tue, 14 Apr 2015 23:44:14 -0700 Subject: [PATCH 1/2] Destructuring assignment and variable declaration --- ...turingArrayBindingPatternAndAssignment1.js | 41 ++++++ ...ingArrayBindingPatternAndAssignment1.types | 133 ++++++++++++++++++ ...turingArrayBindingPatternAndAssignment2.js | 25 ++++ ...ingArrayBindingPatternAndAssignment2.types | 41 ++++++ ...rayBindingPatternAndAssignment3.errors.txt | 51 +++++++ ...turingArrayBindingPatternAndAssignment3.js | 41 ++++++ ...uringObjectBindingPatternAndAssignment1.js | 27 ++++ ...ngObjectBindingPatternAndAssignment1.types | 87 ++++++++++++ ...uringObjectBindingPatternAndAssignment2.js | 76 ++++++++++ ...ngObjectBindingPatternAndAssignment2.types | 116 +++++++++++++++ ...ectBindingPatternAndAssignment3.errors.txt | 42 ++++++ ...uringObjectBindingPatternAndAssignment3.js | 23 +++ ...ectBindingPatternAndAssignment4.errors.txt | 37 +++++ ...uringObjectBindingPatternAndAssignment4.js | 37 +++++ ...ariableDeclarationAndAssignment.errors.txt | 15 ++ ...cturingVariableDeclarationAndAssignment.js | 9 ++ ...turingArrayBindingPatternAndAssignment1.ts | 22 +++ ...turingArrayBindingPatternAndAssignment2.ts | 13 ++ ...turingArrayBindingPatternAndAssignment3.ts | 23 +++ ...uringObjectBindingPatternAndAssignment1.ts | 12 ++ ...uringObjectBindingPatternAndAssignment2.ts | 46 ++++++ ...uringObjectBindingPatternAndAssignment3.ts | 10 ++ ...uringObjectBindingPatternAndAssignment4.ts | 23 +++ ...cturingVariableDeclarationAndAssignment.ts | 3 + 24 files changed, 953 insertions(+) create mode 100644 tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1.js create mode 100644 tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1.types create mode 100644 tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.js create mode 100644 tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.types create mode 100644 tests/baselines/reference/destructuringArrayBindingPatternAndAssignment3.errors.txt create mode 100644 tests/baselines/reference/destructuringArrayBindingPatternAndAssignment3.js create mode 100644 tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1.js create mode 100644 tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1.types create mode 100644 tests/baselines/reference/destructuringObjectBindingPatternAndAssignment2.js create mode 100644 tests/baselines/reference/destructuringObjectBindingPatternAndAssignment2.types create mode 100644 tests/baselines/reference/destructuringObjectBindingPatternAndAssignment3.errors.txt create mode 100644 tests/baselines/reference/destructuringObjectBindingPatternAndAssignment3.js create mode 100644 tests/baselines/reference/destructuringObjectBindingPatternAndAssignment4.errors.txt create mode 100644 tests/baselines/reference/destructuringObjectBindingPatternAndAssignment4.js create mode 100644 tests/baselines/reference/destructuringVariableDeclarationAndAssignment.errors.txt create mode 100644 tests/baselines/reference/destructuringVariableDeclarationAndAssignment.js create mode 100644 tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment1.ts create mode 100644 tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts create mode 100644 tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment3.ts create mode 100644 tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment1.ts create mode 100644 tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment2.ts create mode 100644 tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts create mode 100644 tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment4.ts create mode 100644 tests/cases/conformance/es6/destructuring/destructuringVariableDeclarationAndAssignment.ts diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1.js b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1.js new file mode 100644 index 0000000000000..f6c84b011d0e9 --- /dev/null +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1.js @@ -0,0 +1,41 @@ +//// [destructuringArrayBindingPatternAndAssignment1.ts] +var [p0,p1, p2] : any = [2, 3, 4]; +var [a, b, c]: [number, number, string] = [1, 2, "string"]; +var [d, e]: any = undefined; +var [f = false, g = 1]: any = undefined; +g = 10; +f = true; + +var [x] = [] +var [[[y]], [[[[z]]]]] = [[[]], [[[[]]]]] +var [[w], m]: [[string|number], boolean] = [[1], true]; +interface J extends Array { + 2: number; +} + +var [, w1] = [1, 2, 3]; +var [,,, w2] = [1, 2, 3, 4]; +var [,,, w2] = [1, 2, 3, 4]; +var [,,,...w3] = [1, 2, 3, 4, "hello"]; + +var [r, s, ...t] = [1, 2, "string"]; +var [r1, s1, t1] = [1, 2, "string"]; + + + +//// [destructuringArrayBindingPatternAndAssignment1.js] +var _a = [2, 3, 4], p0 = _a[0], p1 = _a[1], p2 = _a[2]; +var _b = [1, 2, "string"], a = _b[0], b = _b[1], c = _b[2]; +var d = undefined[0], e = undefined[1]; +var _c = undefined[0], f = _c === void 0 ? false : _c, _d = undefined[1], g = _d === void 0 ? 1 : _d; +g = 10; +f = true; +var x = ([])[0]; +var _e = [[[]], [[[[]]]]], y = _e[0][0][0], z = _e[1][0][0][0][0]; +var _f = [[1], true], w = _f[0][0], m = _f[1]; +var _g = [1, 2, 3], w1 = _g[1]; +var _h = [1, 2, 3, 4], w2 = _h[3]; +var _j = [1, 2, 3, 4], w2 = _j[3]; +var _k = [1, 2, 3, 4, "hello"], w3 = _k.slice(3); +var _l = [1, 2, "string"], r = _l[0], s = _l[1], t = _l.slice(2); +var _m = [1, 2, "string"], r1 = _m[0], s1 = _m[1], t1 = _m[2]; diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1.types b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1.types new file mode 100644 index 0000000000000..f4abb8953f697 --- /dev/null +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment1.types @@ -0,0 +1,133 @@ +=== tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment1.ts === +var [p0,p1, p2] : any = [2, 3, 4]; +>p0 : any, Symbol(p0, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 0, 5)) +>p1 : any, Symbol(p1, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 0, 8)) +>p2 : any, Symbol(p2, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 0, 11)) +>[2, 3, 4] : number[] +>2 : number +>3 : number +>4 : number + +var [a, b, c]: [number, number, string] = [1, 2, "string"]; +>a : number, Symbol(a, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 1, 5)) +>b : number, Symbol(b, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 1, 7)) +>c : string, Symbol(c, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 1, 10)) +>[1, 2, "string"] : [number, number, string] +>1 : number +>2 : number +>"string" : string + +var [d, e]: any = undefined; +>d : any, Symbol(d, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 2, 5)) +>e : any, Symbol(e, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 2, 7)) +>undefined : undefined, Symbol(undefined) + +var [f = false, g = 1]: any = undefined; +>f : boolean, Symbol(f, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 3, 5)) +>false : boolean +>g : number, Symbol(g, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 3, 15)) +>1 : number +>undefined : undefined, Symbol(undefined) + +g = 10; +>g = 10 : number +>g : number, Symbol(g, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 3, 15)) +>10 : number + +f = true; +>f = true : boolean +>f : boolean, Symbol(f, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 3, 5)) +>true : boolean + +var [x] = [] +>x : any, Symbol(x, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 7, 5)) +>[] : undefined[] + +var [[[y]], [[[[z]]]]] = [[[]], [[[[]]]]] +>y : any, Symbol(y, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 8, 7)) +>z : any, Symbol(z, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 8, 16)) +>[[[]], [[[[]]]]] : [[undefined[]], [[[undefined[]]]]] +>[[]] : [undefined[]] +>[] : undefined[] +>[[[[]]]] : [[[undefined[]]]] +>[[[]]] : [[undefined[]]] +>[[]] : [undefined[]] +>[] : undefined[] + +var [[w], m]: [[string|number], boolean] = [[1], true]; +>w : string | number, Symbol(w, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 9, 6)) +>m : boolean, Symbol(m, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 9, 9)) +>[[1], true] : [[number], boolean] +>[1] : [number] +>1 : number +>true : boolean + +interface J extends Array { +>J : J, Symbol(J, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 9, 55)) +>Array : T[], Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11)) +>Number : Number, Symbol(Number, Decl(lib.d.ts, 456, 40), Decl(lib.d.ts, 518, 11)) + + 2: number; +} + +var [, w1] = [1, 2, 3]; +> : undefined +>w1 : number, Symbol(w1, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 14, 6)) +>[1, 2, 3] : [number, number, number] +>1 : number +>2 : number +>3 : number + +var [,,, w2] = [1, 2, 3, 4]; +> : undefined +> : undefined +> : undefined +>w2 : number, Symbol(w2, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 15, 8), Decl(destructuringArrayBindingPatternAndAssignment1.ts, 16, 8)) +>[1, 2, 3, 4] : [number, number, number, number] +>1 : number +>2 : number +>3 : number +>4 : number + +var [,,, w2] = [1, 2, 3, 4]; +> : undefined +> : undefined +> : undefined +>w2 : number, Symbol(w2, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 15, 8), Decl(destructuringArrayBindingPatternAndAssignment1.ts, 16, 8)) +>[1, 2, 3, 4] : [number, number, number, number] +>1 : number +>2 : number +>3 : number +>4 : number + +var [,,,...w3] = [1, 2, 3, 4, "hello"]; +> : undefined +> : undefined +> : undefined +>w3 : (string | number)[], Symbol(w3, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 17, 8)) +>[1, 2, 3, 4, "hello"] : (string | number)[] +>1 : number +>2 : number +>3 : number +>4 : number +>"hello" : string + +var [r, s, ...t] = [1, 2, "string"]; +>r : string | number, Symbol(r, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 19, 5)) +>s : string | number, Symbol(s, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 19, 7)) +>t : (string | number)[], Symbol(t, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 19, 10)) +>[1, 2, "string"] : (string | number)[] +>1 : number +>2 : number +>"string" : string + +var [r1, s1, t1] = [1, 2, "string"]; +>r1 : number, Symbol(r1, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 20, 5)) +>s1 : number, Symbol(s1, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 20, 8)) +>t1 : string, Symbol(t1, Decl(destructuringArrayBindingPatternAndAssignment1.ts, 20, 12)) +>[1, 2, "string"] : [number, number, string] +>1 : number +>2 : number +>"string" : string + + diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.js b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.js new file mode 100644 index 0000000000000..67cfaef96d652 --- /dev/null +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.js @@ -0,0 +1,25 @@ +//// [destructuringArrayBindingPatternAndAssignment2.ts] +function foo() { + return [1, 2, 3]; +} +interface J extends Array { + 2: number; +} + +function bar(): J { + return <[number, number, number]>[1, 2, 3]; +} + +var [j, k] = foo(); +var [...p] = foo(); + + +//// [destructuringArrayBindingPatternAndAssignment2.js] +function foo() { + return [1, 2, 3]; +} +function bar() { + return [1, 2, 3]; +} +var _a = foo(), j = _a[0], k = _a[1]; +var _b = foo(), p = _b.slice(0); diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.types b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.types new file mode 100644 index 0000000000000..f6b40e5fc95c4 --- /dev/null +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment2.types @@ -0,0 +1,41 @@ +=== tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts === +function foo() { +>foo : () => number[], Symbol(foo, Decl(destructuringArrayBindingPatternAndAssignment2.ts, 0, 0)) + + return [1, 2, 3]; +>[1, 2, 3] : number[] +>1 : number +>2 : number +>3 : number +} +interface J extends Array { +>J : J, Symbol(J, Decl(destructuringArrayBindingPatternAndAssignment2.ts, 2, 1)) +>Array : T[], Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11)) +>Number : Number, Symbol(Number, Decl(lib.d.ts, 456, 40), Decl(lib.d.ts, 518, 11)) + + 2: number; +} + +function bar(): J { +>bar : () => J, Symbol(bar, Decl(destructuringArrayBindingPatternAndAssignment2.ts, 5, 1)) +>J : J, Symbol(J, Decl(destructuringArrayBindingPatternAndAssignment2.ts, 2, 1)) + + return <[number, number, number]>[1, 2, 3]; +><[number, number, number]>[1, 2, 3] : [number, number, number] +>[1, 2, 3] : [number, number, number] +>1 : number +>2 : number +>3 : number +} + +var [j, k] = foo(); +>j : number, Symbol(j, Decl(destructuringArrayBindingPatternAndAssignment2.ts, 11, 5)) +>k : number, Symbol(k, Decl(destructuringArrayBindingPatternAndAssignment2.ts, 11, 7)) +>foo() : number[] +>foo : () => number[], Symbol(foo, Decl(destructuringArrayBindingPatternAndAssignment2.ts, 0, 0)) + +var [...p] = foo(); +>p : number[], Symbol(p, Decl(destructuringArrayBindingPatternAndAssignment2.ts, 12, 5)) +>foo() : number[] +>foo : () => number[], Symbol(foo, Decl(destructuringArrayBindingPatternAndAssignment2.ts, 0, 0)) + diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment3.errors.txt b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment3.errors.txt new file mode 100644 index 0000000000000..8cb1d9eb8c204 --- /dev/null +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment3.errors.txt @@ -0,0 +1,51 @@ +tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment3.ts(19,5): error TS2322: Type 'undefined[]' is not assignable to type 'H'. + Property '0' is missing in type 'undefined[]'. +tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment3.ts(19,5): error TS2461: Type 'H' is not an array type. +tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment3.ts(20,6): error TS2461: Type 'undefined' is not an array type. +tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment3.ts(20,13): error TS2461: Type 'undefined' is not an array type. +tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment3.ts(21,13): error TS2462: A rest element must be last in an array destructuring pattern +tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment3.ts(22,6): error TS2322: Type 'string' is not assignable to type 'Number'. + Property 'toFixed' is missing in type 'String'. +tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment3.ts(23,5): error TS2461: Type '{}' is not an array type. + + +==== tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment3.ts (7 errors) ==== + interface H { + 0: number, + 1: string + } + interface J extends Array { + 2: number; + } + + function bar(): J { + return <[number, number, number]>[1, 2, 3]; + } + + function gg(idx: number) { + return { + [idx]: true + } + } + + var [h, g, i]: H = []; + ~~~~~~~~~ +!!! error TS2322: Type 'undefined[]' is not assignable to type 'H'. +!!! error TS2322: Property '0' is missing in type 'undefined[]'. + ~~~~~~~~~ +!!! error TS2461: Type 'H' is not an array type. + var [[[y]], [[[[z]]]]] = [] + ~~~~~ +!!! error TS2461: Type 'undefined' is not an array type. + ~~~~~~~~~ +!!! error TS2461: Type 'undefined' is not an array type. + var [, , ...w4, , ] = [] + ~~ +!!! error TS2462: A rest element must be last in an array destructuring pattern + var [a = "string", b, c] = bar(); + ~ +!!! error TS2322: Type 'string' is not assignable to type 'Number'. +!!! error TS2322: Property 'toFixed' is missing in type 'String'. + var [r, s, t] = gg(1); + ~~~~~~~~~ +!!! error TS2461: Type '{}' is not an array type. \ No newline at end of file diff --git a/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment3.js b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment3.js new file mode 100644 index 0000000000000..ad5d1c5c05188 --- /dev/null +++ b/tests/baselines/reference/destructuringArrayBindingPatternAndAssignment3.js @@ -0,0 +1,41 @@ +//// [destructuringArrayBindingPatternAndAssignment3.ts] +interface H { + 0: number, + 1: string +} +interface J extends Array { + 2: number; +} + +function bar(): J { + return <[number, number, number]>[1, 2, 3]; +} + +function gg(idx: number) { + return { + [idx]: true + } +} + +var [h, g, i]: H = []; +var [[[y]], [[[[z]]]]] = [] +var [, , ...w4, , ] = [] +var [a = "string", b, c] = bar(); +var [r, s, t] = gg(1); + +//// [destructuringArrayBindingPatternAndAssignment3.js] +function bar() { + return [1, 2, 3]; +} +function gg(idx) { + return (_a = {}, + _a[idx] = true, + _a + ); + var _a; +} +var _a = [], h = _a[0], g = _a[1], i = _a[2]; +var _b = [], y = _b[0][0][0], z = _b[1][0][0][0][0]; +var _c = []; +var _d = bar(), _e = _d[0], a = _e === void 0 ? "string" : _e, b = _d[1], c = _d[2]; +var _f = gg(1), r = _f[0], s = _f[1], t = _f[2]; diff --git a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1.js b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1.js new file mode 100644 index 0000000000000..375cfd8f57370 --- /dev/null +++ b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1.js @@ -0,0 +1,27 @@ +//// [destructuringObjectBindingPatternAndAssignment1.ts] +var c = 0; +var { a, } = { a:1, }; +var { b: { c } } = { b: { c } }; +var { b1: { c1 } = { c1: "string" } } = { b1: { c1: "world" } }; +var { d1 }: any = undefined; +var { e1 }: any = {}; +var { f: {f1} = { f1: "string" } }: any = {}; +var { f2: {f21} = { f21: "string" } }: any = undefined; +var { e1: {e2} = { e2: "string" } }: any|{ e1: { e2 } } = undefined; +var { e2: {e3} = { e3: "string" } }: any|{ e2: { e3 } } = {}; +var {g = 1}: any = { g: 100000 }; +var {1: x} = { 1: "string" }; + +//// [destructuringObjectBindingPatternAndAssignment1.js] +var c = 0; +var a = ({ a: 1 }).a; +var c = ({ b: { c: c } }).b.c; +var _a = ({ b1: { c1: "world" } }).b1, c1 = (_a === void 0 ? { c1: "string" } : _a).c1; +var d1 = undefined.d1; +var e1 = ({}).e1; +var _b = ({}).f, f1 = (_b === void 0 ? { f1: "string" } : _b).f1; +var _c = undefined.f2, f21 = (_c === void 0 ? { f21: "string" } : _c).f21; +var _d = undefined.e1, e2 = (_d === void 0 ? { e2: "string" } : _d).e2; +var _e = ({}).e2, e3 = (_e === void 0 ? { e3: "string" } : _e).e3; +var _f = ({ g: 100000 }).g, g = _f === void 0 ? 1 : _f; +var x = ({ 1: "string" })[1]; diff --git a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1.types b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1.types new file mode 100644 index 0000000000000..46fbe3a9630bf --- /dev/null +++ b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment1.types @@ -0,0 +1,87 @@ +=== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment1.ts === +var c = 0; +>c : number, Symbol(c, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 0, 3), Decl(destructuringObjectBindingPatternAndAssignment1.ts, 2, 10)) +>0 : number + +var { a, } = { a:1, }; +>a : number, Symbol(a, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 1, 5)) +>{ a:1, } : { a: number; } +>a : number, Symbol(a, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 1, 14)) +>1 : number + +var { b: { c } } = { b: { c } }; +>b : any +>c : number, Symbol(c, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 0, 3), Decl(destructuringObjectBindingPatternAndAssignment1.ts, 2, 10)) +>{ b: { c } } : { b: { c: number; }; } +>b : { c: number; }, Symbol(b, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 2, 21)) +>{ c } : { c: number; } +>c : number, Symbol(c, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 2, 26)) + +var { b1: { c1 } = { c1: "string" } } = { b1: { c1: "world" } }; +>b1 : any +>c1 : string, Symbol(c1, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 3, 11)) +>{ c1: "string" } : { c1: string; } +>c1 : string, Symbol(c1, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 3, 20)) +>"string" : string +>{ b1: { c1: "world" } } : { b1: { c1: string; }; } +>b1 : { c1: string; }, Symbol(b1, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 3, 42)) +>{ c1: "world" } : { c1: string; } +>c1 : string, Symbol(c1, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 3, 48)) +>"world" : string + +var { d1 }: any = undefined; +>d1 : any, Symbol(d1, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 4, 5)) +>undefined : undefined, Symbol(undefined) + +var { e1 }: any = {}; +>e1 : any, Symbol(e1, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 5, 5)) +>{} : {} + +var { f: {f1} = { f1: "string" } }: any = {}; +>f : any +>f1 : string, Symbol(f1, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 6, 10)) +>{ f1: "string" } : { f1: string; } +>f1 : string, Symbol(f1, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 6, 17)) +>"string" : string +>{} : {} + +var { f2: {f21} = { f21: "string" } }: any = undefined; +>f2 : any +>f21 : string, Symbol(f21, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 7, 11)) +>{ f21: "string" } : { f21: string; } +>f21 : string, Symbol(f21, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 7, 19)) +>"string" : string +>undefined : undefined, Symbol(undefined) + +var { e1: {e2} = { e2: "string" } }: any|{ e1: { e2 } } = undefined; +>e1 : any +>e2 : string, Symbol(e2, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 8, 11)) +>{ e2: "string" } : { e2: string; } +>e2 : string, Symbol(e2, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 8, 18)) +>"string" : string +>e1 : { e2: any; }, Symbol(e1, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 8, 42)) +>e2 : any, Symbol(e2, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 8, 48)) +>undefined : undefined, Symbol(undefined) + +var { e2: {e3} = { e3: "string" } }: any|{ e2: { e3 } } = {}; +>e2 : any +>e3 : string, Symbol(e3, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 9, 11)) +>{ e3: "string" } : { e3: string; } +>e3 : string, Symbol(e3, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 9, 18)) +>"string" : string +>e2 : { e3: any; }, Symbol(e2, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 9, 42)) +>e3 : any, Symbol(e3, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 9, 48)) +>{} : {} + +var {g = 1}: any = { g: 100000 }; +>g : number, Symbol(g, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 10, 5)) +>1 : number +>{ g: 100000 } : { g: number; } +>g : number, Symbol(g, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 10, 20)) +>100000 : number + +var {1: x} = { 1: "string" }; +>x : string, Symbol(x, Decl(destructuringObjectBindingPatternAndAssignment1.ts, 11, 5)) +>{ 1: "string" } : { 1: string; } +>"string" : string + diff --git a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment2.js b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment2.js new file mode 100644 index 0000000000000..32ce0ab0c3178 --- /dev/null +++ b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment2.js @@ -0,0 +1,76 @@ +//// [destructuringObjectBindingPatternAndAssignment2.ts] +interface I { + j: number; + [str: string]: number; +} +interface J { + [str: string]: number; +} +function zz() { + return { + "cat": "dog", + } +} + +function zz1(): J { + return { + "cat": 1, + } +} + +function yy() { + return {} +} + +var {j}: I| J = { j: 1000 }; +var {cat} = zz(); +var {"cat":cart} = zz(); + +var {can}: J = {}; +var {can1}: J = zz1(); + + +function f() { + var { z }: { z: number } = { z }; +} + +interface K { + [idx: number]: boolean +} + +var {1: boo}: K = { 1: true }; +var {1: boo1}: K = { }; + +function bar(): K { + return { }; +} +var {1: baz} = bar(); + +//// [destructuringObjectBindingPatternAndAssignment2.js] +function zz() { + return { + "cat": "dog" + }; +} +function zz1() { + return { + "cat": 1 + }; +} +function yy() { + return {}; +} +var j = ({ j: 1000 }).j; +var cat = (zz()).cat; +var cart = (zz())["cat"]; +var can = ({}).can; +var can1 = (zz1()).can1; +function f() { + var z = ({ z: z }).z; +} +var boo = ({ 1: true })[1]; +var boo1 = ({})[1]; +function bar() { + return {}; +} +var baz = (bar())[1]; diff --git a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment2.types b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment2.types new file mode 100644 index 0000000000000..a46f24066019f --- /dev/null +++ b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment2.types @@ -0,0 +1,116 @@ +=== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment2.ts === +interface I { +>I : I, Symbol(I, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 0, 0)) + + j: number; +>j : number, Symbol(j, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 0, 13)) + + [str: string]: number; +>str : string, Symbol(str, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 2, 5)) +} +interface J { +>J : J, Symbol(J, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 3, 1)) + + [str: string]: number; +>str : string, Symbol(str, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 5, 5)) +} +function zz() { +>zz : () => { "cat": string; }, Symbol(zz, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 6, 1)) + + return { +>{ "cat": "dog", } : { "cat": string; } + + "cat": "dog", +>"dog" : string + } +} + +function zz1(): J { +>zz1 : () => J, Symbol(zz1, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 11, 1)) +>J : J, Symbol(J, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 3, 1)) + + return { +>{ "cat": 1, } : { [x: string]: number; "cat": number; } + + "cat": 1, +>1 : number + } +} + +function yy() { +>yy : () => {}, Symbol(yy, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 17, 1)) + + return {} +>{} : {} +} + +var {j}: I| J = { j: 1000 }; +>j : number, Symbol(j, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 23, 5)) +>I : I, Symbol(I, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 0, 0)) +>J : J, Symbol(J, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 3, 1)) +>{ j: 1000 } : { [x: string]: number; j: number; } +>j : number, Symbol(j, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 23, 17)) +>1000 : number + +var {cat} = zz(); +>cat : string, Symbol(cat, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 24, 5)) +>zz() : { "cat": string; } +>zz : () => { "cat": string; }, Symbol(zz, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 6, 1)) + +var {"cat":cart} = zz(); +>cart : string, Symbol(cart, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 25, 5)) +>zz() : { "cat": string; } +>zz : () => { "cat": string; }, Symbol(zz, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 6, 1)) + +var {can}: J = {}; +>can : number, Symbol(can, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 27, 5)) +>J : J, Symbol(J, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 3, 1)) +>{} : { [x: string]: undefined; } + +var {can1}: J = zz1(); +>can1 : number, Symbol(can1, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 28, 5)) +>J : J, Symbol(J, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 3, 1)) +>zz1() : J +>zz1 : () => J, Symbol(zz1, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 11, 1)) + + +function f() { +>f : () => void, Symbol(f, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 28, 22)) + + var { z }: { z: number } = { z }; +>z : number, Symbol(z, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 32, 9)) +>z : number, Symbol(z, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 32, 16)) +>{ z } : { z: number; } +>z : number, Symbol(z, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 32, 32)) +} + +interface K { +>K : K, Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 33, 1)) + + [idx: number]: boolean +>idx : number, Symbol(idx, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 36, 5)) +} + +var {1: boo}: K = { 1: true }; +>boo : boolean, Symbol(boo, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 39, 5)) +>K : K, Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 33, 1)) +>{ 1: true } : { [x: number]: boolean; 1: boolean; } +>true : boolean + +var {1: boo1}: K = { }; +>boo1 : boolean, Symbol(boo1, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 40, 5)) +>K : K, Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 33, 1)) +>{ } : { [x: number]: undefined; } + +function bar(): K { +>bar : () => K, Symbol(bar, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 40, 23)) +>K : K, Symbol(K, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 33, 1)) + + return { }; +>{ } : { [x: number]: undefined; } +} +var {1: baz} = bar(); +>baz : boolean, Symbol(baz, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 45, 5)) +>bar() : K +>bar : () => K, Symbol(bar, Decl(destructuringObjectBindingPatternAndAssignment2.ts, 40, 23)) + diff --git a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment3.errors.txt b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment3.errors.txt new file mode 100644 index 0000000000000..de4dcee1bf27b --- /dev/null +++ b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment3.errors.txt @@ -0,0 +1,42 @@ +tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(1,7): error TS1005: ',' expected. +tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(2,5): error TS2322: Type '{ i: number; }' is not assignable to type 'string | number'. + Type '{ i: number; }' is not assignable to type 'number'. +tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(2,6): error TS2459: Type 'string | number' has no property 'i' and no string index signature. +tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(3,6): error TS2459: Type 'string | number | {}' has no property 'i1' and no string index signature. +tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(4,12): error TS2459: Type '{ f212: string; }' has no property 'f21' and no string index signature. +tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(5,54): error TS2304: Cannot find name 'c'. +tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(7,7): error TS1180: Property destructuring pattern expected. +tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(10,7): error TS1005: ':' expected. +tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts(10,15): error TS1005: ':' expected. + + +==== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts (9 errors) ==== + var {h?} = { h?: 1 }; + ~ +!!! error TS1005: ',' expected. + var {i}: string | number = { i: 2 }; + ~~~ +!!! error TS2322: Type '{ i: number; }' is not assignable to type 'string | number'. +!!! error TS2322: Type '{ i: number; }' is not assignable to type 'number'. + ~ +!!! error TS2459: Type 'string | number' has no property 'i' and no string index signature. + var {i1}: string | number| {} = { i1: 2 }; + ~~ +!!! error TS2459: Type 'string | number | {}' has no property 'i1' and no string index signature. + var { f2: {f21} = { f212: "string" } }: any = undefined; + ~~~ +!!! error TS2459: Type '{ f212: string; }' has no property 'f21' and no string index signature. + var { b1: { c1 } = { c1: "string" } } = { b1: { c1: c } }; + ~ +!!! error TS2304: Cannot find name 'c'. + var { d }: any; + var { ...d1 } = { + ~~~ +!!! error TS1180: Property destructuring pattern expected. + a: 1, b: 1, d1: 9, e: 10 + } + var {1} = { 1 }; + ~ +!!! error TS1005: ':' expected. + ~ +!!! error TS1005: ':' expected. \ No newline at end of file diff --git a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment3.js b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment3.js new file mode 100644 index 0000000000000..d53afcbb97c5e --- /dev/null +++ b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment3.js @@ -0,0 +1,23 @@ +//// [destructuringObjectBindingPatternAndAssignment3.ts] +var {h?} = { h?: 1 }; +var {i}: string | number = { i: 2 }; +var {i1}: string | number| {} = { i1: 2 }; +var { f2: {f21} = { f212: "string" } }: any = undefined; +var { b1: { c1 } = { c1: "string" } } = { b1: { c1: c } }; +var { d }: any; +var { ...d1 } = { + a: 1, b: 1, d1: 9, e: 10 +} +var {1} = { 1 }; + +//// [destructuringObjectBindingPatternAndAssignment3.js] +var h = ({ h: 1 }).h; +var i = ({ i: 2 }).i; +var i1 = ({ i1: 2 }).i1; +var _a = undefined.f2, f21 = (_a === void 0 ? { f212: "string" } : _a).f21; +var _b = ({ b1: { c1: c } }).b1, c1 = (_b === void 0 ? { c1: "string" } : _b).c1; +var d = (void 0).d; +var d1 = ({ + a: 1, b: 1, d1: 9, e: 10 +}).d1; +var = ({ 1: })[1]; diff --git a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment4.errors.txt b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment4.errors.txt new file mode 100644 index 0000000000000..f0b7977a44343 --- /dev/null +++ b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment4.errors.txt @@ -0,0 +1,37 @@ +tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment4.ts(7,6): error TS2459: Type 'K | K1' has no property 'k' and no string index signature. +tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment4.ts(12,6): error TS2459: Type '{}' has no property '2' and no string index signature. +tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment4.ts(23,5): error TS2322: Type '{ "cat": string; }' is not assignable to type 'J'. + Index signature is missing in type '{ "cat": string; }'. + + +==== tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment4.ts (3 errors) ==== + interface K { + [str: string]: string; + } + interface K1 { + k: string; + } + var {k}: K|K1 = { k: "string" }; + ~ +!!! error TS2459: Type 'K | K1' has no property 'k' and no string index signature. + + function barn() { + return {}; + } + var {2: baz1} = barn() + ~ +!!! error TS2459: Type '{}' has no property '2' and no string index signature. + + interface J { + [str: string]: number; + } + function zz() { + return { + "cat": "dog" + } + } + + var {"can": can}: J = zz(); + ~~~~~~~~~~~~ +!!! error TS2322: Type '{ "cat": string; }' is not assignable to type 'J'. +!!! error TS2322: Index signature is missing in type '{ "cat": string; }'. \ No newline at end of file diff --git a/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment4.js b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment4.js new file mode 100644 index 0000000000000..7abf9f3b84581 --- /dev/null +++ b/tests/baselines/reference/destructuringObjectBindingPatternAndAssignment4.js @@ -0,0 +1,37 @@ +//// [destructuringObjectBindingPatternAndAssignment4.ts] +interface K { + [str: string]: string; +} +interface K1 { + k: string; +} +var {k}: K|K1 = { k: "string" }; + +function barn() { + return {}; +} +var {2: baz1} = barn() + +interface J { + [str: string]: number; +} +function zz() { + return { + "cat": "dog" + } +} + +var {"can": can}: J = zz(); + +//// [destructuringObjectBindingPatternAndAssignment4.js] +var k = ({ k: "string" }).k; +function barn() { + return {}; +} +var baz1 = (barn())[2]; +function zz() { + return { + "cat": "dog" + }; +} +var can = (zz())["can"]; diff --git a/tests/baselines/reference/destructuringVariableDeclarationAndAssignment.errors.txt b/tests/baselines/reference/destructuringVariableDeclarationAndAssignment.errors.txt new file mode 100644 index 0000000000000..a455ee862c448 --- /dev/null +++ b/tests/baselines/reference/destructuringVariableDeclarationAndAssignment.errors.txt @@ -0,0 +1,15 @@ +tests/cases/conformance/es6/destructuring/destructuringVariableDeclarationAndAssignment.ts(3,23): error TS2459: Type 'number | { b12: number; b42: number; }' has no property 'b12' and no string index signature. +tests/cases/conformance/es6/destructuring/destructuringVariableDeclarationAndAssignment.ts(3,33): error TS2459: Type 'number | { b12: number; b42: number; }' has no property 'b42' and no string index signature. +tests/cases/conformance/es6/destructuring/destructuringVariableDeclarationAndAssignment.ts(3,44): error TS2403: Subsequent variable declarations must have the same type. Variable 'c' must be of type 'number', but here has type '(number | { b12: number; b42: number; })[]'. + + +==== tests/cases/conformance/es6/destructuring/destructuringVariableDeclarationAndAssignment.ts (3 errors) ==== + var {o: [a1, a2, a3 = { b1: 1000, b4: 200 }]} = { o: [1, 2, { b1: 4, b4: 0 }] }; + var {o0: [c, d, { e: e1, f }, , ]} = { o0: [1, 2, { e: 4, f: 0 }] }; + var {o1: [a11, a21, { b12: b22, b42 },, ...c]} = { o1: [1, 2, { b12: 4, b42: 0 }] }; + ~~~ +!!! error TS2459: Type 'number | { b12: number; b42: number; }' has no property 'b12' and no string index signature. + ~~~ +!!! error TS2459: Type 'number | { b12: number; b42: number; }' has no property 'b42' and no string index signature. + ~ +!!! error TS2403: Subsequent variable declarations must have the same type. Variable 'c' must be of type 'number', but here has type '(number | { b12: number; b42: number; })[]'. \ No newline at end of file diff --git a/tests/baselines/reference/destructuringVariableDeclarationAndAssignment.js b/tests/baselines/reference/destructuringVariableDeclarationAndAssignment.js new file mode 100644 index 0000000000000..b089d2ab4fb43 --- /dev/null +++ b/tests/baselines/reference/destructuringVariableDeclarationAndAssignment.js @@ -0,0 +1,9 @@ +//// [destructuringVariableDeclarationAndAssignment.ts] +var {o: [a1, a2, a3 = { b1: 1000, b4: 200 }]} = { o: [1, 2, { b1: 4, b4: 0 }] }; +var {o0: [c, d, { e: e1, f }, , ]} = { o0: [1, 2, { e: 4, f: 0 }] }; +var {o1: [a11, a21, { b12: b22, b42 },, ...c]} = { o1: [1, 2, { b12: 4, b42: 0 }] }; + +//// [destructuringVariableDeclarationAndAssignment.js] +var _a = ({ o: [1, 2, { b1: 4, b4: 0 }] }).o, a1 = _a[0], a2 = _a[1], _b = _a[2], a3 = _b === void 0 ? { b1: 1000, b4: 200 } : _b; +var _c = ({ o0: [1, 2, { e: 4, f: 0 }] }).o0, c = _c[0], d = _c[1], _d = _c[2], e1 = _d.e, f = _d.f; +var _e = ({ o1: [1, 2, { b12: 4, b42: 0 }] }).o1, a11 = _e[0], a21 = _e[1], _f = _e[2], b22 = _f.b12, b42 = _f.b42, c = _e.slice(4); diff --git a/tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment1.ts b/tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment1.ts new file mode 100644 index 0000000000000..4e6c46d267454 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment1.ts @@ -0,0 +1,22 @@ +var [p0,p1, p2] : any = [2, 3, 4]; +var [a, b, c]: [number, number, string] = [1, 2, "string"]; +var [d, e]: any = undefined; +var [f = false, g = 1]: any = undefined; +g = 10; +f = true; + +var [x] = [] +var [[[y]], [[[[z]]]]] = [[[]], [[[[]]]]] +var [[w], m]: [[string|number], boolean] = [[1], true]; +interface J extends Array { + 2: number; +} + +var [, w1] = [1, 2, 3]; +var [,,, w2] = [1, 2, 3, 4]; +var [,,, w2] = [1, 2, 3, 4]; +var [,,,...w3] = [1, 2, 3, 4, "hello"]; + +var [r, s, ...t] = [1, 2, "string"]; +var [r1, s1, t1] = [1, 2, "string"]; + diff --git a/tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts b/tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts new file mode 100644 index 0000000000000..3b094541d3051 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment2.ts @@ -0,0 +1,13 @@ +function foo() { + return [1, 2, 3]; +} +interface J extends Array { + 2: number; +} + +function bar(): J { + return <[number, number, number]>[1, 2, 3]; +} + +var [j, k] = foo(); +var [...p] = foo(); diff --git a/tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment3.ts b/tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment3.ts new file mode 100644 index 0000000000000..43f8c3546dfee --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/destructuringArrayBindingPatternAndAssignment3.ts @@ -0,0 +1,23 @@ +interface H { + 0: number, + 1: string +} +interface J extends Array { + 2: number; +} + +function bar(): J { + return <[number, number, number]>[1, 2, 3]; +} + +function gg(idx: number) { + return { + [idx]: true + } +} + +var [h, g, i]: H = []; +var [[[y]], [[[[z]]]]] = [] +var [, , ...w4, , ] = [] +var [a = "string", b, c] = bar(); +var [r, s, t] = gg(1); \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment1.ts b/tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment1.ts new file mode 100644 index 0000000000000..f15541aaf905e --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment1.ts @@ -0,0 +1,12 @@ +var c = 0; +var { a, } = { a:1, }; +var { b: { c } } = { b: { c } }; +var { b1: { c1 } = { c1: "string" } } = { b1: { c1: "world" } }; +var { d1 }: any = undefined; +var { e1 }: any = {}; +var { f: {f1} = { f1: "string" } }: any = {}; +var { f2: {f21} = { f21: "string" } }: any = undefined; +var { e1: {e2} = { e2: "string" } }: any|{ e1: { e2 } } = undefined; +var { e2: {e3} = { e3: "string" } }: any|{ e2: { e3 } } = {}; +var {g = 1}: any = { g: 100000 }; +var {1: x} = { 1: "string" }; \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment2.ts b/tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment2.ts new file mode 100644 index 0000000000000..026c901dbe77a --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment2.ts @@ -0,0 +1,46 @@ +interface I { + j: number; + [str: string]: number; +} +interface J { + [str: string]: number; +} +function zz() { + return { + "cat": "dog", + } +} + +function zz1(): J { + return { + "cat": 1, + } +} + +function yy() { + return {} +} + +var {j}: I| J = { j: 1000 }; +var {cat} = zz(); +var {"cat":cart} = zz(); + +var {can}: J = {}; +var {can1}: J = zz1(); + + +function f() { + var { z }: { z: number } = { z }; +} + +interface K { + [idx: number]: boolean +} + +var {1: boo}: K = { 1: true }; +var {1: boo1}: K = { }; + +function bar(): K { + return { }; +} +var {1: baz} = bar(); \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts b/tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts new file mode 100644 index 0000000000000..524728dc9d6b8 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment3.ts @@ -0,0 +1,10 @@ +var {h?} = { h?: 1 }; +var {i}: string | number = { i: 2 }; +var {i1}: string | number| {} = { i1: 2 }; +var { f2: {f21} = { f212: "string" } }: any = undefined; +var { b1: { c1 } = { c1: "string" } } = { b1: { c1: c } }; +var { d }: any; +var { ...d1 } = { + a: 1, b: 1, d1: 9, e: 10 +} +var {1} = { 1 }; \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment4.ts b/tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment4.ts new file mode 100644 index 0000000000000..3cb7ae06581e5 --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/destructuringObjectBindingPatternAndAssignment4.ts @@ -0,0 +1,23 @@ +interface K { + [str: string]: string; +} +interface K1 { + k: string; +} +var {k}: K|K1 = { k: "string" }; + +function barn() { + return {}; +} +var {2: baz1} = barn() + +interface J { + [str: string]: number; +} +function zz() { + return { + "cat": "dog" + } +} + +var {"can": can}: J = zz(); \ No newline at end of file diff --git a/tests/cases/conformance/es6/destructuring/destructuringVariableDeclarationAndAssignment.ts b/tests/cases/conformance/es6/destructuring/destructuringVariableDeclarationAndAssignment.ts new file mode 100644 index 0000000000000..a3377dfb8f3ac --- /dev/null +++ b/tests/cases/conformance/es6/destructuring/destructuringVariableDeclarationAndAssignment.ts @@ -0,0 +1,3 @@ +var {o: [a1, a2, a3 = { b1: 1000, b4: 200 }]} = { o: [1, 2, { b1: 4, b4: 0 }] }; +var {o0: [c, d, { e: e1, f }, , ]} = { o0: [1, 2, { e: 4, f: 0 }] }; +var {o1: [a11, a21, { b12: b22, b42 },, ...c]} = { o1: [1, 2, { b12: 4, b42: 0 }] }; \ No newline at end of file From b0f577516cbfdbf44c84ac288415bb1ce5a76c58 Mon Sep 17 00:00:00 2001 From: Yui T Date: Wed, 15 Apr 2015 16:30:32 -0700 Subject: [PATCH 2/2] Add conformance tests for contextually typed expression --- ...umentExpressionContextualTyping.errors.txt | 36 ++++++++++++++ .../argumentExpressionContextualTyping.js | 37 ++++++++++++++ ...teralExpressionContextualTyping.errors.txt | 29 +++++++++++ .../arrayLiteralExpressionContextualTyping.js | 21 ++++++++ .../getSetAccessorContextualTyping.errors.txt | 40 ++++++++++++++++ .../getSetAccessorContextualTyping.js | 48 +++++++++++++++++++ .../argumentExpressionContextualTyping.ts | 16 +++++++ .../arrayLiteralExpressionContextualTyping.ts | 9 ++++ .../getSetAccessorContextualTyping.ts | 16 +++++++ 9 files changed, 252 insertions(+) create mode 100644 tests/baselines/reference/argumentExpressionContextualTyping.errors.txt create mode 100644 tests/baselines/reference/argumentExpressionContextualTyping.js create mode 100644 tests/baselines/reference/arrayLiteralExpressionContextualTyping.errors.txt create mode 100644 tests/baselines/reference/arrayLiteralExpressionContextualTyping.js create mode 100644 tests/baselines/reference/getSetAccessorContextualTyping.errors.txt create mode 100644 tests/baselines/reference/getSetAccessorContextualTyping.js create mode 100644 tests/cases/conformance/expressions/contextualTyping/argumentExpressionContextualTyping.ts create mode 100644 tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts create mode 100644 tests/cases/conformance/expressions/contextualTyping/getSetAccessorContextualTyping.ts diff --git a/tests/baselines/reference/argumentExpressionContextualTyping.errors.txt b/tests/baselines/reference/argumentExpressionContextualTyping.errors.txt new file mode 100644 index 0000000000000..2a2b5b2ee6f43 --- /dev/null +++ b/tests/baselines/reference/argumentExpressionContextualTyping.errors.txt @@ -0,0 +1,36 @@ +tests/cases/conformance/expressions/contextualTyping/argumentExpressionContextualTyping.ts(7,5): error TS2345: Argument of type '{ x: (string | number)[]; y: { c: boolean; d: string; e: number; }; }' is not assignable to parameter of type '{ x: [any, any]; y: { c: any; d: any; e: any; }; }'. + Types of property 'x' are incompatible. + Type '(string | number)[]' is not assignable to type '[any, any]'. + Property '0' is missing in type '(string | number)[]'. +tests/cases/conformance/expressions/contextualTyping/argumentExpressionContextualTyping.ts(13,5): error TS2345: Argument of type '(string | number | boolean)[]' is not assignable to parameter of type '[string, number, boolean]'. + Property '0' is missing in type '(string | number | boolean)[]'. +tests/cases/conformance/expressions/contextualTyping/argumentExpressionContextualTyping.ts(16,5): error TS2345: Argument of type '(string | number | boolean)[]' is not assignable to parameter of type '[string, number, boolean]'. + + +==== tests/cases/conformance/expressions/contextualTyping/argumentExpressionContextualTyping.ts (3 errors) ==== + function foo({x: [a, b], y: {c, d, e}}) { } + function bar({x: [a, b = 10], y: {c, d, e = { f:1 }}}) { } + function baz(x: [string, number, boolean]) { } + + var o = { x: ["string", 1], y: { c: true, d: "world", e: 3 } }; + var o1: { x: [string, number], y: { c: boolean, d: string, e: number } } = { x: ["string", 1], y: { c: true, d: "world", e: 3 } }; + foo(o); // error because ["string", 1] has an array type + ~ +!!! error TS2345: Argument of type '{ x: (string | number)[]; y: { c: boolean; d: string; e: number; }; }' is not assignable to parameter of type '{ x: [any, any]; y: { c: any; d: any; e: any; }; }'. +!!! error TS2345: Types of property 'x' are incompatible. +!!! error TS2345: Type '(string | number)[]' is not assignable to type '[any, any]'. +!!! error TS2345: Property '0' is missing in type '(string | number)[]'. + foo(o1); // not error since contextual type of tuple is applied to ["string", 1] + foo({ x: ["string", 1], y: { c: true, d: "world", e: 3 } }); // not error + + var array = ["string", 1, true]; + var tuple: [string, number, boolean] = ["string", 1, true]; + baz(array); // error + ~~~~~ +!!! error TS2345: Argument of type '(string | number | boolean)[]' is not assignable to parameter of type '[string, number, boolean]'. +!!! error TS2345: Property '0' is missing in type '(string | number | boolean)[]'. + baz(tuple); + baz(["string", 1, true]); + baz(["string", 1, true, ...array]); // error + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2345: Argument of type '(string | number | boolean)[]' is not assignable to parameter of type '[string, number, boolean]'. \ No newline at end of file diff --git a/tests/baselines/reference/argumentExpressionContextualTyping.js b/tests/baselines/reference/argumentExpressionContextualTyping.js new file mode 100644 index 0000000000000..b8c69f2fef72b --- /dev/null +++ b/tests/baselines/reference/argumentExpressionContextualTyping.js @@ -0,0 +1,37 @@ +//// [argumentExpressionContextualTyping.ts] +function foo({x: [a, b], y: {c, d, e}}) { } +function bar({x: [a, b = 10], y: {c, d, e = { f:1 }}}) { } +function baz(x: [string, number, boolean]) { } + +var o = { x: ["string", 1], y: { c: true, d: "world", e: 3 } }; +var o1: { x: [string, number], y: { c: boolean, d: string, e: number } } = { x: ["string", 1], y: { c: true, d: "world", e: 3 } }; +foo(o); // error because ["string", 1] has an array type +foo(o1); // not error since contextual type of tuple is applied to ["string", 1] +foo({ x: ["string", 1], y: { c: true, d: "world", e: 3 } }); // not error + +var array = ["string", 1, true]; +var tuple: [string, number, boolean] = ["string", 1, true]; +baz(array); // error +baz(tuple); +baz(["string", 1, true]); +baz(["string", 1, true, ...array]); // error + +//// [argumentExpressionContextualTyping.js] +function foo(_a) { + var _b = _a.x, a = _b[0], b = _b[1], _c = _a.y, c = _c.c, d = _c.d, e = _c.e; +} +function bar(_a) { + var _b = _a.x, a = _b[0], _c = _b[1], b = _c === void 0 ? 10 : _c, _d = _a.y, c = _d.c, d = _d.d, _e = _d.e, e = _e === void 0 ? { f: 1 } : _e; +} +function baz(x) { } +var o = { x: ["string", 1], y: { c: true, d: "world", e: 3 } }; +var o1 = { x: ["string", 1], y: { c: true, d: "world", e: 3 } }; +foo(o); // error because ["string", 1] has an array type +foo(o1); // not error since contextual type of tuple is applied to ["string", 1] +foo({ x: ["string", 1], y: { c: true, d: "world", e: 3 } }); // not error +var array = ["string", 1, true]; +var tuple = ["string", 1, true]; +baz(array); // error +baz(tuple); +baz(["string", 1, true]); +baz(["string", 1, true].concat(array)); // error diff --git a/tests/baselines/reference/arrayLiteralExpressionContextualTyping.errors.txt b/tests/baselines/reference/arrayLiteralExpressionContextualTyping.errors.txt new file mode 100644 index 0000000000000..65433a8019da5 --- /dev/null +++ b/tests/baselines/reference/arrayLiteralExpressionContextualTyping.errors.txt @@ -0,0 +1,29 @@ +tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts(4,5): error TS2322: Type '[number, number, number, string]' is not assignable to type '[number, number, number]'. + Types of property 'pop' are incompatible. + Type '() => string | number' is not assignable to type '() => number'. + Type 'string | number' is not assignable to type 'number'. + Type 'string' is not assignable to type 'number'. +tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts(9,5): error TS2322: Type 'number[]' is not assignable to type '[number, number, number]'. + Property '0' is missing in type 'number[]'. + + +==== tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts (2 errors) ==== + var array = [1, 2, 3]; + var array1 = [true, 2, 3]; // Contextual type by the numeric index type of the contextual type + var tup: [number, number, number] = [1, 2, 3, 4]; + var tup1: [number, number, number] = [1, 2, 3, "string"]; // error + ~~~~ +!!! error TS2322: Type '[number, number, number, string]' is not assignable to type '[number, number, number]'. +!!! error TS2322: Types of property 'pop' are incompatible. +!!! error TS2322: Type '() => string | number' is not assignable to type '() => number'. +!!! error TS2322: Type 'string | number' is not assignable to type 'number'. +!!! error TS2322: Type 'string' is not assignable to type 'number'. + var tup2: [number|string, number|string, number|string] = [1, 2, 3, "string"]; + + var spr = [1, 2, 3, ...array]; + var spr1 = [1, 2, 3, ...tup]; + var spr2:[number, number, number] = [1, 2, 3, ...tup]; // error + ~~~~ +!!! error TS2322: Type 'number[]' is not assignable to type '[number, number, number]'. +!!! error TS2322: Property '0' is missing in type 'number[]'. + \ No newline at end of file diff --git a/tests/baselines/reference/arrayLiteralExpressionContextualTyping.js b/tests/baselines/reference/arrayLiteralExpressionContextualTyping.js new file mode 100644 index 0000000000000..7381a9c33cc8f --- /dev/null +++ b/tests/baselines/reference/arrayLiteralExpressionContextualTyping.js @@ -0,0 +1,21 @@ +//// [arrayLiteralExpressionContextualTyping.ts] +var array = [1, 2, 3]; +var array1 = [true, 2, 3]; // Contextual type by the numeric index type of the contextual type +var tup: [number, number, number] = [1, 2, 3, 4]; +var tup1: [number, number, number] = [1, 2, 3, "string"]; // error +var tup2: [number|string, number|string, number|string] = [1, 2, 3, "string"]; + +var spr = [1, 2, 3, ...array]; +var spr1 = [1, 2, 3, ...tup]; +var spr2:[number, number, number] = [1, 2, 3, ...tup]; // error + + +//// [arrayLiteralExpressionContextualTyping.js] +var array = [1, 2, 3]; +var array1 = [true, 2, 3]; // Contextual type by the numeric index type of the contextual type +var tup = [1, 2, 3, 4]; +var tup1 = [1, 2, 3, "string"]; // error +var tup2 = [1, 2, 3, "string"]; +var spr = [1, 2, 3].concat(array); +var spr1 = [1, 2, 3].concat(tup); +var spr2 = [1, 2, 3].concat(tup); // error diff --git a/tests/baselines/reference/getSetAccessorContextualTyping.errors.txt b/tests/baselines/reference/getSetAccessorContextualTyping.errors.txt new file mode 100644 index 0000000000000..470a36467bbfe --- /dev/null +++ b/tests/baselines/reference/getSetAccessorContextualTyping.errors.txt @@ -0,0 +1,40 @@ +tests/cases/conformance/expressions/contextualTyping/getSetAccessorContextualTyping.ts(2,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/expressions/contextualTyping/getSetAccessorContextualTyping.ts(3,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/expressions/contextualTyping/getSetAccessorContextualTyping.ts(4,16): error TS2322: Type 'string' is not assignable to type 'number'. +tests/cases/conformance/expressions/contextualTyping/getSetAccessorContextualTyping.ts(7,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/expressions/contextualTyping/getSetAccessorContextualTyping.ts(8,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/expressions/contextualTyping/getSetAccessorContextualTyping.ts(12,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. +tests/cases/conformance/expressions/contextualTyping/getSetAccessorContextualTyping.ts(13,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + + +==== tests/cases/conformance/expressions/contextualTyping/getSetAccessorContextualTyping.ts (7 errors) ==== + class C { + set X(x: number) { } + ~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + get X() { + ~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + return "string"; // Error; get contextual type by set accessor parameter type annotation + ~~~~~~~~ +!!! error TS2322: Type 'string' is not assignable to type 'number'. + } + + set Y(y) { } + ~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + get Y() { + ~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + return true; + } + + set W(w) { } + ~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + get W(): boolean { + ~ +!!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. + return true; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/getSetAccessorContextualTyping.js b/tests/baselines/reference/getSetAccessorContextualTyping.js new file mode 100644 index 0000000000000..ada5d9cc4a824 --- /dev/null +++ b/tests/baselines/reference/getSetAccessorContextualTyping.js @@ -0,0 +1,48 @@ +//// [getSetAccessorContextualTyping.ts] +class C { + set X(x: number) { } + get X() { + return "string"; // Error; get contextual type by set accessor parameter type annotation + } + + set Y(y) { } + get Y() { + return true; + } + + set W(w) { } + get W(): boolean { + return true; + } +} + +//// [getSetAccessorContextualTyping.js] +var C = (function () { + function C() { + } + Object.defineProperty(C.prototype, "X", { + get: function () { + return "string"; // Error; get contextual type by set accessor parameter type annotation + }, + set: function (x) { }, + enumerable: true, + configurable: true + }); + Object.defineProperty(C.prototype, "Y", { + get: function () { + return true; + }, + set: function (y) { }, + enumerable: true, + configurable: true + }); + Object.defineProperty(C.prototype, "W", { + get: function () { + return true; + }, + set: function (w) { }, + enumerable: true, + configurable: true + }); + return C; +})(); diff --git a/tests/cases/conformance/expressions/contextualTyping/argumentExpressionContextualTyping.ts b/tests/cases/conformance/expressions/contextualTyping/argumentExpressionContextualTyping.ts new file mode 100644 index 0000000000000..c6bcb8ce7a7c7 --- /dev/null +++ b/tests/cases/conformance/expressions/contextualTyping/argumentExpressionContextualTyping.ts @@ -0,0 +1,16 @@ +function foo({x: [a, b], y: {c, d, e}}) { } +function bar({x: [a, b = 10], y: {c, d, e = { f:1 }}}) { } +function baz(x: [string, number, boolean]) { } + +var o = { x: ["string", 1], y: { c: true, d: "world", e: 3 } }; +var o1: { x: [string, number], y: { c: boolean, d: string, e: number } } = { x: ["string", 1], y: { c: true, d: "world", e: 3 } }; +foo(o); // error because ["string", 1] has an array type +foo(o1); // not error since contextual type of tuple is applied to ["string", 1] +foo({ x: ["string", 1], y: { c: true, d: "world", e: 3 } }); // not error + +var array = ["string", 1, true]; +var tuple: [string, number, boolean] = ["string", 1, true]; +baz(array); // error +baz(tuple); +baz(["string", 1, true]); +baz(["string", 1, true, ...array]); // error \ No newline at end of file diff --git a/tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts b/tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts new file mode 100644 index 0000000000000..27857f3bbb8fe --- /dev/null +++ b/tests/cases/conformance/expressions/contextualTyping/arrayLiteralExpressionContextualTyping.ts @@ -0,0 +1,9 @@ +var array = [1, 2, 3]; +var array1 = [true, 2, 3]; // Contextual type by the numeric index type of the contextual type +var tup: [number, number, number] = [1, 2, 3, 4]; +var tup1: [number, number, number] = [1, 2, 3, "string"]; // error +var tup2: [number|string, number|string, number|string] = [1, 2, 3, "string"]; + +var spr = [1, 2, 3, ...array]; +var spr1 = [1, 2, 3, ...tup]; +var spr2:[number, number, number] = [1, 2, 3, ...tup]; // error diff --git a/tests/cases/conformance/expressions/contextualTyping/getSetAccessorContextualTyping.ts b/tests/cases/conformance/expressions/contextualTyping/getSetAccessorContextualTyping.ts new file mode 100644 index 0000000000000..dba8a11eccc6e --- /dev/null +++ b/tests/cases/conformance/expressions/contextualTyping/getSetAccessorContextualTyping.ts @@ -0,0 +1,16 @@ +class C { + set X(x: number) { } + get X() { + return "string"; // Error; get contextual type by set accessor parameter type annotation + } + + set Y(y) { } + get Y() { + return true; + } + + set W(w) { } + get W(): boolean { + return true; + } +} \ No newline at end of file