Support indexing with known symbols

This commit is contained in:
Jason Freeman
2015-02-05 17:18:32 -08:00
parent df826de042
commit d07ed679a0
26 changed files with 495 additions and 14 deletions

View File

@@ -0,0 +1,27 @@
=== tests/cases/conformance/es6/Symbols/symbolProperty17.ts ===
interface I {
>I : I
[Symbol.iterator]: number;
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
[s: symbol]: string;
>s : symbol
"__@iterator": string;
}
var i: I;
>i : I
>I : I
var it = i[Symbol.iterator];
>it : number
>i[Symbol.iterator] : number
>i : I
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol

View File

@@ -0,0 +1,47 @@
=== tests/cases/conformance/es6/Symbols/symbolProperty18.ts ===
var i = {
>i : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; }
>{ [Symbol.iterator]: 0, [Symbol.toStringTag]() { return "" }, set [Symbol.toPrimitive](p: boolean) { }} : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; }
[Symbol.iterator]: 0,
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
[Symbol.toStringTag]() { return "" },
>Symbol.toStringTag : symbol
>Symbol : SymbolConstructor
>toStringTag : symbol
set [Symbol.toPrimitive](p: boolean) { }
>Symbol.toPrimitive : symbol
>Symbol : SymbolConstructor
>toPrimitive : symbol
>p : boolean
}
var it = i[Symbol.iterator];
>it : number
>i[Symbol.iterator] : number
>i : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; }
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
var str = i[Symbol.toStringTag]();
>str : string
>i[Symbol.toStringTag]() : string
>i[Symbol.toStringTag] : () => string
>i : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; }
>Symbol.toStringTag : symbol
>Symbol : SymbolConstructor
>toStringTag : symbol
i[Symbol.toPrimitive] = false;
>i[Symbol.toPrimitive] = false : boolean
>i[Symbol.toPrimitive] : boolean
>i : { [Symbol.iterator]: number; [Symbol.toStringTag](): string; [Symbol.toPrimitive]: boolean; }
>Symbol.toPrimitive : symbol
>Symbol : SymbolConstructor
>toPrimitive : symbol

View File

@@ -0,0 +1,38 @@
=== tests/cases/conformance/es6/Symbols/symbolProperty19.ts ===
var i = {
>i : { [Symbol.iterator]: { p: any; }; [Symbol.toStringTag](): { p: any; }; }
>{ [Symbol.iterator]: { p: null }, [Symbol.toStringTag]() { return { p: undefined }; }} : { [Symbol.iterator]: { p: null; }; [Symbol.toStringTag](): { p: any; }; }
[Symbol.iterator]: { p: null },
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
>{ p: null } : { p: null; }
>p : null
[Symbol.toStringTag]() { return { p: undefined }; }
>Symbol.toStringTag : symbol
>Symbol : SymbolConstructor
>toStringTag : symbol
>{ p: undefined } : { p: undefined; }
>p : undefined
>undefined : undefined
}
var it = i[Symbol.iterator];
>it : { p: any; }
>i[Symbol.iterator] : { p: any; }
>i : { [Symbol.iterator]: { p: any; }; [Symbol.toStringTag](): { p: any; }; }
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
var str = i[Symbol.toStringTag]();
>str : { p: any; }
>i[Symbol.toStringTag]() : { p: any; }
>i[Symbol.toStringTag] : () => { p: any; }
>i : { [Symbol.iterator]: { p: any; }; [Symbol.toStringTag](): { p: any; }; }
>Symbol.toStringTag : symbol
>Symbol : SymbolConstructor
>toStringTag : symbol

View File

@@ -0,0 +1,34 @@
=== tests/cases/conformance/es6/Symbols/symbolProperty28.ts ===
class C1 {
>C1 : C1
[Symbol.toStringTag]() {
>Symbol.toStringTag : symbol
>Symbol : SymbolConstructor
>toStringTag : symbol
return { x: "" };
>{ x: "" } : { x: string; }
>x : string
}
}
class C2 extends C1 { }
>C2 : C2
>C1 : C1
var c: C2;
>c : C2
>C2 : C2
var obj = c[Symbol.toStringTag]().x;
>obj : string
>c[Symbol.toStringTag]().x : string
>c[Symbol.toStringTag]() : { x: string; }
>c[Symbol.toStringTag] : () => { x: string; }
>c : C2
>Symbol.toStringTag : symbol
>Symbol : SymbolConstructor
>toStringTag : symbol
>x : string

View File

@@ -0,0 +1,48 @@
=== tests/cases/conformance/es6/Symbols/symbolProperty40.ts ===
class C {
>C : C
[Symbol.iterator](x: string): string;
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
>x : string
[Symbol.iterator](x: number): number;
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
>x : number
[Symbol.iterator](x: any) {
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
>x : any
return undefined;
>undefined : undefined
}
}
var c = new C;
>c : C
>new C : C
>C : typeof C
c[Symbol.iterator]("");
>c[Symbol.iterator]("") : string
>c[Symbol.iterator] : { (x: string): string; (x: number): number; }
>c : C
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
c[Symbol.iterator](0);
>c[Symbol.iterator](0) : number
>c[Symbol.iterator] : { (x: string): string; (x: number): number; }
>c : C
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol

View File

@@ -0,0 +1,51 @@
=== tests/cases/conformance/es6/Symbols/symbolProperty41.ts ===
class C {
>C : C
[Symbol.iterator](x: string): { x: string };
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
>x : string
>x : string
[Symbol.iterator](x: "hello"): { x: string; hello: string };
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
>x : "hello"
>x : string
>hello : string
[Symbol.iterator](x: any) {
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
>x : any
return undefined;
>undefined : undefined
}
}
var c = new C;
>c : C
>new C : C
>C : typeof C
c[Symbol.iterator]("");
>c[Symbol.iterator]("") : { x: string; }
>c[Symbol.iterator] : { (x: string): { x: string; }; (x: "hello"): { x: string; hello: string; }; }
>c : C
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
c[Symbol.iterator]("hello");
>c[Symbol.iterator]("hello") : { x: string; hello: string; }
>c[Symbol.iterator] : { (x: string): { x: string; }; (x: "hello"): { x: string; hello: string; }; }
>c : C
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol

View File

@@ -0,0 +1,17 @@
tests/cases/conformance/es6/Symbols/symbolProperty46.ts(10,1): error TS2322: Type 'number' is not assignable to type 'string'.
==== tests/cases/conformance/es6/Symbols/symbolProperty46.ts (1 errors) ====
class C {
get [Symbol.hasInstance]() {
return "";
}
// Should take a string
set [Symbol.hasInstance](x) {
}
}
(new C)[Symbol.hasInstance] = 0;
~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2322: Type 'number' is not assignable to type 'string'.
(new C)[Symbol.hasInstance] = "";

View File

@@ -1,7 +1,8 @@
tests/cases/conformance/es6/Symbols/symbolProperty47.ts(3,16): error TS2322: Type 'string' is not assignable to type 'number'.
tests/cases/conformance/es6/Symbols/symbolProperty47.ts(11,1): error TS2322: Type 'string' is not assignable to type 'number'.
==== tests/cases/conformance/es6/Symbols/symbolProperty47.ts (1 errors) ====
==== tests/cases/conformance/es6/Symbols/symbolProperty47.ts (2 errors) ====
class C {
get [Symbol.hasInstance]() {
return "";
@@ -14,4 +15,6 @@ tests/cases/conformance/es6/Symbols/symbolProperty47.ts(3,16): error TS2322: Typ
}
(new C)[Symbol.hasInstance] = 0;
(new C)[Symbol.hasInstance] = "";
(new C)[Symbol.hasInstance] = "";
~~~~~~~~~~~~~~~~~~~~~~~~~~~
!!! error TS2322: Type 'string' is not assignable to type 'number'.

View File

@@ -1,9 +1,10 @@
tests/cases/conformance/es6/Symbols/symbolProperty52.ts(2,13): error TS2339: Property 'nonsense' does not exist on type 'SymbolConstructor'.
tests/cases/conformance/es6/Symbols/symbolProperty52.ts(5,1): error TS2322: Type '{}' is not assignable to type '{ [Symbol.nonsense]: number; }'.
Property '[Symbol.nonsense]' is missing in type '{}'.
tests/cases/conformance/es6/Symbols/symbolProperty52.ts(7,12): error TS2339: Property 'nonsense' does not exist on type 'SymbolConstructor'.
==== tests/cases/conformance/es6/Symbols/symbolProperty52.ts (2 errors) ====
==== tests/cases/conformance/es6/Symbols/symbolProperty52.ts (3 errors) ====
var obj = {
[Symbol.nonsense]: 0
~~~~~~~~
@@ -13,4 +14,8 @@ tests/cases/conformance/es6/Symbols/symbolProperty52.ts(5,1): error TS2322: Type
obj = {};
~~~
!!! error TS2322: Type '{}' is not assignable to type '{ [Symbol.nonsense]: number; }'.
!!! error TS2322: Property '[Symbol.nonsense]' is missing in type '{}'.
!!! error TS2322: Property '[Symbol.nonsense]' is missing in type '{}'.
obj[Symbol.nonsense];
~~~~~~~~
!!! error TS2339: Property 'nonsense' does not exist on type 'SymbolConstructor'.

View File

@@ -3,10 +3,13 @@ var obj = {
[Symbol.nonsense]: 0
};
obj = {};
obj = {};
obj[Symbol.nonsense];
//// [symbolProperty52.js]
var obj = {
[Symbol.nonsense]: 0
};
obj = {};
obj[Symbol.nonsense];

View File

@@ -1,9 +1,14 @@
tests/cases/conformance/es6/Symbols/symbolProperty53.ts(2,5): error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'.
tests/cases/conformance/es6/Symbols/symbolProperty53.ts(5,1): error TS2342: An index expression argument must be of type 'string', 'number', or 'any'.
==== tests/cases/conformance/es6/Symbols/symbolProperty53.ts (1 errors) ====
==== tests/cases/conformance/es6/Symbols/symbolProperty53.ts (2 errors) ====
var obj = {
[Symbol.for]: 0
~~~~~~~~~~~~
!!! error TS2464: A computed property name must be of type 'string', 'number', 'symbol', or 'any'.
};
};
obj[Symbol.for];
~~~~~~~~~~~~~~~
!!! error TS2342: An index expression argument must be of type 'string', 'number', or 'any'.

View File

@@ -1,9 +1,12 @@
//// [symbolProperty53.ts]
var obj = {
[Symbol.for]: 0
};
};
obj[Symbol.for];
//// [symbolProperty53.js]
var obj = {
[Symbol.for]: 0
};
obj[Symbol.for];

View File

@@ -0,0 +1,23 @@
//// [symbolProperty55.ts]
var obj = {
[Symbol.iterator]: 0
};
module M {
var Symbol: SymbolConstructor;
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
obj[Symbol.iterator];
}
//// [symbolProperty55.js]
var obj = {
[Symbol.iterator]: 0
};
var M;
(function (M) {
var Symbol;
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
obj[Symbol.iterator];
})(M || (M = {}));

View File

@@ -0,0 +1,28 @@
=== tests/cases/conformance/es6/Symbols/symbolProperty55.ts ===
var obj = {
>obj : { [Symbol.iterator]: number; }
>{ [Symbol.iterator]: 0} : { [Symbol.iterator]: number; }
[Symbol.iterator]: 0
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
};
module M {
>M : typeof M
var Symbol: SymbolConstructor;
>Symbol : SymbolConstructor
>SymbolConstructor : SymbolConstructor
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
obj[Symbol.iterator];
>obj[Symbol.iterator] : any
>obj : { [Symbol.iterator]: number; }
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
}

View File

@@ -0,0 +1,23 @@
//// [symbolProperty56.ts]
var obj = {
[Symbol.iterator]: 0
};
module M {
var Symbol: {};
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
obj[Symbol["iterator"]];
}
//// [symbolProperty56.js]
var obj = {
[Symbol.iterator]: 0
};
var M;
(function (M) {
var Symbol;
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
obj[Symbol["iterator"]];
})(M || (M = {}));

View File

@@ -0,0 +1,26 @@
=== tests/cases/conformance/es6/Symbols/symbolProperty56.ts ===
var obj = {
>obj : { [Symbol.iterator]: number; }
>{ [Symbol.iterator]: 0} : { [Symbol.iterator]: number; }
[Symbol.iterator]: 0
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
};
module M {
>M : typeof M
var Symbol: {};
>Symbol : {}
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
obj[Symbol["iterator"]];
>obj[Symbol["iterator"]] : any
>obj : { [Symbol.iterator]: number; }
>Symbol["iterator"] : any
>Symbol : {}
}

View File

@@ -0,0 +1,14 @@
//// [symbolProperty57.ts]
var obj = {
[Symbol.iterator]: 0
};
// Should give type 'any'.
obj[Symbol["nonsense"]];
//// [symbolProperty57.js]
var obj = {
[Symbol.iterator]: 0
};
// Should give type 'any'.
obj[Symbol["nonsense"]];

View File

@@ -0,0 +1,19 @@
=== tests/cases/conformance/es6/Symbols/symbolProperty57.ts ===
var obj = {
>obj : { [Symbol.iterator]: number; }
>{ [Symbol.iterator]: 0} : { [Symbol.iterator]: number; }
[Symbol.iterator]: 0
>Symbol.iterator : symbol
>Symbol : SymbolConstructor
>iterator : symbol
};
// Should give type 'any'.
obj[Symbol["nonsense"]];
>obj[Symbol["nonsense"]] : any
>obj : { [Symbol.iterator]: number; }
>Symbol["nonsense"] : any
>Symbol : SymbolConstructor

View File

@@ -3,4 +3,6 @@ var obj = {
[Symbol.nonsense]: 0
};
obj = {};
obj = {};
obj[Symbol.nonsense];

View File

@@ -1,4 +1,6 @@
//@target: ES6
var obj = {
[Symbol.for]: 0
};
};
obj[Symbol.for];

View File

@@ -0,0 +1,11 @@
//@target: ES6
var obj = {
[Symbol.iterator]: 0
};
module M {
var Symbol: SymbolConstructor;
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
obj[Symbol.iterator];
}

View File

@@ -0,0 +1,11 @@
//@target: ES6
var obj = {
[Symbol.iterator]: 0
};
module M {
var Symbol: {};
// The following should be of type 'any'. This is because even though obj has a property keyed by Symbol.iterator,
// the key passed in here is the *wrong* Symbol.iterator. It is not the iterator property of the global Symbol.
obj[Symbol["iterator"]];
}

View File

@@ -0,0 +1,7 @@
//@target: ES6
var obj = {
[Symbol.iterator]: 0
};
// Should give type 'any'.
obj[Symbol["nonsense"]];