Skip to content

Commit 57f3e04

Browse files
Merge pull request #3306 from Microsoft/deconstructingArguments
Give 'arguments' an iterator
2 parents 1ecb896 + 4df3d27 commit 57f3e04

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+588
-194
lines changed

src/lib/es6.d.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,11 @@ interface Array<T> {
316316
copyWithin(target: number, start: number, end?: number): T[];
317317
}
318318

319+
interface IArguments {
320+
/** Iterator */
321+
[Symbol.iterator](): IterableIterator<any>;
322+
}
323+
319324
interface ArrayConstructor {
320325
/**
321326
* Creates an array from an array-like object.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
tests/cases/compiler/argumentsObjectIterator01_ES5.ts(4,21): error TS2495: Type 'IArguments' is not an array type or a string type.
2+
3+
4+
==== tests/cases/compiler/argumentsObjectIterator01_ES5.ts (1 errors) ====
5+
6+
function doubleAndReturnAsArray(x: number, y: number, z: number): [number, number, number] {
7+
let result = [];
8+
for (let arg of arguments) {
9+
~~~~~~~~~
10+
!!! error TS2495: Type 'IArguments' is not an array type or a string type.
11+
result.push(arg + arg);
12+
}
13+
return <[any, any, any]>result;
14+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//// [argumentsObjectIterator01_ES5.ts]
2+
3+
function doubleAndReturnAsArray(x: number, y: number, z: number): [number, number, number] {
4+
let result = [];
5+
for (let arg of arguments) {
6+
result.push(arg + arg);
7+
}
8+
return <[any, any, any]>result;
9+
}
10+
11+
//// [argumentsObjectIterator01_ES5.js]
12+
function doubleAndReturnAsArray(x, y, z) {
13+
var result = [];
14+
for (var _i = 0; _i < arguments.length; _i++) {
15+
var arg = arguments[_i];
16+
result.push(arg + arg);
17+
}
18+
return result;
19+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
//// [argumentsObjectIterator01_ES6.ts]
2+
3+
function doubleAndReturnAsArray(x: number, y: number, z: number): [number, number, number] {
4+
let result = [];
5+
for (let arg of arguments) {
6+
result.push(arg + arg);
7+
}
8+
return <[any, any, any]>result;
9+
}
10+
11+
//// [argumentsObjectIterator01_ES6.js]
12+
function doubleAndReturnAsArray(x, y, z) {
13+
let result = [];
14+
for (let arg of arguments) {
15+
result.push(arg + arg);
16+
}
17+
return result;
18+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
=== tests/cases/compiler/argumentsObjectIterator01_ES6.ts ===
2+
3+
function doubleAndReturnAsArray(x: number, y: number, z: number): [number, number, number] {
4+
>doubleAndReturnAsArray : Symbol(doubleAndReturnAsArray, Decl(argumentsObjectIterator01_ES6.ts, 0, 0))
5+
>x : Symbol(x, Decl(argumentsObjectIterator01_ES6.ts, 1, 32))
6+
>y : Symbol(y, Decl(argumentsObjectIterator01_ES6.ts, 1, 42))
7+
>z : Symbol(z, Decl(argumentsObjectIterator01_ES6.ts, 1, 53))
8+
9+
let result = [];
10+
>result : Symbol(result, Decl(argumentsObjectIterator01_ES6.ts, 2, 7))
11+
12+
for (let arg of arguments) {
13+
>arg : Symbol(arg, Decl(argumentsObjectIterator01_ES6.ts, 3, 12))
14+
>arguments : Symbol(arguments)
15+
16+
result.push(arg + arg);
17+
>result.push : Symbol(Array.push, Decl(lib.d.ts, 1016, 29))
18+
>result : Symbol(result, Decl(argumentsObjectIterator01_ES6.ts, 2, 7))
19+
>push : Symbol(Array.push, Decl(lib.d.ts, 1016, 29))
20+
>arg : Symbol(arg, Decl(argumentsObjectIterator01_ES6.ts, 3, 12))
21+
>arg : Symbol(arg, Decl(argumentsObjectIterator01_ES6.ts, 3, 12))
22+
}
23+
return <[any, any, any]>result;
24+
>result : Symbol(result, Decl(argumentsObjectIterator01_ES6.ts, 2, 7))
25+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
=== tests/cases/compiler/argumentsObjectIterator01_ES6.ts ===
2+
3+
function doubleAndReturnAsArray(x: number, y: number, z: number): [number, number, number] {
4+
>doubleAndReturnAsArray : (x: number, y: number, z: number) => [number, number, number]
5+
>x : number
6+
>y : number
7+
>z : number
8+
9+
let result = [];
10+
>result : any[]
11+
>[] : undefined[]
12+
13+
for (let arg of arguments) {
14+
>arg : any
15+
>arguments : IArguments
16+
17+
result.push(arg + arg);
18+
>result.push(arg + arg) : number
19+
>result.push : (...items: any[]) => number
20+
>result : any[]
21+
>push : (...items: any[]) => number
22+
>arg + arg : any
23+
>arg : any
24+
>arg : any
25+
}
26+
return <[any, any, any]>result;
27+
><[any, any, any]>result : [any, any, any]
28+
>result : any[]
29+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
tests/cases/compiler/argumentsObjectIterator02_ES5.ts(3,26): error TS2304: Cannot find name 'Symbol'.
2+
3+
4+
==== tests/cases/compiler/argumentsObjectIterator02_ES5.ts (1 errors) ====
5+
6+
function doubleAndReturnAsArray(x: number, y: number, z: number): [number, number, number] {
7+
let blah = arguments[Symbol.iterator];
8+
~~~~~~
9+
!!! error TS2304: Cannot find name 'Symbol'.
10+
11+
let result = [];
12+
for (let arg of blah()) {
13+
result.push(arg + arg);
14+
}
15+
return <[any, any, any]>result;
16+
}
17+
18+
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
//// [argumentsObjectIterator02_ES5.ts]
2+
3+
function doubleAndReturnAsArray(x: number, y: number, z: number): [number, number, number] {
4+
let blah = arguments[Symbol.iterator];
5+
6+
let result = [];
7+
for (let arg of blah()) {
8+
result.push(arg + arg);
9+
}
10+
return <[any, any, any]>result;
11+
}
12+
13+
14+
15+
//// [argumentsObjectIterator02_ES5.js]
16+
function doubleAndReturnAsArray(x, y, z) {
17+
var blah = arguments[Symbol.iterator];
18+
var result = [];
19+
for (var _i = 0, _a = blah(); _i < _a.length; _i++) {
20+
var arg = _a[_i];
21+
result.push(arg + arg);
22+
}
23+
return result;
24+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
//// [argumentsObjectIterator02_ES6.ts]
2+
3+
function doubleAndReturnAsArray(x: number, y: number, z: number): [number, number, number] {
4+
let blah = arguments[Symbol.iterator];
5+
6+
let result = [];
7+
for (let arg of blah()) {
8+
result.push(arg + arg);
9+
}
10+
return <[any, any, any]>result;
11+
}
12+
13+
14+
15+
//// [argumentsObjectIterator02_ES6.js]
16+
function doubleAndReturnAsArray(x, y, z) {
17+
let blah = arguments[Symbol.iterator];
18+
let result = [];
19+
for (let arg of blah()) {
20+
result.push(arg + arg);
21+
}
22+
return result;
23+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
=== tests/cases/compiler/argumentsObjectIterator02_ES6.ts ===
2+
3+
function doubleAndReturnAsArray(x: number, y: number, z: number): [number, number, number] {
4+
>doubleAndReturnAsArray : Symbol(doubleAndReturnAsArray, Decl(argumentsObjectIterator02_ES6.ts, 0, 0))
5+
>x : Symbol(x, Decl(argumentsObjectIterator02_ES6.ts, 1, 32))
6+
>y : Symbol(y, Decl(argumentsObjectIterator02_ES6.ts, 1, 42))
7+
>z : Symbol(z, Decl(argumentsObjectIterator02_ES6.ts, 1, 53))
8+
9+
let blah = arguments[Symbol.iterator];
10+
>blah : Symbol(blah, Decl(argumentsObjectIterator02_ES6.ts, 2, 7))
11+
>arguments : Symbol(arguments)
12+
>Symbol.iterator : Symbol(SymbolConstructor.iterator, Decl(lib.d.ts, 1236, 31))
13+
>Symbol : Symbol(Symbol, Decl(lib.d.ts, 1186, 52), Decl(lib.d.ts, 1292, 11))
14+
>iterator : Symbol(SymbolConstructor.iterator, Decl(lib.d.ts, 1236, 31))
15+
16+
let result = [];
17+
>result : Symbol(result, Decl(argumentsObjectIterator02_ES6.ts, 4, 7))
18+
19+
for (let arg of blah()) {
20+
>arg : Symbol(arg, Decl(argumentsObjectIterator02_ES6.ts, 5, 12))
21+
>blah : Symbol(blah, Decl(argumentsObjectIterator02_ES6.ts, 2, 7))
22+
23+
result.push(arg + arg);
24+
>result.push : Symbol(Array.push, Decl(lib.d.ts, 1016, 29))
25+
>result : Symbol(result, Decl(argumentsObjectIterator02_ES6.ts, 4, 7))
26+
>push : Symbol(Array.push, Decl(lib.d.ts, 1016, 29))
27+
>arg : Symbol(arg, Decl(argumentsObjectIterator02_ES6.ts, 5, 12))
28+
>arg : Symbol(arg, Decl(argumentsObjectIterator02_ES6.ts, 5, 12))
29+
}
30+
return <[any, any, any]>result;
31+
>result : Symbol(result, Decl(argumentsObjectIterator02_ES6.ts, 4, 7))
32+
}
33+
34+
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
=== tests/cases/compiler/argumentsObjectIterator02_ES6.ts ===
2+
3+
function doubleAndReturnAsArray(x: number, y: number, z: number): [number, number, number] {
4+
>doubleAndReturnAsArray : (x: number, y: number, z: number) => [number, number, number]
5+
>x : number
6+
>y : number
7+
>z : number
8+
9+
let blah = arguments[Symbol.iterator];
10+
>blah : () => IterableIterator<any>
11+
>arguments[Symbol.iterator] : () => IterableIterator<any>
12+
>arguments : IArguments
13+
>Symbol.iterator : symbol
14+
>Symbol : SymbolConstructor
15+
>iterator : symbol
16+
17+
let result = [];
18+
>result : any[]
19+
>[] : undefined[]
20+
21+
for (let arg of blah()) {
22+
>arg : any
23+
>blah() : IterableIterator<any>
24+
>blah : () => IterableIterator<any>
25+
26+
result.push(arg + arg);
27+
>result.push(arg + arg) : number
28+
>result.push : (...items: any[]) => number
29+
>result : any[]
30+
>push : (...items: any[]) => number
31+
>arg + arg : any
32+
>arg : any
33+
>arg : any
34+
}
35+
return <[any, any, any]>result;
36+
><[any, any, any]>result : [any, any, any]
37+
>result : any[]
38+
}
39+
40+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
tests/cases/compiler/argumentsObjectIterator03_ES5.ts(3,9): error TS2461: Type 'IArguments' is not an array type.
2+
3+
4+
==== tests/cases/compiler/argumentsObjectIterator03_ES5.ts (1 errors) ====
5+
6+
function asReversedTuple(a: number, b: string, c: boolean): [boolean, string, number] {
7+
let [x, y, z] = arguments;
8+
~~~~~~~~~
9+
!!! error TS2461: Type 'IArguments' is not an array type.
10+
11+
return [z, y, x];
12+
}
13+
14+
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [argumentsObjectIterator03_ES5.ts]
2+
3+
function asReversedTuple(a: number, b: string, c: boolean): [boolean, string, number] {
4+
let [x, y, z] = arguments;
5+
6+
return [z, y, x];
7+
}
8+
9+
10+
11+
//// [argumentsObjectIterator03_ES5.js]
12+
function asReversedTuple(a, b, c) {
13+
var x = arguments[0], y = arguments[1], z = arguments[2];
14+
return [z, y, x];
15+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
//// [argumentsObjectIterator03_ES6.ts]
2+
3+
function asReversedTuple(a: number, b: string, c: boolean): [boolean, string, number] {
4+
let [x, y, z] = arguments;
5+
6+
return [z, y, x];
7+
}
8+
9+
10+
11+
//// [argumentsObjectIterator03_ES6.js]
12+
function asReversedTuple(a, b, c) {
13+
let [x, y, z] = arguments;
14+
return [z, y, x];
15+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
=== tests/cases/compiler/argumentsObjectIterator03_ES6.ts ===
2+
3+
function asReversedTuple(a: number, b: string, c: boolean): [boolean, string, number] {
4+
>asReversedTuple : Symbol(asReversedTuple, Decl(argumentsObjectIterator03_ES6.ts, 0, 0))
5+
>a : Symbol(a, Decl(argumentsObjectIterator03_ES6.ts, 1, 25))
6+
>b : Symbol(b, Decl(argumentsObjectIterator03_ES6.ts, 1, 35))
7+
>c : Symbol(c, Decl(argumentsObjectIterator03_ES6.ts, 1, 46))
8+
9+
let [x, y, z] = arguments;
10+
>x : Symbol(x, Decl(argumentsObjectIterator03_ES6.ts, 2, 9))
11+
>y : Symbol(y, Decl(argumentsObjectIterator03_ES6.ts, 2, 11))
12+
>z : Symbol(z, Decl(argumentsObjectIterator03_ES6.ts, 2, 14))
13+
>arguments : Symbol(arguments)
14+
15+
return [z, y, x];
16+
>z : Symbol(z, Decl(argumentsObjectIterator03_ES6.ts, 2, 14))
17+
>y : Symbol(y, Decl(argumentsObjectIterator03_ES6.ts, 2, 11))
18+
>x : Symbol(x, Decl(argumentsObjectIterator03_ES6.ts, 2, 9))
19+
}
20+
21+
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
=== tests/cases/compiler/argumentsObjectIterator03_ES6.ts ===
2+
3+
function asReversedTuple(a: number, b: string, c: boolean): [boolean, string, number] {
4+
>asReversedTuple : (a: number, b: string, c: boolean) => [boolean, string, number]
5+
>a : number
6+
>b : string
7+
>c : boolean
8+
9+
let [x, y, z] = arguments;
10+
>x : any
11+
>y : any
12+
>z : any
13+
>arguments : IArguments
14+
15+
return [z, y, x];
16+
>[z, y, x] : [any, any, any]
17+
>z : any
18+
>y : any
19+
>x : any
20+
}
21+
22+

tests/baselines/reference/arrayLiterals2ES6.symbols

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ interface myArray2 extends Array<Number|String> { }
7979
>myArray2 : Symbol(myArray2, Decl(arrayLiterals2ES6.ts, 42, 43))
8080
>Array : Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11), Decl(lib.d.ts, 1439, 1))
8181
>Number : Symbol(Number, Decl(lib.d.ts, 456, 40), Decl(lib.d.ts, 518, 11))
82-
>String : Symbol(String, Decl(lib.d.ts, 275, 1), Decl(lib.d.ts, 443, 11), Decl(lib.d.ts, 1538, 1))
82+
>String : Symbol(String, Decl(lib.d.ts, 275, 1), Decl(lib.d.ts, 443, 11), Decl(lib.d.ts, 1543, 1))
8383

8484
var d0 = [1, true, ...temp, ]; // has type (string|number|boolean)[]
8585
>d0 : Symbol(d0, Decl(arrayLiterals2ES6.ts, 44, 3))

tests/baselines/reference/destructuringParameterDeclaration3ES5.symbols

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,17 @@
99
type arrayString = Array<String>
1010
>arrayString : Symbol(arrayString, Decl(destructuringParameterDeclaration3ES5.ts, 0, 0))
1111
>Array : Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11), Decl(lib.d.ts, 1439, 1))
12-
>String : Symbol(String, Decl(lib.d.ts, 275, 1), Decl(lib.d.ts, 443, 11), Decl(lib.d.ts, 1538, 1))
12+
>String : Symbol(String, Decl(lib.d.ts, 275, 1), Decl(lib.d.ts, 443, 11), Decl(lib.d.ts, 1543, 1))
1313

1414
type someArray = Array<String> | number[];
1515
>someArray : Symbol(someArray, Decl(destructuringParameterDeclaration3ES5.ts, 7, 32))
1616
>Array : Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11), Decl(lib.d.ts, 1439, 1))
17-
>String : Symbol(String, Decl(lib.d.ts, 275, 1), Decl(lib.d.ts, 443, 11), Decl(lib.d.ts, 1538, 1))
17+
>String : Symbol(String, Decl(lib.d.ts, 275, 1), Decl(lib.d.ts, 443, 11), Decl(lib.d.ts, 1543, 1))
1818

1919
type stringOrNumArray = Array<String|Number>;
2020
>stringOrNumArray : Symbol(stringOrNumArray, Decl(destructuringParameterDeclaration3ES5.ts, 8, 42))
2121
>Array : Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11), Decl(lib.d.ts, 1439, 1))
22-
>String : Symbol(String, Decl(lib.d.ts, 275, 1), Decl(lib.d.ts, 443, 11), Decl(lib.d.ts, 1538, 1))
22+
>String : Symbol(String, Decl(lib.d.ts, 275, 1), Decl(lib.d.ts, 443, 11), Decl(lib.d.ts, 1543, 1))
2323
>Number : Symbol(Number, Decl(lib.d.ts, 456, 40), Decl(lib.d.ts, 518, 11))
2424

2525
function a1(...x: (number|string)[]) { }
@@ -34,7 +34,7 @@ function a3(...a: Array<String>) { }
3434
>a3 : Symbol(a3, Decl(destructuringParameterDeclaration3ES5.ts, 12, 21))
3535
>a : Symbol(a, Decl(destructuringParameterDeclaration3ES5.ts, 13, 12))
3636
>Array : Symbol(Array, Decl(lib.d.ts, 1000, 23), Decl(lib.d.ts, 1171, 11), Decl(lib.d.ts, 1439, 1))
37-
>String : Symbol(String, Decl(lib.d.ts, 275, 1), Decl(lib.d.ts, 443, 11), Decl(lib.d.ts, 1538, 1))
37+
>String : Symbol(String, Decl(lib.d.ts, 275, 1), Decl(lib.d.ts, 443, 11), Decl(lib.d.ts, 1543, 1))
3838

3939
function a4(...a: arrayString) { }
4040
>a4 : Symbol(a4, Decl(destructuringParameterDeclaration3ES5.ts, 13, 36))

0 commit comments

Comments
 (0)