From 5b46f5f9ae4bf47707b8bb4b676f4299523b808c Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 5 Mar 2015 15:21:00 -0800 Subject: [PATCH 1/8] Remove error for using 'for...of' in ES3/ES5 --- src/compiler/checker.ts | 5 - .../diagnosticInformationMap.generated.ts | 1 - src/compiler/diagnosticMessages.json | 4 - .../baselines/reference/ES5For-of1.errors.txt | 6 +- .../reference/ES5For-of10.errors.txt | 13 - .../reference/ES5For-of11.errors.txt | 8 - .../reference/ES5For-of13.errors.txt | 9 - .../reference/ES5For-of14.errors.txt | 9 - tests/baselines/reference/ES5For-of14.types | 9 + .../reference/ES5For-of15.errors.txt | 12 - tests/baselines/reference/ES5For-of15.types | 17 + .../reference/ES5For-of16.errors.txt | 13 - tests/baselines/reference/ES5For-of16.types | 21 + .../reference/ES5For-of18.errors.txt | 16 - tests/baselines/reference/ES5For-of18.types | 16 + .../reference/ES5For-of19.errors.txt | 15 - tests/baselines/reference/ES5For-of19.types | 21 + .../baselines/reference/ES5For-of2.errors.txt | 9 - tests/baselines/reference/ES5For-of2.types | 9 + .../reference/ES5For-of20.errors.txt | 6 +- .../reference/ES5For-of21.errors.txt | 9 - tests/baselines/reference/ES5For-of21.types | 9 + .../reference/ES5For-of22.errors.txt | 6 +- .../reference/ES5For-of23.errors.txt | 6 +- .../reference/ES5For-of24.errors.txt | 10 - .../reference/ES5For-of25.errors.txt | 11 - .../reference/ES5For-of26.errors.txt | 10 - tests/baselines/reference/ES5For-of26.types | 12 + .../reference/ES5For-of28.errors.txt | 10 - tests/baselines/reference/ES5For-of28.types | 12 + .../baselines/reference/ES5For-of3.errors.txt | 8 - .../baselines/reference/ES5For-of4.errors.txt | 9 - tests/baselines/reference/ES5For-of4.types | 13 + .../baselines/reference/ES5For-of5.errors.txt | 9 - tests/baselines/reference/ES5For-of5.types | 9 + .../baselines/reference/ES5For-of6.errors.txt | 11 - tests/baselines/reference/ES5For-of6.types | 16 + .../baselines/reference/ES5For-of7.errors.txt | 11 +- .../baselines/reference/ES5For-of9.errors.txt | 14 - .../reference/downlevelLetConst16.errors.txt | 248 ------- .../reference/downlevelLetConst16.types | 686 ++++++++++++++++++ .../reference/downlevelLetConst17.errors.txt | 73 -- .../reference/downlevelLetConst17.types | 154 ++++ .../parserES5ForOfStatement1.d.errors.txt | 4 +- .../parserES5ForOfStatement2.errors.txt | 6 +- .../parserES5ForOfStatement21.errors.txt | 6 +- .../parserES5ForOfStatement3.errors.txt | 6 +- .../parserES5ForOfStatement4.errors.txt | 6 +- .../parserES5ForOfStatement5.errors.txt | 6 +- .../parserES5ForOfStatement6.errors.txt | 6 +- .../parserES5ForOfStatement7.errors.txt | 6 +- 51 files changed, 1043 insertions(+), 578 deletions(-) delete mode 100644 tests/baselines/reference/ES5For-of10.errors.txt delete mode 100644 tests/baselines/reference/ES5For-of11.errors.txt delete mode 100644 tests/baselines/reference/ES5For-of13.errors.txt delete mode 100644 tests/baselines/reference/ES5For-of14.errors.txt create mode 100644 tests/baselines/reference/ES5For-of14.types delete mode 100644 tests/baselines/reference/ES5For-of15.errors.txt create mode 100644 tests/baselines/reference/ES5For-of15.types delete mode 100644 tests/baselines/reference/ES5For-of16.errors.txt create mode 100644 tests/baselines/reference/ES5For-of16.types delete mode 100644 tests/baselines/reference/ES5For-of18.errors.txt create mode 100644 tests/baselines/reference/ES5For-of18.types delete mode 100644 tests/baselines/reference/ES5For-of19.errors.txt create mode 100644 tests/baselines/reference/ES5For-of19.types delete mode 100644 tests/baselines/reference/ES5For-of2.errors.txt create mode 100644 tests/baselines/reference/ES5For-of2.types delete mode 100644 tests/baselines/reference/ES5For-of21.errors.txt create mode 100644 tests/baselines/reference/ES5For-of21.types delete mode 100644 tests/baselines/reference/ES5For-of24.errors.txt delete mode 100644 tests/baselines/reference/ES5For-of25.errors.txt delete mode 100644 tests/baselines/reference/ES5For-of26.errors.txt create mode 100644 tests/baselines/reference/ES5For-of26.types delete mode 100644 tests/baselines/reference/ES5For-of28.errors.txt create mode 100644 tests/baselines/reference/ES5For-of28.types delete mode 100644 tests/baselines/reference/ES5For-of3.errors.txt delete mode 100644 tests/baselines/reference/ES5For-of4.errors.txt create mode 100644 tests/baselines/reference/ES5For-of4.types delete mode 100644 tests/baselines/reference/ES5For-of5.errors.txt create mode 100644 tests/baselines/reference/ES5For-of5.types delete mode 100644 tests/baselines/reference/ES5For-of6.errors.txt create mode 100644 tests/baselines/reference/ES5For-of6.types delete mode 100644 tests/baselines/reference/ES5For-of9.errors.txt delete mode 100644 tests/baselines/reference/downlevelLetConst16.errors.txt create mode 100644 tests/baselines/reference/downlevelLetConst16.types delete mode 100644 tests/baselines/reference/downlevelLetConst17.errors.txt create mode 100644 tests/baselines/reference/downlevelLetConst17.types diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index afcf12fed1be5..6682761812d1a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -8777,11 +8777,6 @@ module ts { } function checkForOfStatement(node: ForOfStatement): void { - if (languageVersion < ScriptTarget.ES6) { - grammarErrorOnFirstToken(node, Diagnostics.for_of_statements_are_only_available_when_targeting_ECMAScript_6_or_higher); - return; - } - checkGrammarForInOrForOfStatement(node) // Check the LHS and RHS diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index b06a283a87616..74028d8591080 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -327,7 +327,6 @@ module ts { Property_0_does_not_exist_on_const_enum_1: { code: 2479, category: DiagnosticCategory.Error, key: "Property '{0}' does not exist on 'const' enum '{1}'." }, let_is_not_allowed_to_be_used_as_a_name_in_let_or_const_declarations: { code: 2480, category: DiagnosticCategory.Error, key: "'let' is not allowed to be used as a name in 'let' or 'const' declarations." }, Cannot_initialize_outer_scoped_variable_0_in_the_same_scope_as_block_scoped_declaration_1: { code: 2481, category: DiagnosticCategory.Error, key: "Cannot initialize outer scoped variable '{0}' in the same scope as block scoped declaration '{1}'." }, - for_of_statements_are_only_available_when_targeting_ECMAScript_6_or_higher: { code: 2482, category: DiagnosticCategory.Error, key: "'for...of' statements are only available when targeting ECMAScript 6 or higher." }, The_left_hand_side_of_a_for_of_statement_cannot_use_a_type_annotation: { code: 2483, category: DiagnosticCategory.Error, key: "The left-hand side of a 'for...of' statement cannot use a type annotation." }, Export_declaration_conflicts_with_exported_declaration_of_0: { code: 2484, category: DiagnosticCategory.Error, key: "Export declaration conflicts with exported declaration of '{0}'" }, The_left_hand_side_of_a_for_of_statement_cannot_be_a_previously_defined_constant: { code: 2485, category: DiagnosticCategory.Error, key: "The left-hand side of a 'for...of' statement cannot be a previously defined constant." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index b265f5b528112..f55c439169984 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1299,10 +1299,6 @@ "category": "Error", "code": 2481 }, - "'for...of' statements are only available when targeting ECMAScript 6 or higher.": { - "category": "Error", - "code": 2482 - }, "The left-hand side of a 'for...of' statement cannot use a type annotation.": { "category": "Error", "code": 2483 diff --git a/tests/baselines/reference/ES5For-of1.errors.txt b/tests/baselines/reference/ES5For-of1.errors.txt index 7579ea04528cc..16222725b3d64 100644 --- a/tests/baselines/reference/ES5For-of1.errors.txt +++ b/tests/baselines/reference/ES5For-of1.errors.txt @@ -1,9 +1,9 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of1.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/statements/for-ofStatements/ES5For-of1.ts(2,5): error TS2304: Cannot find name 'console'. ==== tests/cases/conformance/statements/for-ofStatements/ES5For-of1.ts (1 errors) ==== for (var v of ['a', 'b', 'c']) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. console.log(v); + ~~~~~~~ +!!! error TS2304: Cannot find name 'console'. } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of10.errors.txt b/tests/baselines/reference/ES5For-of10.errors.txt deleted file mode 100644 index 70f69ed204f90..0000000000000 --- a/tests/baselines/reference/ES5For-of10.errors.txt +++ /dev/null @@ -1,13 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of10.ts(4,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of10.ts (1 errors) ==== - function foo() { - return { x: 0 }; - } - for (foo().x of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - for (foo().x of []) - var p = foo().x; - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of11.errors.txt b/tests/baselines/reference/ES5For-of11.errors.txt deleted file mode 100644 index bfb494f83a588..0000000000000 --- a/tests/baselines/reference/ES5For-of11.errors.txt +++ /dev/null @@ -1,8 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of11.ts(2,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of11.ts (1 errors) ==== - var v; - for (v of []) { } - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of13.errors.txt b/tests/baselines/reference/ES5For-of13.errors.txt deleted file mode 100644 index a217d590f5e29..0000000000000 --- a/tests/baselines/reference/ES5For-of13.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of13.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of13.ts (1 errors) ==== - for (let v of ['a', 'b', 'c']) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - var x = v; - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of14.errors.txt b/tests/baselines/reference/ES5For-of14.errors.txt deleted file mode 100644 index 073c3869028ea..0000000000000 --- a/tests/baselines/reference/ES5For-of14.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of14.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of14.ts (1 errors) ==== - for (const v of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - var x = v; - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of14.types b/tests/baselines/reference/ES5For-of14.types new file mode 100644 index 0000000000000..0a4f9a78453a5 --- /dev/null +++ b/tests/baselines/reference/ES5For-of14.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of14.ts === +for (const v of []) { +>v : any +>[] : undefined[] + + var x = v; +>x : any +>v : any +} diff --git a/tests/baselines/reference/ES5For-of15.errors.txt b/tests/baselines/reference/ES5For-of15.errors.txt deleted file mode 100644 index a63e1202cec30..0000000000000 --- a/tests/baselines/reference/ES5For-of15.errors.txt +++ /dev/null @@ -1,12 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of15.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of15.ts (1 errors) ==== - for (let v of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - v; - for (const v of []) { - var x = v; - } - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of15.types b/tests/baselines/reference/ES5For-of15.types new file mode 100644 index 0000000000000..90409b8b16768 --- /dev/null +++ b/tests/baselines/reference/ES5For-of15.types @@ -0,0 +1,17 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of15.ts === +for (let v of []) { +>v : any +>[] : undefined[] + + v; +>v : any + + for (const v of []) { +>v : any +>[] : undefined[] + + var x = v; +>x : any +>v : any + } +} diff --git a/tests/baselines/reference/ES5For-of16.errors.txt b/tests/baselines/reference/ES5For-of16.errors.txt deleted file mode 100644 index 969d83b805858..0000000000000 --- a/tests/baselines/reference/ES5For-of16.errors.txt +++ /dev/null @@ -1,13 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of16.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of16.ts (1 errors) ==== - for (let v of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - v; - for (let v of []) { - var x = v; - v++; - } - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of16.types b/tests/baselines/reference/ES5For-of16.types new file mode 100644 index 0000000000000..94f015097118c --- /dev/null +++ b/tests/baselines/reference/ES5For-of16.types @@ -0,0 +1,21 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of16.ts === +for (let v of []) { +>v : any +>[] : undefined[] + + v; +>v : any + + for (let v of []) { +>v : any +>[] : undefined[] + + var x = v; +>x : any +>v : any + + v++; +>v++ : number +>v : any + } +} diff --git a/tests/baselines/reference/ES5For-of18.errors.txt b/tests/baselines/reference/ES5For-of18.errors.txt deleted file mode 100644 index 77872e93b9767..0000000000000 --- a/tests/baselines/reference/ES5For-of18.errors.txt +++ /dev/null @@ -1,16 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of18.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. -tests/cases/conformance/statements/for-ofStatements/ES5For-of18.ts(4,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of18.ts (2 errors) ==== - for (let v of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - v; - } - for (let v of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - v; - } - \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of18.types b/tests/baselines/reference/ES5For-of18.types new file mode 100644 index 0000000000000..e78bc846df6c9 --- /dev/null +++ b/tests/baselines/reference/ES5For-of18.types @@ -0,0 +1,16 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of18.ts === +for (let v of []) { +>v : any +>[] : undefined[] + + v; +>v : any +} +for (let v of []) { +>v : any +>[] : undefined[] + + v; +>v : any +} + diff --git a/tests/baselines/reference/ES5For-of19.errors.txt b/tests/baselines/reference/ES5For-of19.errors.txt deleted file mode 100644 index 0e1352d988dea..0000000000000 --- a/tests/baselines/reference/ES5For-of19.errors.txt +++ /dev/null @@ -1,15 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of19.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of19.ts (1 errors) ==== - for (let v of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - v; - function foo() { - for (const v of []) { - v; - } - } - } - \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of19.types b/tests/baselines/reference/ES5For-of19.types new file mode 100644 index 0000000000000..d95dc63d2626b --- /dev/null +++ b/tests/baselines/reference/ES5For-of19.types @@ -0,0 +1,21 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of19.ts === +for (let v of []) { +>v : any +>[] : undefined[] + + v; +>v : any + + function foo() { +>foo : () => void + + for (const v of []) { +>v : any +>[] : undefined[] + + v; +>v : any + } + } +} + diff --git a/tests/baselines/reference/ES5For-of2.errors.txt b/tests/baselines/reference/ES5For-of2.errors.txt deleted file mode 100644 index 2b39c276796bb..0000000000000 --- a/tests/baselines/reference/ES5For-of2.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of2.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of2.ts (1 errors) ==== - for (var v of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - var x = v; - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of2.types b/tests/baselines/reference/ES5For-of2.types new file mode 100644 index 0000000000000..3e680c44bc8aa --- /dev/null +++ b/tests/baselines/reference/ES5For-of2.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of2.ts === +for (var v of []) { +>v : any +>[] : undefined[] + + var x = v; +>x : any +>v : any +} diff --git a/tests/baselines/reference/ES5For-of20.errors.txt b/tests/baselines/reference/ES5For-of20.errors.txt index 35e5130b0de23..8150991099615 100644 --- a/tests/baselines/reference/ES5For-of20.errors.txt +++ b/tests/baselines/reference/ES5For-of20.errors.txt @@ -1,12 +1,12 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of20.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/statements/for-ofStatements/ES5For-of20.ts(4,15): error TS1155: 'const' declarations must be initialized ==== tests/cases/conformance/statements/for-ofStatements/ES5For-of20.ts (1 errors) ==== for (let v of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. let v; for (let v of [v]) { const v; + ~ +!!! error TS1155: 'const' declarations must be initialized } } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of21.errors.txt b/tests/baselines/reference/ES5For-of21.errors.txt deleted file mode 100644 index bd0a6ccee6437..0000000000000 --- a/tests/baselines/reference/ES5For-of21.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of21.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of21.ts (1 errors) ==== - for (let v of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - for (let _i of []) { } - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of21.types b/tests/baselines/reference/ES5For-of21.types new file mode 100644 index 0000000000000..a15942fd0134e --- /dev/null +++ b/tests/baselines/reference/ES5For-of21.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of21.ts === +for (let v of []) { +>v : any +>[] : undefined[] + + for (let _i of []) { } +>_i : any +>[] : undefined[] +} diff --git a/tests/baselines/reference/ES5For-of22.errors.txt b/tests/baselines/reference/ES5For-of22.errors.txt index 0acfcb6dde8ed..914be13c63cb4 100644 --- a/tests/baselines/reference/ES5For-of22.errors.txt +++ b/tests/baselines/reference/ES5For-of22.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of22.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/statements/for-ofStatements/ES5For-of22.ts(3,5): error TS2304: Cannot find name 'console'. ==== tests/cases/conformance/statements/for-ofStatements/ES5For-of22.ts (1 errors) ==== for (var x of [1, 2, 3]) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. let _a = 0; console.log(x); + ~~~~~~~ +!!! error TS2304: Cannot find name 'console'. } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of23.errors.txt b/tests/baselines/reference/ES5For-of23.errors.txt index a659436ad9def..cbc043e32d224 100644 --- a/tests/baselines/reference/ES5For-of23.errors.txt +++ b/tests/baselines/reference/ES5For-of23.errors.txt @@ -1,10 +1,10 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of23.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/statements/for-ofStatements/ES5For-of23.ts(3,5): error TS2304: Cannot find name 'console'. ==== tests/cases/conformance/statements/for-ofStatements/ES5For-of23.ts (1 errors) ==== for (var x of [1, 2, 3]) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. var _a = 0; console.log(x); + ~~~~~~~ +!!! error TS2304: Cannot find name 'console'. } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of24.errors.txt b/tests/baselines/reference/ES5For-of24.errors.txt deleted file mode 100644 index 378bc42ecd925..0000000000000 --- a/tests/baselines/reference/ES5For-of24.errors.txt +++ /dev/null @@ -1,10 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of24.ts(2,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of24.ts (1 errors) ==== - var a = [1, 2, 3]; - for (var v of a) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - let a = 0; - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of25.errors.txt b/tests/baselines/reference/ES5For-of25.errors.txt deleted file mode 100644 index d53cdbadd50c4..0000000000000 --- a/tests/baselines/reference/ES5For-of25.errors.txt +++ /dev/null @@ -1,11 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of25.ts(2,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of25.ts (1 errors) ==== - var a = [1, 2, 3]; - for (var v of a) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - v; - a; - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of26.errors.txt b/tests/baselines/reference/ES5For-of26.errors.txt deleted file mode 100644 index 4fae8257d7913..0000000000000 --- a/tests/baselines/reference/ES5For-of26.errors.txt +++ /dev/null @@ -1,10 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of26.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of26.ts (1 errors) ==== - for (var [a = 0, b = 1] of [2, 3]) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - a; - b; - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of26.types b/tests/baselines/reference/ES5For-of26.types new file mode 100644 index 0000000000000..b59378fdb6b26 --- /dev/null +++ b/tests/baselines/reference/ES5For-of26.types @@ -0,0 +1,12 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of26.ts === +for (var [a = 0, b = 1] of [2, 3]) { +>a : number +>b : number +>[2, 3] : number[] + + a; +>a : number + + b; +>b : number +} diff --git a/tests/baselines/reference/ES5For-of28.errors.txt b/tests/baselines/reference/ES5For-of28.errors.txt deleted file mode 100644 index 31080bb5648c8..0000000000000 --- a/tests/baselines/reference/ES5For-of28.errors.txt +++ /dev/null @@ -1,10 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of28.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of28.ts (1 errors) ==== - for (let [a = 0, b = 1] of [2, 3]) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - a; - b; - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of28.types b/tests/baselines/reference/ES5For-of28.types new file mode 100644 index 0000000000000..61a4779e80b50 --- /dev/null +++ b/tests/baselines/reference/ES5For-of28.types @@ -0,0 +1,12 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of28.ts === +for (let [a = 0, b = 1] of [2, 3]) { +>a : number +>b : number +>[2, 3] : number[] + + a; +>a : number + + b; +>b : number +} diff --git a/tests/baselines/reference/ES5For-of3.errors.txt b/tests/baselines/reference/ES5For-of3.errors.txt deleted file mode 100644 index ecf6b73db1329..0000000000000 --- a/tests/baselines/reference/ES5For-of3.errors.txt +++ /dev/null @@ -1,8 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of3.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of3.ts (1 errors) ==== - for (var v of ['a', 'b', 'c']) - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - var x = v; \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of4.errors.txt b/tests/baselines/reference/ES5For-of4.errors.txt deleted file mode 100644 index 047c6f4e153ad..0000000000000 --- a/tests/baselines/reference/ES5For-of4.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of4.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of4.ts (1 errors) ==== - for (var v of []) - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - var x = v; - var y = v; \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of4.types b/tests/baselines/reference/ES5For-of4.types new file mode 100644 index 0000000000000..9396096746c2f --- /dev/null +++ b/tests/baselines/reference/ES5For-of4.types @@ -0,0 +1,13 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of4.ts === +for (var v of []) +>v : any +>[] : undefined[] + + var x = v; +>x : any +>v : any + +var y = v; +>y : any +>v : any + diff --git a/tests/baselines/reference/ES5For-of5.errors.txt b/tests/baselines/reference/ES5For-of5.errors.txt deleted file mode 100644 index 6109498afb2fe..0000000000000 --- a/tests/baselines/reference/ES5For-of5.errors.txt +++ /dev/null @@ -1,9 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of5.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of5.ts (1 errors) ==== - for (var _a of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - var x = _a; - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of5.types b/tests/baselines/reference/ES5For-of5.types new file mode 100644 index 0000000000000..dd9aa285edba0 --- /dev/null +++ b/tests/baselines/reference/ES5For-of5.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of5.ts === +for (var _a of []) { +>_a : any +>[] : undefined[] + + var x = _a; +>x : any +>_a : any +} diff --git a/tests/baselines/reference/ES5For-of6.errors.txt b/tests/baselines/reference/ES5For-of6.errors.txt deleted file mode 100644 index 3664b51b21779..0000000000000 --- a/tests/baselines/reference/ES5For-of6.errors.txt +++ /dev/null @@ -1,11 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of6.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of6.ts (1 errors) ==== - for (var w of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - for (var v of []) { - var x = [w, v]; - } - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of6.types b/tests/baselines/reference/ES5For-of6.types new file mode 100644 index 0000000000000..e2d2f872809d4 --- /dev/null +++ b/tests/baselines/reference/ES5For-of6.types @@ -0,0 +1,16 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of6.ts === +for (var w of []) { +>w : any +>[] : undefined[] + + for (var v of []) { +>v : any +>[] : undefined[] + + var x = [w, v]; +>x : any[] +>[w, v] : any[] +>w : any +>v : any + } +} diff --git a/tests/baselines/reference/ES5For-of7.errors.txt b/tests/baselines/reference/ES5For-of7.errors.txt index 21f9c4d137c89..a3d40f3881416 100644 --- a/tests/baselines/reference/ES5For-of7.errors.txt +++ b/tests/baselines/reference/ES5For-of7.errors.txt @@ -1,16 +1,13 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of7.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. -tests/cases/conformance/statements/for-ofStatements/ES5For-of7.ts(5,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/statements/for-ofStatements/ES5For-of7.ts(6,9): error TS2403: Subsequent variable declarations must have the same type. Variable 'x' must be of type 'any', but here has type 'any[]'. -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of7.ts (2 errors) ==== +==== tests/cases/conformance/statements/for-ofStatements/ES5For-of7.ts (1 errors) ==== for (var w of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. var x = w; } for (var v of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. var x = [w, v]; + ~ +!!! error TS2403: Subsequent variable declarations must have the same type. Variable 'x' must be of type 'any', but here has type 'any[]'. } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of9.errors.txt b/tests/baselines/reference/ES5For-of9.errors.txt deleted file mode 100644 index 1b6607afb3014..0000000000000 --- a/tests/baselines/reference/ES5For-of9.errors.txt +++ /dev/null @@ -1,14 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of9.ts(4,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of9.ts (1 errors) ==== - function foo() { - return { x: 0 }; - } - for (foo().x of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - for (foo().x of []) { - var p = foo().x; - } - } \ No newline at end of file diff --git a/tests/baselines/reference/downlevelLetConst16.errors.txt b/tests/baselines/reference/downlevelLetConst16.errors.txt deleted file mode 100644 index 6156bfe4a2b5e..0000000000000 --- a/tests/baselines/reference/downlevelLetConst16.errors.txt +++ /dev/null @@ -1,248 +0,0 @@ -tests/cases/compiler/downlevelLetConst16.ts(188,5): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. -tests/cases/compiler/downlevelLetConst16.ts(195,5): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. -tests/cases/compiler/downlevelLetConst16.ts(202,5): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. -tests/cases/compiler/downlevelLetConst16.ts(209,5): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. -tests/cases/compiler/downlevelLetConst16.ts(216,5): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. -tests/cases/compiler/downlevelLetConst16.ts(223,5): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/compiler/downlevelLetConst16.ts (6 errors) ==== - 'use strict' - - declare function use(a: any); - - var x = 10; - var y; - var z; - use(x); - use(y); - use(z); - function foo1() { - let x = 1; - use(x); - let [y] = [1]; - use(y); - let {a: z} = {a: 1}; - use(z); - } - - function foo2() { - { - let x = 1; - use(x); - let [y] = [1]; - use(y); - let {a: z} = { a: 1 }; - use(z); - } - use(x); - } - - class A { - m1() { - let x = 1; - use(x); - let [y] = [1]; - use(y); - let {a: z} = { a: 1 }; - use(z); - } - m2() { - { - let x = 1; - use(x); - let [y] = [1]; - use(y); - let {a: z} = { a: 1 }; - use(z); - } - use(x); - } - - } - - class B { - m1() { - const x = 1; - use(x); - const [y] = [1]; - use(y); - const {a: z} = { a: 1 }; - use(z); - - } - m2() { - { - const x = 1; - use(x); - const [y] = [1]; - use(y); - const {a: z} = { a: 1 }; - use(z); - - } - use(x); - } - } - - function bar1() { - const x = 1; - use(x); - const [y] = [1]; - use(y); - const {a: z} = { a: 1 }; - use(z); - } - - function bar2() { - { - const x = 1; - use(x); - const [y] = [1]; - use(y); - const {a: z} = { a: 1 }; - use(z); - - } - use(x); - } - - module M1 { - let x = 1; - use(x); - let [y] = [1]; - use(y); - let {a: z} = { a: 1 }; - use(z); - } - - module M2 { - { - let x = 1; - use(x); - let [y] = [1]; - use(y); - let {a: z} = { a: 1 }; - use(z); - } - use(x); - } - - module M3 { - const x = 1; - use(x); - const [y] = [1]; - use(y); - const {a: z} = { a: 1 }; - use(z); - - } - - module M4 { - { - const x = 1; - use(x); - const [y] = [1]; - use(y); - const {a: z} = { a: 1 }; - use(z); - - } - use(x); - use(y); - use(z); - } - - function foo3() { - for (let x; ;) { - use(x); - } - for (let [y] = []; ;) { - use(y); - } - for (let {a: z} = {a: 1}; ;) { - use(z); - } - use(x); - } - - function foo4() { - for (const x = 1; ;) { - use(x); - } - for (const [y] = []; ;) { - use(y); - } - for (const {a: z} = { a: 1 }; ;) { - use(z); - } - use(x); - } - - function foo5() { - for (let x in []) { - use(x); - } - use(x); - } - - function foo6() { - for (const x in []) { - use(x); - } - use(x); - } - - function foo7() { - for (let x of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - use(x); - } - use(x); - } - - function foo8() { - for (let [x] of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - use(x); - } - use(x); - } - - function foo9() { - for (let {a: x} of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - use(x); - } - use(x); - } - - function foo10() { - for (const x of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - use(x); - } - use(x); - } - - function foo11() { - for (const [x] of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - use(x); - } - use(x); - } - - function foo12() { - for (const {a: x} of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - use(x); - } - use(x); - } \ No newline at end of file diff --git a/tests/baselines/reference/downlevelLetConst16.types b/tests/baselines/reference/downlevelLetConst16.types new file mode 100644 index 0000000000000..a9a11507c30c7 --- /dev/null +++ b/tests/baselines/reference/downlevelLetConst16.types @@ -0,0 +1,686 @@ +=== tests/cases/compiler/downlevelLetConst16.ts === +'use strict' + +declare function use(a: any); +>use : (a: any) => any +>a : any + +var x = 10; +>x : number + +var y; +>y : any + +var z; +>z : any + +use(x); +>use(x) : any +>use : (a: any) => any +>x : number + +use(y); +>use(y) : any +>use : (a: any) => any +>y : any + +use(z); +>use(z) : any +>use : (a: any) => any +>z : any + +function foo1() { +>foo1 : () => void + + let x = 1; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + let [y] = [1]; +>y : number +>[1] : [number] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : number + + let {a: z} = {a: 1}; +>a : unknown +>z : number +>{a: 1} : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number +} + +function foo2() { +>foo2 : () => void + { + let x = 1; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + let [y] = [1]; +>y : number +>[1] : [number] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : number + + let {a: z} = { a: 1 }; +>a : unknown +>z : number +>{ a: 1 } : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +class A { +>A : A + + m1() { +>m1 : () => void + + let x = 1; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + let [y] = [1]; +>y : number +>[1] : [number] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : number + + let {a: z} = { a: 1 }; +>a : unknown +>z : number +>{ a: 1 } : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number + } + m2() { +>m2 : () => void + { + let x = 1; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + let [y] = [1]; +>y : number +>[1] : [number] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : number + + let {a: z} = { a: 1 }; +>a : unknown +>z : number +>{ a: 1 } : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + } + +} + +class B { +>B : B + + m1() { +>m1 : () => void + + const x = 1; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + const [y] = [1]; +>y : number +>[1] : [number] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : number + + const {a: z} = { a: 1 }; +>a : unknown +>z : number +>{ a: 1 } : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number + + } + m2() { +>m2 : () => void + { + const x = 1; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + const [y] = [1]; +>y : number +>[1] : [number] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : number + + const {a: z} = { a: 1 }; +>a : unknown +>z : number +>{ a: 1 } : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number + + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + } +} + +function bar1() { +>bar1 : () => void + + const x = 1; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + const [y] = [1]; +>y : number +>[1] : [number] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : number + + const {a: z} = { a: 1 }; +>a : unknown +>z : number +>{ a: 1 } : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number +} + +function bar2() { +>bar2 : () => void + { + const x = 1; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + const [y] = [1]; +>y : number +>[1] : [number] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : number + + const {a: z} = { a: 1 }; +>a : unknown +>z : number +>{ a: 1 } : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number + + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +module M1 { +>M1 : typeof M1 + + let x = 1; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + let [y] = [1]; +>y : number +>[1] : [number] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : number + + let {a: z} = { a: 1 }; +>a : unknown +>z : number +>{ a: 1 } : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number +} + +module M2 { +>M2 : typeof M2 + { + let x = 1; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + let [y] = [1]; +>y : number +>[1] : [number] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : number + + let {a: z} = { a: 1 }; +>a : unknown +>z : number +>{ a: 1 } : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +module M3 { +>M3 : typeof M3 + + const x = 1; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + const [y] = [1]; +>y : number +>[1] : [number] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : number + + const {a: z} = { a: 1 }; +>a : unknown +>z : number +>{ a: 1 } : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number + +} + +module M4 { +>M4 : typeof M4 + { + const x = 1; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + const [y] = [1]; +>y : number +>[1] : [number] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : number + + const {a: z} = { a: 1 }; +>a : unknown +>z : number +>{ a: 1 } : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number + + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + use(y); +>use(y) : any +>use : (a: any) => any +>y : any + + use(z); +>use(z) : any +>use : (a: any) => any +>z : any +} + +function foo3() { +>foo3 : () => void + + for (let x; ;) { +>x : any + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any + } + for (let [y] = []; ;) { +>y : any +>[] : undefined[] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : any + } + for (let {a: z} = {a: 1}; ;) { +>a : unknown +>z : number +>{a: 1} : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +function foo4() { +>foo4 : () => void + + for (const x = 1; ;) { +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + } + for (const [y] = []; ;) { +>y : any +>[] : undefined[] + + use(y); +>use(y) : any +>use : (a: any) => any +>y : any + } + for (const {a: z} = { a: 1 }; ;) { +>a : unknown +>z : number +>{ a: 1 } : { a: number; } +>a : number + + use(z); +>use(z) : any +>use : (a: any) => any +>z : number + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +function foo5() { +>foo5 : () => void + + for (let x in []) { +>x : any +>[] : undefined[] + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +function foo6() { +>foo6 : () => void + + for (const x in []) { +>x : any +>[] : undefined[] + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +function foo7() { +>foo7 : () => void + + for (let x of []) { +>x : any +>[] : undefined[] + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +function foo8() { +>foo8 : () => void + + for (let [x] of []) { +>x : any +>[] : undefined[] + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +function foo9() { +>foo9 : () => void + + for (let {a: x} of []) { +>a : unknown +>x : any +>[] : undefined[] + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +function foo10() { +>foo10 : () => void + + for (const x of []) { +>x : any +>[] : undefined[] + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +function foo11() { +>foo11 : () => void + + for (const [x] of []) { +>x : any +>[] : undefined[] + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +function foo12() { +>foo12 : () => void + + for (const {a: x} of []) { +>a : unknown +>x : any +>[] : undefined[] + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any + } + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} diff --git a/tests/baselines/reference/downlevelLetConst17.errors.txt b/tests/baselines/reference/downlevelLetConst17.errors.txt deleted file mode 100644 index 6183bab9430c3..0000000000000 --- a/tests/baselines/reference/downlevelLetConst17.errors.txt +++ /dev/null @@ -1,73 +0,0 @@ -tests/cases/compiler/downlevelLetConst17.ts(65,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/compiler/downlevelLetConst17.ts (1 errors) ==== - 'use strict' - - declare function use(a: any); - - var x; - for (let x = 10; ;) { - use(x); - } - use(x); - - for (const x = 10; ;) { - use(x); - } - - for (; ;) { - let x = 10; - use(x); - x = 1; - } - - for (; ;) { - const x = 10; - use(x); - } - - for (let x; ;) { - use(x); - x = 1; - } - - for (; ;) { - let x; - use(x); - x = 1; - } - - while (true) { - let x; - use(x); - } - - while (true) { - const x = true; - use(x); - } - - do { - let x; - use(x); - } while (true); - - do { - let x; - use(x); - } while (true); - - for (let x in []) { - use(x); - } - - for (const x in []) { - use(x); - } - - for (const x of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - use(x); - } \ No newline at end of file diff --git a/tests/baselines/reference/downlevelLetConst17.types b/tests/baselines/reference/downlevelLetConst17.types new file mode 100644 index 0000000000000..0c5a8eaa86bef --- /dev/null +++ b/tests/baselines/reference/downlevelLetConst17.types @@ -0,0 +1,154 @@ +=== tests/cases/compiler/downlevelLetConst17.ts === +'use strict' + +declare function use(a: any); +>use : (a: any) => any +>a : any + +var x; +>x : any + +for (let x = 10; ;) { +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} +use(x); +>use(x) : any +>use : (a: any) => any +>x : any + +for (const x = 10; ;) { +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +for (; ;) { + let x = 10; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number + + x = 1; +>x = 1 : number +>x : number +} + +for (; ;) { + const x = 10; +>x : number + + use(x); +>use(x) : any +>use : (a: any) => any +>x : number +} + +for (let x; ;) { +>x : any + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any + + x = 1; +>x = 1 : number +>x : any +} + +for (; ;) { + let x; +>x : any + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any + + x = 1; +>x = 1 : number +>x : any +} + +while (true) { + let x; +>x : any + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any +} + +while (true) { + const x = true; +>x : boolean + + use(x); +>use(x) : any +>use : (a: any) => any +>x : boolean +} + +do { + let x; +>x : any + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any + +} while (true); + +do { + let x; +>x : any + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any + +} while (true); + +for (let x in []) { +>x : any +>[] : undefined[] + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any +} + +for (const x in []) { +>x : any +>[] : undefined[] + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any +} + +for (const x of []) { +>x : any +>[] : undefined[] + + use(x); +>use(x) : any +>use : (a: any) => any +>x : any +} diff --git a/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt b/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt index c280b597b2c11..f3034cd2c276b 100644 --- a/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts(1,1): error TS1036: Statements are not allowed in ambient contexts. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts (1 errors) ==== for (var i of e) { ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +!!! error TS1036: Statements are not allowed in ambient contexts. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement2.errors.txt b/tests/baselines/reference/parserES5ForOfStatement2.errors.txt index 618e2f3f0ae38..cb249e8378565 100644 --- a/tests/baselines/reference/parserES5ForOfStatement2.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement2.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts(1,9): error TS1123: Variable declaration list cannot be empty. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement2.ts (1 errors) ==== for (var of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + +!!! error TS1123: Variable declaration list cannot be empty. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement21.errors.txt b/tests/baselines/reference/parserES5ForOfStatement21.errors.txt index 14d97f49fafbc..76f87978cf1e6 100644 --- a/tests/baselines/reference/parserES5ForOfStatement21.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement21.errors.txt @@ -1,7 +1,7 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts(1,9): error TS1123: Variable declaration list cannot be empty. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement21.ts (1 errors) ==== for (var of of) { } - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. \ No newline at end of file + +!!! error TS1123: Variable declaration list cannot be empty. \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement3.errors.txt b/tests/baselines/reference/parserES5ForOfStatement3.errors.txt index dd888a3120ab0..a976d9c0d54cf 100644 --- a/tests/baselines/reference/parserES5ForOfStatement3.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement3.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts(1,13): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts (1 errors) ==== for (var a, b of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement4.errors.txt b/tests/baselines/reference/parserES5ForOfStatement4.errors.txt index b94de56b17ceb..e2b38b56be5f7 100644 --- a/tests/baselines/reference/parserES5ForOfStatement4.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement4.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts(1,10): error TS1190: The variable declaration of a 'for...of' statement cannot have an initializer. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts (1 errors) ==== for (var a = 1 of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS1190: The variable declaration of a 'for...of' statement cannot have an initializer. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement5.errors.txt b/tests/baselines/reference/parserES5ForOfStatement5.errors.txt index 0b8dafc0b900a..0e88ce6cf363b 100644 --- a/tests/baselines/reference/parserES5ForOfStatement5.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement5.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts(1,10): error TS2483: The left-hand side of a 'for...of' statement cannot use a type annotation. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts (1 errors) ==== for (var a: number of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS2483: The left-hand side of a 'for...of' statement cannot use a type annotation. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement6.errors.txt b/tests/baselines/reference/parserES5ForOfStatement6.errors.txt index 04ac84fbd73f8..da76589190d6d 100644 --- a/tests/baselines/reference/parserES5ForOfStatement6.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement6.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts(1,17): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts (1 errors) ==== for (var a = 1, b = 2 of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement7.errors.txt b/tests/baselines/reference/parserES5ForOfStatement7.errors.txt index 1def5279f651f..ced399ca103d2 100644 --- a/tests/baselines/reference/parserES5ForOfStatement7.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement7.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts(1,25): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts (1 errors) ==== for (var a: number = 1, b: string = "" of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. } \ No newline at end of file From 61cd2a7543261c082213d314d1dc294d402bed88 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Mon, 9 Mar 2015 11:27:02 -0700 Subject: [PATCH 2/8] Introduce checkElementTypeOfArrayOrString for downlevel for..of type checking --- src/compiler/checker.ts | 67 +- .../diagnosticInformationMap.generated.ts | 1 + src/compiler/diagnosticMessages.json | 4 + tests/baselines/reference/ES5For-of10.types | 29 + tests/baselines/reference/ES5For-of11.types | 8 + .../reference/ES5For-of12.errors.txt | 6 +- tests/baselines/reference/ES5For-of13.types | 9 + tests/baselines/reference/ES5For-of24.types | 12 + tests/baselines/reference/ES5For-of25.types | 15 + .../reference/ES5For-of26.errors.txt | 10 + tests/baselines/reference/ES5For-of26.types | 12 - .../reference/ES5For-of27.errors.txt | 11 +- .../reference/ES5For-of28.errors.txt | 10 + tests/baselines/reference/ES5For-of28.types | 12 - .../reference/ES5For-of29.errors.txt | 11 +- tests/baselines/reference/ES5For-of3.types | 9 + .../reference/ES5For-of30.errors.txt | 6 +- .../reference/ES5For-of31.errors.txt | 11 +- .../baselines/reference/ES5For-of8.errors.txt | 6 +- tests/baselines/reference/ES5For-of9.types | 30 + .../arityAndOrderCompatibility01.errors.txt | 292 ++++---- .../reference/arityAndOrderCompatibility01.js | 56 +- .../reference/downlevelLetConst16.errors.txt | 242 ++++++ .../reference/downlevelLetConst16.types | 686 ------------------ .../parserES5ForOfStatement1.d.errors.txt | 5 +- .../parserES5ForOfStatement10.errors.txt | 6 +- .../parserES5ForOfStatement11.errors.txt | 6 +- .../parserES5ForOfStatement12.errors.txt | 6 +- .../parserES5ForOfStatement13.errors.txt | 6 +- .../parserES5ForOfStatement14.errors.txt | 6 +- .../parserES5ForOfStatement15.errors.txt | 6 +- .../parserES5ForOfStatement16.errors.txt | 6 +- .../parserES5ForOfStatement3.errors.txt | 5 +- .../parserES5ForOfStatement4.errors.txt | 5 +- .../parserES5ForOfStatement5.errors.txt | 5 +- .../parserES5ForOfStatement6.errors.txt | 5 +- .../parserES5ForOfStatement7.errors.txt | 5 +- .../parserES5ForOfStatement8.errors.txt | 6 +- .../parserES5ForOfStatement9.errors.txt | 6 +- 39 files changed, 685 insertions(+), 954 deletions(-) create mode 100644 tests/baselines/reference/ES5For-of10.types create mode 100644 tests/baselines/reference/ES5For-of11.types create mode 100644 tests/baselines/reference/ES5For-of13.types create mode 100644 tests/baselines/reference/ES5For-of24.types create mode 100644 tests/baselines/reference/ES5For-of25.types create mode 100644 tests/baselines/reference/ES5For-of26.errors.txt delete mode 100644 tests/baselines/reference/ES5For-of26.types create mode 100644 tests/baselines/reference/ES5For-of28.errors.txt delete mode 100644 tests/baselines/reference/ES5For-of28.types create mode 100644 tests/baselines/reference/ES5For-of3.types create mode 100644 tests/baselines/reference/ES5For-of9.types create mode 100644 tests/baselines/reference/downlevelLetConst16.errors.txt delete mode 100644 tests/baselines/reference/downlevelLetConst16.types diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6682761812d1a..414a8ce17fa33 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1869,7 +1869,11 @@ module ts { return anyType; } if (declaration.parent.parent.kind === SyntaxKind.ForOfStatement) { - return getTypeForVariableDeclarationInForOfStatement(declaration.parent.parent); + // checkRightHandSideOfForOf will return undefined if the for-of expression type was + // missing properties/signatures required to get its iteratedType (like + // [Symbol.iterator] or next). This may be because we accessed properties from anyType, + // or it may have led to an error inside getIteratedType. + return checkRightHandSideOfForOf((declaration.parent.parent).expression) || anyType; } if (isBindingPattern(declaration.parent)) { return getTypeForBindingElement(declaration); @@ -8781,7 +8785,7 @@ module ts { // Check the LHS and RHS // If the LHS is a declaration, just check it as a variable declaration, which will in turn check the RHS - // via getTypeForVariableDeclarationInForOfStatement. + // via checkRightHandSideOfForOf. // If the LHS is an expression, check the LHS, as a destructuring assignment or as a reference. // Then check that the RHS is assignable to it. if (node.initializer.kind === SyntaxKind.VariableDeclarationList) { @@ -8789,8 +8793,7 @@ module ts { } else { var varExpr = node.initializer; - var rightType = checkExpression(node.expression); - var iteratedType = checkIteratedType(rightType, node.expression); + var iteratedType = checkRightHandSideOfForOf(node.expression); // There may be a destructuring assignment on the left side if (varExpr.kind === SyntaxKind.ArrayLiteralExpression || varExpr.kind === SyntaxKind.ObjectLiteralExpression) { @@ -8872,18 +8875,11 @@ module ts { } } - function getTypeForVariableDeclarationInForOfStatement(forOfStatement: ForOfStatement): Type { - // Temporarily return 'any' below ES6 - if (languageVersion < ScriptTarget.ES6) { - return anyType; - } - - // iteratedType will be undefined if the for-of expression type was missing properties/signatures - // required to get its iteratedType (like [Symbol.iterator] or next). This may be - // because we accessed properties from anyType, or it may have led to an error inside - // getIteratedType. - var expressionType = getTypeOfExpression(forOfStatement.expression); - return checkIteratedType(expressionType, forOfStatement.expression) || anyType; + function checkRightHandSideOfForOf(rhsExpression: Expression): Type { + var expressionType = getTypeOfExpression(rhsExpression); + return languageVersion >= ScriptTarget.ES6 + ? checkIteratedType(expressionType, rhsExpression) + : checkElementTypeOfArrayOrString(expressionType, rhsExpression); } /** @@ -8982,6 +8978,45 @@ module ts { } } + function checkElementTypeOfArrayOrString(arrayOrStringType: Type, expressionForError: Expression): Type { + Debug.assert(languageVersion < ScriptTarget.ES6); + var isJustString = allConstituentTypesHaveKind(arrayOrStringType, TypeFlags.StringLike); + + // Check isJustString because removeTypesFromUnionType will only remove types if it doesn't result + // in an emptyObjectType. In this case, we actually do want the emptyObjectType. + var arrayType = isJustString ? emptyObjectType : removeTypesFromUnionType(arrayOrStringType, TypeFlags.StringLike, /*isTypeOfKind*/ true); + var hasStringConstituent = arrayOrStringType !== emptyObjectType && arrayOrStringType !== arrayType; + + var reportedError = false; + if (hasStringConstituent && languageVersion < ScriptTarget.ES5) { + error(expressionForError, Diagnostics.Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher); + reportedError = true; + } + + if (isJustString) { + return stringType; + } + + if (!isArrayLikeType(arrayType)) { + if (!reportedError) { + error(expressionForError, Diagnostics.Type_0_is_not_an_array_type, typeToString(arrayType)); + } + return hasStringConstituent ? stringType : unknownType; + } + + var arrayElementType = getIndexTypeOfType(arrayType, IndexKind.Number) || unknownType; + if (hasStringConstituent) { + // This is just an optimization for the case where arrayOrStringType is string | string[] + if (arrayElementType.flags & TypeFlags.StringLike) { + return stringType; + } + + return getUnionType([arrayElementType, stringType]); + } + + return arrayElementType; + } + function checkBreakOrContinueStatement(node: BreakOrContinueStatement) { // Grammar checking checkGrammarStatementInAmbientContext(node) || checkGrammarBreakOrContinueStatement(node); diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 74028d8591080..ef8a3936bc3c0 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -338,6 +338,7 @@ module ts { The_left_hand_side_of_a_for_in_statement_cannot_be_a_destructuring_pattern: { code: 2491, category: DiagnosticCategory.Error, key: "The left-hand side of a 'for...in' statement cannot be a destructuring pattern." }, Cannot_redeclare_identifier_0_in_catch_clause: { code: 2492, category: DiagnosticCategory.Error, key: "Cannot redeclare identifier '{0}' in catch clause" }, Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2: { code: 2493, category: DiagnosticCategory.Error, key: "Tuple type '{0}' with length '{1}' cannot be assigned to tuple with length '{2}'." }, + Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher: { code: 2494, category: DiagnosticCategory.Error, key: "Using a string in a 'for...of' statement is only supported in ECMAScript 5 and higher." }, Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." }, Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." }, Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported interface has or is using private name '{1}'." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index f55c439169984..efeb54d93fca5 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1343,6 +1343,10 @@ "category": "Error", "code": 2493 }, + "Using a string in a 'for...of' statement is only supported in ECMAScript 5 and higher.": { + "category": "Error", + "code": 2494 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/tests/baselines/reference/ES5For-of10.types b/tests/baselines/reference/ES5For-of10.types new file mode 100644 index 0000000000000..32a2adcf3dac4 --- /dev/null +++ b/tests/baselines/reference/ES5For-of10.types @@ -0,0 +1,29 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of10.ts === +function foo() { +>foo : () => { x: number; } + + return { x: 0 }; +>{ x: 0 } : { x: number; } +>x : number +} +for (foo().x of []) { +>foo().x : number +>foo() : { x: number; } +>foo : () => { x: number; } +>x : number +>[] : undefined[] + + for (foo().x of []) +>foo().x : number +>foo() : { x: number; } +>foo : () => { x: number; } +>x : number +>[] : undefined[] + + var p = foo().x; +>p : number +>foo().x : number +>foo() : { x: number; } +>foo : () => { x: number; } +>x : number +} diff --git a/tests/baselines/reference/ES5For-of11.types b/tests/baselines/reference/ES5For-of11.types new file mode 100644 index 0000000000000..e51bc46f1572c --- /dev/null +++ b/tests/baselines/reference/ES5For-of11.types @@ -0,0 +1,8 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of11.ts === +var v; +>v : any + +for (v of []) { } +>v : any +>[] : undefined[] + diff --git a/tests/baselines/reference/ES5For-of12.errors.txt b/tests/baselines/reference/ES5For-of12.errors.txt index ca7c2b190a23a..55144f549a0b1 100644 --- a/tests/baselines/reference/ES5For-of12.errors.txt +++ b/tests/baselines/reference/ES5For-of12.errors.txt @@ -1,7 +1,7 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of12.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/statements/for-ofStatements/ES5For-of12.ts(1,6): error TS2461: Type 'undefined' is not an array type. ==== tests/cases/conformance/statements/for-ofStatements/ES5For-of12.ts (1 errors) ==== for ([""] of []) { } - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. \ No newline at end of file + ~~~~ +!!! error TS2461: Type 'undefined' is not an array type. \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of13.types b/tests/baselines/reference/ES5For-of13.types new file mode 100644 index 0000000000000..64aac2ae4b221 --- /dev/null +++ b/tests/baselines/reference/ES5For-of13.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of13.ts === +for (let v of ['a', 'b', 'c']) { +>v : string +>['a', 'b', 'c'] : string[] + + var x = v; +>x : string +>v : string +} diff --git a/tests/baselines/reference/ES5For-of24.types b/tests/baselines/reference/ES5For-of24.types new file mode 100644 index 0000000000000..7170073b5d907 --- /dev/null +++ b/tests/baselines/reference/ES5For-of24.types @@ -0,0 +1,12 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of24.ts === +var a = [1, 2, 3]; +>a : number[] +>[1, 2, 3] : number[] + +for (var v of a) { +>v : number +>a : number[] + + let a = 0; +>a : number +} diff --git a/tests/baselines/reference/ES5For-of25.types b/tests/baselines/reference/ES5For-of25.types new file mode 100644 index 0000000000000..7b306ee9a26cc --- /dev/null +++ b/tests/baselines/reference/ES5For-of25.types @@ -0,0 +1,15 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of25.ts === +var a = [1, 2, 3]; +>a : number[] +>[1, 2, 3] : number[] + +for (var v of a) { +>v : number +>a : number[] + + v; +>v : number + + a; +>a : number[] +} diff --git a/tests/baselines/reference/ES5For-of26.errors.txt b/tests/baselines/reference/ES5For-of26.errors.txt new file mode 100644 index 0000000000000..324ded25b4fd7 --- /dev/null +++ b/tests/baselines/reference/ES5For-of26.errors.txt @@ -0,0 +1,10 @@ +tests/cases/conformance/statements/for-ofStatements/ES5For-of26.ts(1,10): error TS2461: Type 'number' is not an array type. + + +==== tests/cases/conformance/statements/for-ofStatements/ES5For-of26.ts (1 errors) ==== + for (var [a = 0, b = 1] of [2, 3]) { + ~~~~~~~~~~~~~~ +!!! error TS2461: Type 'number' is not an array type. + a; + b; + } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of26.types b/tests/baselines/reference/ES5For-of26.types deleted file mode 100644 index b59378fdb6b26..0000000000000 --- a/tests/baselines/reference/ES5For-of26.types +++ /dev/null @@ -1,12 +0,0 @@ -=== tests/cases/conformance/statements/for-ofStatements/ES5For-of26.ts === -for (var [a = 0, b = 1] of [2, 3]) { ->a : number ->b : number ->[2, 3] : number[] - - a; ->a : number - - b; ->b : number -} diff --git a/tests/baselines/reference/ES5For-of27.errors.txt b/tests/baselines/reference/ES5For-of27.errors.txt index f54c66d7eaeda..0c83985993069 100644 --- a/tests/baselines/reference/ES5For-of27.errors.txt +++ b/tests/baselines/reference/ES5For-of27.errors.txt @@ -1,10 +1,13 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of27.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/statements/for-ofStatements/ES5For-of27.ts(1,11): error TS2459: Type 'number' has no property 'x' and no string index signature. +tests/cases/conformance/statements/for-ofStatements/ES5For-of27.ts(1,21): error TS2459: Type 'number' has no property 'y' and no string index signature. -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of27.ts (1 errors) ==== +==== tests/cases/conformance/statements/for-ofStatements/ES5For-of27.ts (2 errors) ==== for (var {x: a = 0, y: b = 1} of [2, 3]) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS2459: Type 'number' has no property 'x' and no string index signature. + ~ +!!! error TS2459: Type 'number' has no property 'y' and no string index signature. a; b; } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of28.errors.txt b/tests/baselines/reference/ES5For-of28.errors.txt new file mode 100644 index 0000000000000..81398fa5a9bac --- /dev/null +++ b/tests/baselines/reference/ES5For-of28.errors.txt @@ -0,0 +1,10 @@ +tests/cases/conformance/statements/for-ofStatements/ES5For-of28.ts(1,10): error TS2461: Type 'number' is not an array type. + + +==== tests/cases/conformance/statements/for-ofStatements/ES5For-of28.ts (1 errors) ==== + for (let [a = 0, b = 1] of [2, 3]) { + ~~~~~~~~~~~~~~ +!!! error TS2461: Type 'number' is not an array type. + a; + b; + } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of28.types b/tests/baselines/reference/ES5For-of28.types deleted file mode 100644 index 61a4779e80b50..0000000000000 --- a/tests/baselines/reference/ES5For-of28.types +++ /dev/null @@ -1,12 +0,0 @@ -=== tests/cases/conformance/statements/for-ofStatements/ES5For-of28.ts === -for (let [a = 0, b = 1] of [2, 3]) { ->a : number ->b : number ->[2, 3] : number[] - - a; ->a : number - - b; ->b : number -} diff --git a/tests/baselines/reference/ES5For-of29.errors.txt b/tests/baselines/reference/ES5For-of29.errors.txt index 24a0b67aec867..e669b070222e1 100644 --- a/tests/baselines/reference/ES5For-of29.errors.txt +++ b/tests/baselines/reference/ES5For-of29.errors.txt @@ -1,10 +1,13 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of29.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/statements/for-ofStatements/ES5For-of29.ts(1,13): error TS2459: Type 'number' has no property 'x' and no string index signature. +tests/cases/conformance/statements/for-ofStatements/ES5For-of29.ts(1,23): error TS2459: Type 'number' has no property 'y' and no string index signature. -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of29.ts (1 errors) ==== +==== tests/cases/conformance/statements/for-ofStatements/ES5For-of29.ts (2 errors) ==== for (const {x: a = 0, y: b = 1} of [2, 3]) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS2459: Type 'number' has no property 'x' and no string index signature. + ~ +!!! error TS2459: Type 'number' has no property 'y' and no string index signature. a; b; } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of3.types b/tests/baselines/reference/ES5For-of3.types new file mode 100644 index 0000000000000..c47328816e86d --- /dev/null +++ b/tests/baselines/reference/ES5For-of3.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of3.ts === +for (var v of ['a', 'b', 'c']) +>v : string +>['a', 'b', 'c'] : string[] + + var x = v; +>x : string +>v : string + diff --git a/tests/baselines/reference/ES5For-of30.errors.txt b/tests/baselines/reference/ES5For-of30.errors.txt index 9ab0dfca3cd40..0b02a55ba3f56 100644 --- a/tests/baselines/reference/ES5For-of30.errors.txt +++ b/tests/baselines/reference/ES5For-of30.errors.txt @@ -1,12 +1,12 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of30.ts(3,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/statements/for-ofStatements/ES5For-of30.ts(3,6): error TS2461: Type 'string | number' is not an array type. ==== tests/cases/conformance/statements/for-ofStatements/ES5For-of30.ts (1 errors) ==== var a: string, b: number; var tuple: [number, string] = [2, "3"]; for ([a = 1, b = ""] of tuple) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~~~~~~~~~~~~~~~ +!!! error TS2461: Type 'string | number' is not an array type. a; b; } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of31.errors.txt b/tests/baselines/reference/ES5For-of31.errors.txt index fa3b7617980b2..4a49e1fdf925d 100644 --- a/tests/baselines/reference/ES5For-of31.errors.txt +++ b/tests/baselines/reference/ES5For-of31.errors.txt @@ -1,12 +1,15 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of31.ts(3,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/statements/for-ofStatements/ES5For-of31.ts(3,8): error TS2459: Type 'undefined' has no property 'a' and no string index signature. +tests/cases/conformance/statements/for-ofStatements/ES5For-of31.ts(3,18): error TS2459: Type 'undefined' has no property 'b' and no string index signature. -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of31.ts (1 errors) ==== +==== tests/cases/conformance/statements/for-ofStatements/ES5For-of31.ts (2 errors) ==== var a: string, b: number; for ({ a: b = 1, b: a = ""} of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS2459: Type 'undefined' has no property 'a' and no string index signature. + ~ +!!! error TS2459: Type 'undefined' has no property 'b' and no string index signature. a; b; } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of8.errors.txt b/tests/baselines/reference/ES5For-of8.errors.txt index d32d50a661090..7cc3c87127783 100644 --- a/tests/baselines/reference/ES5For-of8.errors.txt +++ b/tests/baselines/reference/ES5For-of8.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of8.ts(4,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/statements/for-ofStatements/ES5For-of8.ts(4,6): error TS2322: Type 'string' is not assignable to type 'number'. ==== tests/cases/conformance/statements/for-ofStatements/ES5For-of8.ts (1 errors) ==== @@ -6,7 +6,7 @@ tests/cases/conformance/statements/for-ofStatements/ES5For-of8.ts(4,1): error TS return { x: 0 }; } for (foo().x of ['a', 'b', 'c']) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~~~~~~~ +!!! error TS2322: Type 'string' is not assignable to type 'number'. var p = foo().x; } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of9.types b/tests/baselines/reference/ES5For-of9.types new file mode 100644 index 0000000000000..60870c2d6425c --- /dev/null +++ b/tests/baselines/reference/ES5For-of9.types @@ -0,0 +1,30 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of9.ts === +function foo() { +>foo : () => { x: number; } + + return { x: 0 }; +>{ x: 0 } : { x: number; } +>x : number +} +for (foo().x of []) { +>foo().x : number +>foo() : { x: number; } +>foo : () => { x: number; } +>x : number +>[] : undefined[] + + for (foo().x of []) { +>foo().x : number +>foo() : { x: number; } +>foo : () => { x: number; } +>x : number +>[] : undefined[] + + var p = foo().x; +>p : number +>foo().x : number +>foo() : { x: number; } +>foo : () => { x: number; } +>x : number + } +} diff --git a/tests/baselines/reference/arityAndOrderCompatibility01.errors.txt b/tests/baselines/reference/arityAndOrderCompatibility01.errors.txt index 3925cdff74701..391fbf42384d7 100644 --- a/tests/baselines/reference/arityAndOrderCompatibility01.errors.txt +++ b/tests/baselines/reference/arityAndOrderCompatibility01.errors.txt @@ -1,147 +1,147 @@ -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(13,12): error TS2493: Tuple type '[string, number]' with length '2' cannot be assigned to tuple with length '3'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(14,12): error TS2460: Type 'StrNum' has no property '2'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(15,5): error TS2461: Type '{ 0: string; 1: number; }' is not an array type. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(16,5): error TS2322: Type '[string, number]' is not assignable to type '[number, number, number]'. - Types of property '0' are incompatible. - Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(17,5): error TS2322: Type 'StrNum' is not assignable to type '[number, number, number]'. - Types of property '0' are incompatible. - Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(18,5): error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[number, number, number]'. - Types of property '0' are incompatible. - Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(19,5): error TS2322: Type '[string, number]' is not assignable to type '[string, number, number]'. - Property '2' is missing in type '[string, number]'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(20,5): error TS2322: Type 'StrNum' is not assignable to type '[string, number, number]'. - Property '2' is missing in type 'StrNum'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(21,5): error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[string, number, number]'. - Property '2' is missing in type '{ 0: string; 1: number; }'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(22,5): error TS2322: Type '[string, number]' is not assignable to type '[number]'. - Types of property '0' are incompatible. - Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(23,5): error TS2322: Type 'StrNum' is not assignable to type '[number]'. - Types of property '0' are incompatible. - Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(24,5): error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[number]'. - Types of property '0' are incompatible. - Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(25,5): error TS2322: Type '[string, number]' is not assignable to type '[string]'. - Types of property 'pop' are incompatible. - Type '() => string | number' is not assignable to type '() => string'. - Type 'string | number' is not assignable to type 'string'. - Type 'number' is not assignable to type 'string'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(26,5): error TS2322: Type 'StrNum' is not assignable to type '[string]'. - Types of property 'pop' are incompatible. - Type '() => string | number' is not assignable to type '() => string'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(27,5): error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[string]'. - Property 'length' is missing in type '{ 0: string; 1: number; }'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(28,5): error TS2322: Type '[string, number]' is not assignable to type '[number, string]'. - Types of property '0' are incompatible. - Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(29,5): error TS2322: Type 'StrNum' is not assignable to type '[number, string]'. - Types of property '0' are incompatible. - Type 'string' is not assignable to type 'number'. -tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(30,5): error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[number, string]'. - Types of property '0' are incompatible. - Type 'string' is not assignable to type 'number'. - - -==== tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts (18 errors) ==== - interface StrNum extends Array { - 0: string; - 1: number; - } - - var x: [string, number]; - var y: StrNum - var z: { - 0: string; - 1: number; - } - - var [a, b, c] = x; - ~ -!!! error TS2493: Tuple type '[string, number]' with length '2' cannot be assigned to tuple with length '3'. - var [d, e, f] = y; - ~ -!!! error TS2460: Type 'StrNum' has no property '2'. - var [g, h, i] = z; - ~~~~~~~~~ -!!! error TS2461: Type '{ 0: string; 1: number; }' is not an array type. - var j1: [number, number, number] = x; - ~~ -!!! error TS2322: Type '[string, number]' is not assignable to type '[number, number, number]'. -!!! error TS2322: Types of property '0' are incompatible. -!!! error TS2322: Type 'string' is not assignable to type 'number'. - var j2: [number, number, number] = y; - ~~ -!!! error TS2322: Type 'StrNum' is not assignable to type '[number, number, number]'. -!!! error TS2322: Types of property '0' are incompatible. -!!! error TS2322: Type 'string' is not assignable to type 'number'. - var j3: [number, number, number] = z; - ~~ -!!! error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[number, number, number]'. -!!! error TS2322: Types of property '0' are incompatible. -!!! error TS2322: Type 'string' is not assignable to type 'number'. - var k1: [string, number, number] = x; - ~~ -!!! error TS2322: Type '[string, number]' is not assignable to type '[string, number, number]'. -!!! error TS2322: Property '2' is missing in type '[string, number]'. - var k2: [string, number, number] = y; - ~~ -!!! error TS2322: Type 'StrNum' is not assignable to type '[string, number, number]'. -!!! error TS2322: Property '2' is missing in type 'StrNum'. - var k3: [string, number, number] = z; - ~~ -!!! error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[string, number, number]'. -!!! error TS2322: Property '2' is missing in type '{ 0: string; 1: number; }'. - var l1: [number] = x; - ~~ -!!! error TS2322: Type '[string, number]' is not assignable to type '[number]'. -!!! error TS2322: Types of property '0' are incompatible. -!!! error TS2322: Type 'string' is not assignable to type 'number'. - var l2: [number] = y; - ~~ -!!! error TS2322: Type 'StrNum' is not assignable to type '[number]'. -!!! error TS2322: Types of property '0' are incompatible. -!!! error TS2322: Type 'string' is not assignable to type 'number'. - var l3: [number] = z; - ~~ -!!! error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[number]'. -!!! error TS2322: Types of property '0' are incompatible. -!!! error TS2322: Type 'string' is not assignable to type 'number'. - var m1: [string] = x; - ~~ -!!! error TS2322: Type '[string, number]' is not assignable to type '[string]'. -!!! error TS2322: Types of property 'pop' are incompatible. -!!! error TS2322: Type '() => string | number' is not assignable to type '() => string'. -!!! error TS2322: Type 'string | number' is not assignable to type 'string'. -!!! error TS2322: Type 'number' is not assignable to type 'string'. - var m2: [string] = y; - ~~ -!!! error TS2322: Type 'StrNum' is not assignable to type '[string]'. -!!! error TS2322: Types of property 'pop' are incompatible. -!!! error TS2322: Type '() => string | number' is not assignable to type '() => string'. - var m3: [string] = z; - ~~ -!!! error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[string]'. -!!! error TS2322: Property 'length' is missing in type '{ 0: string; 1: number; }'. - var n1: [number, string] = x; - ~~ -!!! error TS2322: Type '[string, number]' is not assignable to type '[number, string]'. -!!! error TS2322: Types of property '0' are incompatible. -!!! error TS2322: Type 'string' is not assignable to type 'number'. - var n2: [number, string] = y; - ~~ -!!! error TS2322: Type 'StrNum' is not assignable to type '[number, string]'. -!!! error TS2322: Types of property '0' are incompatible. -!!! error TS2322: Type 'string' is not assignable to type 'number'. - var n3: [number, string] = z; - ~~ -!!! error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[number, string]'. -!!! error TS2322: Types of property '0' are incompatible. -!!! error TS2322: Type 'string' is not assignable to type 'number'. - var o1: [string, number] = x; - var o2: [string, number] = y; - var o3: [string, number] = y; +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(13,12): error TS2493: Tuple type '[string, number]' with length '2' cannot be assigned to tuple with length '3'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(14,12): error TS2460: Type 'StrNum' has no property '2'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(15,5): error TS2461: Type '{ 0: string; 1: number; }' is not an array type. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(16,5): error TS2322: Type '[string, number]' is not assignable to type '[number, number, number]'. + Types of property '0' are incompatible. + Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(17,5): error TS2322: Type 'StrNum' is not assignable to type '[number, number, number]'. + Types of property '0' are incompatible. + Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(18,5): error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[number, number, number]'. + Types of property '0' are incompatible. + Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(19,5): error TS2322: Type '[string, number]' is not assignable to type '[string, number, number]'. + Property '2' is missing in type '[string, number]'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(20,5): error TS2322: Type 'StrNum' is not assignable to type '[string, number, number]'. + Property '2' is missing in type 'StrNum'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(21,5): error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[string, number, number]'. + Property '2' is missing in type '{ 0: string; 1: number; }'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(22,5): error TS2322: Type '[string, number]' is not assignable to type '[number]'. + Types of property '0' are incompatible. + Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(23,5): error TS2322: Type 'StrNum' is not assignable to type '[number]'. + Types of property '0' are incompatible. + Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(24,5): error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[number]'. + Types of property '0' are incompatible. + Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(25,5): error TS2322: Type '[string, number]' is not assignable to type '[string]'. + Types of property 'pop' are incompatible. + Type '() => string | number' is not assignable to type '() => string'. + Type 'string | number' is not assignable to type 'string'. + Type 'number' is not assignable to type 'string'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(26,5): error TS2322: Type 'StrNum' is not assignable to type '[string]'. + Types of property 'pop' are incompatible. + Type '() => string | number' is not assignable to type '() => string'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(27,5): error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[string]'. + Property 'length' is missing in type '{ 0: string; 1: number; }'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(28,5): error TS2322: Type '[string, number]' is not assignable to type '[number, string]'. + Types of property '0' are incompatible. + Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(29,5): error TS2322: Type 'StrNum' is not assignable to type '[number, string]'. + Types of property '0' are incompatible. + Type 'string' is not assignable to type 'number'. +tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts(30,5): error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[number, string]'. + Types of property '0' are incompatible. + Type 'string' is not assignable to type 'number'. + + +==== tests/cases/conformance/types/tuple/arityAndOrderCompatibility01.ts (18 errors) ==== + interface StrNum extends Array { + 0: string; + 1: number; + } + + var x: [string, number]; + var y: StrNum + var z: { + 0: string; + 1: number; + } + + var [a, b, c] = x; + ~ +!!! error TS2493: Tuple type '[string, number]' with length '2' cannot be assigned to tuple with length '3'. + var [d, e, f] = y; + ~ +!!! error TS2460: Type 'StrNum' has no property '2'. + var [g, h, i] = z; + ~~~~~~~~~ +!!! error TS2461: Type '{ 0: string; 1: number; }' is not an array type. + var j1: [number, number, number] = x; + ~~ +!!! error TS2322: Type '[string, number]' is not assignable to type '[number, number, number]'. +!!! error TS2322: Types of property '0' are incompatible. +!!! error TS2322: Type 'string' is not assignable to type 'number'. + var j2: [number, number, number] = y; + ~~ +!!! error TS2322: Type 'StrNum' is not assignable to type '[number, number, number]'. +!!! error TS2322: Types of property '0' are incompatible. +!!! error TS2322: Type 'string' is not assignable to type 'number'. + var j3: [number, number, number] = z; + ~~ +!!! error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[number, number, number]'. +!!! error TS2322: Types of property '0' are incompatible. +!!! error TS2322: Type 'string' is not assignable to type 'number'. + var k1: [string, number, number] = x; + ~~ +!!! error TS2322: Type '[string, number]' is not assignable to type '[string, number, number]'. +!!! error TS2322: Property '2' is missing in type '[string, number]'. + var k2: [string, number, number] = y; + ~~ +!!! error TS2322: Type 'StrNum' is not assignable to type '[string, number, number]'. +!!! error TS2322: Property '2' is missing in type 'StrNum'. + var k3: [string, number, number] = z; + ~~ +!!! error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[string, number, number]'. +!!! error TS2322: Property '2' is missing in type '{ 0: string; 1: number; }'. + var l1: [number] = x; + ~~ +!!! error TS2322: Type '[string, number]' is not assignable to type '[number]'. +!!! error TS2322: Types of property '0' are incompatible. +!!! error TS2322: Type 'string' is not assignable to type 'number'. + var l2: [number] = y; + ~~ +!!! error TS2322: Type 'StrNum' is not assignable to type '[number]'. +!!! error TS2322: Types of property '0' are incompatible. +!!! error TS2322: Type 'string' is not assignable to type 'number'. + var l3: [number] = z; + ~~ +!!! error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[number]'. +!!! error TS2322: Types of property '0' are incompatible. +!!! error TS2322: Type 'string' is not assignable to type 'number'. + var m1: [string] = x; + ~~ +!!! error TS2322: Type '[string, number]' is not assignable to type '[string]'. +!!! error TS2322: Types of property 'pop' are incompatible. +!!! error TS2322: Type '() => string | number' is not assignable to type '() => string'. +!!! error TS2322: Type 'string | number' is not assignable to type 'string'. +!!! error TS2322: Type 'number' is not assignable to type 'string'. + var m2: [string] = y; + ~~ +!!! error TS2322: Type 'StrNum' is not assignable to type '[string]'. +!!! error TS2322: Types of property 'pop' are incompatible. +!!! error TS2322: Type '() => string | number' is not assignable to type '() => string'. + var m3: [string] = z; + ~~ +!!! error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[string]'. +!!! error TS2322: Property 'length' is missing in type '{ 0: string; 1: number; }'. + var n1: [number, string] = x; + ~~ +!!! error TS2322: Type '[string, number]' is not assignable to type '[number, string]'. +!!! error TS2322: Types of property '0' are incompatible. +!!! error TS2322: Type 'string' is not assignable to type 'number'. + var n2: [number, string] = y; + ~~ +!!! error TS2322: Type 'StrNum' is not assignable to type '[number, string]'. +!!! error TS2322: Types of property '0' are incompatible. +!!! error TS2322: Type 'string' is not assignable to type 'number'. + var n3: [number, string] = z; + ~~ +!!! error TS2322: Type '{ 0: string; 1: number; }' is not assignable to type '[number, string]'. +!!! error TS2322: Types of property '0' are incompatible. +!!! error TS2322: Type 'string' is not assignable to type 'number'. + var o1: [string, number] = x; + var o2: [string, number] = y; + var o3: [string, number] = y; \ No newline at end of file diff --git a/tests/baselines/reference/arityAndOrderCompatibility01.js b/tests/baselines/reference/arityAndOrderCompatibility01.js index 5b88697fd4f8e..2eb1bcf8bd8a0 100644 --- a/tests/baselines/reference/arityAndOrderCompatibility01.js +++ b/tests/baselines/reference/arityAndOrderCompatibility01.js @@ -1,4 +1,4 @@ -//// [arityAndOrderCompatibility01.ts] +//// [arityAndOrderCompatibility01.ts] interface StrNum extends Array { 0: string; 1: number; @@ -32,30 +32,30 @@ var n3: [number, string] = z; var o1: [string, number] = x; var o2: [string, number] = y; var o3: [string, number] = y; - - -//// [arityAndOrderCompatibility01.js] -var x; -var y; -var z; -var a = x[0], b = x[1], c = x[2]; -var d = y[0], e = y[1], f = y[2]; -var g = z[0], h = z[1], i = z[2]; -var j1 = x; -var j2 = y; -var j3 = z; -var k1 = x; -var k2 = y; -var k3 = z; -var l1 = x; -var l2 = y; -var l3 = z; -var m1 = x; -var m2 = y; -var m3 = z; -var n1 = x; -var n2 = y; -var n3 = z; -var o1 = x; -var o2 = y; -var o3 = y; + + +//// [arityAndOrderCompatibility01.js] +var x; +var y; +var z; +var a = x[0], b = x[1], c = x[2]; +var d = y[0], e = y[1], f = y[2]; +var g = z[0], h = z[1], i = z[2]; +var j1 = x; +var j2 = y; +var j3 = z; +var k1 = x; +var k2 = y; +var k3 = z; +var l1 = x; +var l2 = y; +var l3 = z; +var m1 = x; +var m2 = y; +var m3 = z; +var n1 = x; +var n2 = y; +var n3 = z; +var o1 = x; +var o2 = y; +var o3 = y; diff --git a/tests/baselines/reference/downlevelLetConst16.errors.txt b/tests/baselines/reference/downlevelLetConst16.errors.txt new file mode 100644 index 0000000000000..94c53360b8743 --- /dev/null +++ b/tests/baselines/reference/downlevelLetConst16.errors.txt @@ -0,0 +1,242 @@ +tests/cases/compiler/downlevelLetConst16.ts(195,14): error TS2461: Type 'undefined' is not an array type. +tests/cases/compiler/downlevelLetConst16.ts(202,15): error TS2459: Type 'undefined' has no property 'a' and no string index signature. +tests/cases/compiler/downlevelLetConst16.ts(216,16): error TS2461: Type 'undefined' is not an array type. +tests/cases/compiler/downlevelLetConst16.ts(223,17): error TS2459: Type 'undefined' has no property 'a' and no string index signature. + + +==== tests/cases/compiler/downlevelLetConst16.ts (4 errors) ==== + 'use strict' + + declare function use(a: any); + + var x = 10; + var y; + var z; + use(x); + use(y); + use(z); + function foo1() { + let x = 1; + use(x); + let [y] = [1]; + use(y); + let {a: z} = {a: 1}; + use(z); + } + + function foo2() { + { + let x = 1; + use(x); + let [y] = [1]; + use(y); + let {a: z} = { a: 1 }; + use(z); + } + use(x); + } + + class A { + m1() { + let x = 1; + use(x); + let [y] = [1]; + use(y); + let {a: z} = { a: 1 }; + use(z); + } + m2() { + { + let x = 1; + use(x); + let [y] = [1]; + use(y); + let {a: z} = { a: 1 }; + use(z); + } + use(x); + } + + } + + class B { + m1() { + const x = 1; + use(x); + const [y] = [1]; + use(y); + const {a: z} = { a: 1 }; + use(z); + + } + m2() { + { + const x = 1; + use(x); + const [y] = [1]; + use(y); + const {a: z} = { a: 1 }; + use(z); + + } + use(x); + } + } + + function bar1() { + const x = 1; + use(x); + const [y] = [1]; + use(y); + const {a: z} = { a: 1 }; + use(z); + } + + function bar2() { + { + const x = 1; + use(x); + const [y] = [1]; + use(y); + const {a: z} = { a: 1 }; + use(z); + + } + use(x); + } + + module M1 { + let x = 1; + use(x); + let [y] = [1]; + use(y); + let {a: z} = { a: 1 }; + use(z); + } + + module M2 { + { + let x = 1; + use(x); + let [y] = [1]; + use(y); + let {a: z} = { a: 1 }; + use(z); + } + use(x); + } + + module M3 { + const x = 1; + use(x); + const [y] = [1]; + use(y); + const {a: z} = { a: 1 }; + use(z); + + } + + module M4 { + { + const x = 1; + use(x); + const [y] = [1]; + use(y); + const {a: z} = { a: 1 }; + use(z); + + } + use(x); + use(y); + use(z); + } + + function foo3() { + for (let x; ;) { + use(x); + } + for (let [y] = []; ;) { + use(y); + } + for (let {a: z} = {a: 1}; ;) { + use(z); + } + use(x); + } + + function foo4() { + for (const x = 1; ;) { + use(x); + } + for (const [y] = []; ;) { + use(y); + } + for (const {a: z} = { a: 1 }; ;) { + use(z); + } + use(x); + } + + function foo5() { + for (let x in []) { + use(x); + } + use(x); + } + + function foo6() { + for (const x in []) { + use(x); + } + use(x); + } + + function foo7() { + for (let x of []) { + use(x); + } + use(x); + } + + function foo8() { + for (let [x] of []) { + ~~~ +!!! error TS2461: Type 'undefined' is not an array type. + use(x); + } + use(x); + } + + function foo9() { + for (let {a: x} of []) { + ~ +!!! error TS2459: Type 'undefined' has no property 'a' and no string index signature. + use(x); + } + use(x); + } + + function foo10() { + for (const x of []) { + use(x); + } + use(x); + } + + function foo11() { + for (const [x] of []) { + ~~~ +!!! error TS2461: Type 'undefined' is not an array type. + use(x); + } + use(x); + } + + function foo12() { + for (const {a: x} of []) { + ~ +!!! error TS2459: Type 'undefined' has no property 'a' and no string index signature. + use(x); + } + use(x); + } \ No newline at end of file diff --git a/tests/baselines/reference/downlevelLetConst16.types b/tests/baselines/reference/downlevelLetConst16.types deleted file mode 100644 index a9a11507c30c7..0000000000000 --- a/tests/baselines/reference/downlevelLetConst16.types +++ /dev/null @@ -1,686 +0,0 @@ -=== tests/cases/compiler/downlevelLetConst16.ts === -'use strict' - -declare function use(a: any); ->use : (a: any) => any ->a : any - -var x = 10; ->x : number - -var y; ->y : any - -var z; ->z : any - -use(x); ->use(x) : any ->use : (a: any) => any ->x : number - -use(y); ->use(y) : any ->use : (a: any) => any ->y : any - -use(z); ->use(z) : any ->use : (a: any) => any ->z : any - -function foo1() { ->foo1 : () => void - - let x = 1; ->x : number - - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - - let [y] = [1]; ->y : number ->[1] : [number] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : number - - let {a: z} = {a: 1}; ->a : unknown ->z : number ->{a: 1} : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number -} - -function foo2() { ->foo2 : () => void - { - let x = 1; ->x : number - - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - - let [y] = [1]; ->y : number ->[1] : [number] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : number - - let {a: z} = { a: 1 }; ->a : unknown ->z : number ->{ a: 1 } : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number -} - -class A { ->A : A - - m1() { ->m1 : () => void - - let x = 1; ->x : number - - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - - let [y] = [1]; ->y : number ->[1] : [number] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : number - - let {a: z} = { a: 1 }; ->a : unknown ->z : number ->{ a: 1 } : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number - } - m2() { ->m2 : () => void - { - let x = 1; ->x : number - - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - - let [y] = [1]; ->y : number ->[1] : [number] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : number - - let {a: z} = { a: 1 }; ->a : unknown ->z : number ->{ a: 1 } : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - } - -} - -class B { ->B : B - - m1() { ->m1 : () => void - - const x = 1; ->x : number - - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - - const [y] = [1]; ->y : number ->[1] : [number] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : number - - const {a: z} = { a: 1 }; ->a : unknown ->z : number ->{ a: 1 } : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number - - } - m2() { ->m2 : () => void - { - const x = 1; ->x : number - - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - - const [y] = [1]; ->y : number ->[1] : [number] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : number - - const {a: z} = { a: 1 }; ->a : unknown ->z : number ->{ a: 1 } : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number - - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - } -} - -function bar1() { ->bar1 : () => void - - const x = 1; ->x : number - - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - - const [y] = [1]; ->y : number ->[1] : [number] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : number - - const {a: z} = { a: 1 }; ->a : unknown ->z : number ->{ a: 1 } : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number -} - -function bar2() { ->bar2 : () => void - { - const x = 1; ->x : number - - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - - const [y] = [1]; ->y : number ->[1] : [number] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : number - - const {a: z} = { a: 1 }; ->a : unknown ->z : number ->{ a: 1 } : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number - - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number -} - -module M1 { ->M1 : typeof M1 - - let x = 1; ->x : number - - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - - let [y] = [1]; ->y : number ->[1] : [number] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : number - - let {a: z} = { a: 1 }; ->a : unknown ->z : number ->{ a: 1 } : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number -} - -module M2 { ->M2 : typeof M2 - { - let x = 1; ->x : number - - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - - let [y] = [1]; ->y : number ->[1] : [number] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : number - - let {a: z} = { a: 1 }; ->a : unknown ->z : number ->{ a: 1 } : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number -} - -module M3 { ->M3 : typeof M3 - - const x = 1; ->x : number - - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - - const [y] = [1]; ->y : number ->[1] : [number] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : number - - const {a: z} = { a: 1 }; ->a : unknown ->z : number ->{ a: 1 } : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number - -} - -module M4 { ->M4 : typeof M4 - { - const x = 1; ->x : number - - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - - const [y] = [1]; ->y : number ->[1] : [number] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : number - - const {a: z} = { a: 1 }; ->a : unknown ->z : number ->{ a: 1 } : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number - - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - - use(y); ->use(y) : any ->use : (a: any) => any ->y : any - - use(z); ->use(z) : any ->use : (a: any) => any ->z : any -} - -function foo3() { ->foo3 : () => void - - for (let x; ;) { ->x : any - - use(x); ->use(x) : any ->use : (a: any) => any ->x : any - } - for (let [y] = []; ;) { ->y : any ->[] : undefined[] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : any - } - for (let {a: z} = {a: 1}; ;) { ->a : unknown ->z : number ->{a: 1} : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number -} - -function foo4() { ->foo4 : () => void - - for (const x = 1; ;) { ->x : number - - use(x); ->use(x) : any ->use : (a: any) => any ->x : number - } - for (const [y] = []; ;) { ->y : any ->[] : undefined[] - - use(y); ->use(y) : any ->use : (a: any) => any ->y : any - } - for (const {a: z} = { a: 1 }; ;) { ->a : unknown ->z : number ->{ a: 1 } : { a: number; } ->a : number - - use(z); ->use(z) : any ->use : (a: any) => any ->z : number - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number -} - -function foo5() { ->foo5 : () => void - - for (let x in []) { ->x : any ->[] : undefined[] - - use(x); ->use(x) : any ->use : (a: any) => any ->x : any - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number -} - -function foo6() { ->foo6 : () => void - - for (const x in []) { ->x : any ->[] : undefined[] - - use(x); ->use(x) : any ->use : (a: any) => any ->x : any - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number -} - -function foo7() { ->foo7 : () => void - - for (let x of []) { ->x : any ->[] : undefined[] - - use(x); ->use(x) : any ->use : (a: any) => any ->x : any - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number -} - -function foo8() { ->foo8 : () => void - - for (let [x] of []) { ->x : any ->[] : undefined[] - - use(x); ->use(x) : any ->use : (a: any) => any ->x : any - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number -} - -function foo9() { ->foo9 : () => void - - for (let {a: x} of []) { ->a : unknown ->x : any ->[] : undefined[] - - use(x); ->use(x) : any ->use : (a: any) => any ->x : any - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number -} - -function foo10() { ->foo10 : () => void - - for (const x of []) { ->x : any ->[] : undefined[] - - use(x); ->use(x) : any ->use : (a: any) => any ->x : any - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number -} - -function foo11() { ->foo11 : () => void - - for (const [x] of []) { ->x : any ->[] : undefined[] - - use(x); ->use(x) : any ->use : (a: any) => any ->x : any - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number -} - -function foo12() { ->foo12 : () => void - - for (const {a: x} of []) { ->a : unknown ->x : any ->[] : undefined[] - - use(x); ->use(x) : any ->use : (a: any) => any ->x : any - } - use(x); ->use(x) : any ->use : (a: any) => any ->x : number -} diff --git a/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt b/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt index f3034cd2c276b..d8e186b4d5757 100644 --- a/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement1.d.errors.txt @@ -1,8 +1,11 @@ tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts(1,1): error TS1036: Statements are not allowed in ambient contexts. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts(1,15): error TS2304: Cannot find name 'e'. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts (1 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement1.d.ts (2 errors) ==== for (var i of e) { ~~~ !!! error TS1036: Statements are not allowed in ambient contexts. + ~ +!!! error TS2304: Cannot find name 'e'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement10.errors.txt b/tests/baselines/reference/parserES5ForOfStatement10.errors.txt index 5cee7472d24a1..e0ea8928be19b 100644 --- a/tests/baselines/reference/parserES5ForOfStatement10.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement10.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts(1,17): error TS2304: Cannot find name 'X'. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement10.ts (1 errors) ==== for (const v of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement11.errors.txt b/tests/baselines/reference/parserES5ForOfStatement11.errors.txt index 79b16ed1ad66c..098d895e6c30a 100644 --- a/tests/baselines/reference/parserES5ForOfStatement11.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement11.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts(1,22): error TS2304: Cannot find name 'X'. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement11.ts (1 errors) ==== for (const [a, b] of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement12.errors.txt b/tests/baselines/reference/parserES5ForOfStatement12.errors.txt index cdb6db690cf9b..6391679981057 100644 --- a/tests/baselines/reference/parserES5ForOfStatement12.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement12.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts(1,22): error TS2304: Cannot find name 'X'. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement12.ts (1 errors) ==== for (const {a, b} of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement13.errors.txt b/tests/baselines/reference/parserES5ForOfStatement13.errors.txt index 9d97fd9e24916..e197c0c42ee21 100644 --- a/tests/baselines/reference/parserES5ForOfStatement13.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement13.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts(1,20): error TS2304: Cannot find name 'X'. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement13.ts (1 errors) ==== for (let {a, b} of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement14.errors.txt b/tests/baselines/reference/parserES5ForOfStatement14.errors.txt index 303439ec44779..f48a17cbc4302 100644 --- a/tests/baselines/reference/parserES5ForOfStatement14.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement14.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts(1,20): error TS2304: Cannot find name 'X'. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement14.ts (1 errors) ==== for (let [a, b] of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement15.errors.txt b/tests/baselines/reference/parserES5ForOfStatement15.errors.txt index f0eab288fa7ea..dd4d61c420b58 100644 --- a/tests/baselines/reference/parserES5ForOfStatement15.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement15.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts(1,20): error TS2304: Cannot find name 'X'. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement15.ts (1 errors) ==== for (var [a, b] of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement16.errors.txt b/tests/baselines/reference/parserES5ForOfStatement16.errors.txt index b9248140f3302..3879fb64e7091 100644 --- a/tests/baselines/reference/parserES5ForOfStatement16.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement16.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts(1,20): error TS2304: Cannot find name 'X'. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement16.ts (1 errors) ==== for (var {a, b} of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement3.errors.txt b/tests/baselines/reference/parserES5ForOfStatement3.errors.txt index a976d9c0d54cf..7388676a703df 100644 --- a/tests/baselines/reference/parserES5ForOfStatement3.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement3.errors.txt @@ -1,8 +1,11 @@ tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts(1,13): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts(1,18): error TS2304: Cannot find name 'X'. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts (1 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement3.ts (2 errors) ==== for (var a, b of X) { ~ !!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement4.errors.txt b/tests/baselines/reference/parserES5ForOfStatement4.errors.txt index e2b38b56be5f7..8a0d7abf0d0fc 100644 --- a/tests/baselines/reference/parserES5ForOfStatement4.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement4.errors.txt @@ -1,8 +1,11 @@ tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts(1,10): error TS1190: The variable declaration of a 'for...of' statement cannot have an initializer. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts(1,19): error TS2304: Cannot find name 'X'. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts (1 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement4.ts (2 errors) ==== for (var a = 1 of X) { ~ !!! error TS1190: The variable declaration of a 'for...of' statement cannot have an initializer. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement5.errors.txt b/tests/baselines/reference/parserES5ForOfStatement5.errors.txt index 0e88ce6cf363b..43c9161156a84 100644 --- a/tests/baselines/reference/parserES5ForOfStatement5.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement5.errors.txt @@ -1,8 +1,11 @@ tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts(1,10): error TS2483: The left-hand side of a 'for...of' statement cannot use a type annotation. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts(1,23): error TS2304: Cannot find name 'X'. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts (1 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement5.ts (2 errors) ==== for (var a: number of X) { ~ !!! error TS2483: The left-hand side of a 'for...of' statement cannot use a type annotation. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement6.errors.txt b/tests/baselines/reference/parserES5ForOfStatement6.errors.txt index da76589190d6d..8ddf2273ba87b 100644 --- a/tests/baselines/reference/parserES5ForOfStatement6.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement6.errors.txt @@ -1,8 +1,11 @@ tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts(1,17): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts(1,26): error TS2304: Cannot find name 'X'. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts (1 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement6.ts (2 errors) ==== for (var a = 1, b = 2 of X) { ~ !!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement7.errors.txt b/tests/baselines/reference/parserES5ForOfStatement7.errors.txt index ced399ca103d2..6bf7f3001834c 100644 --- a/tests/baselines/reference/parserES5ForOfStatement7.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement7.errors.txt @@ -1,8 +1,11 @@ tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts(1,25): error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts(1,43): error TS2304: Cannot find name 'X'. -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts (1 errors) ==== +==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement7.ts (2 errors) ==== for (var a: number = 1, b: string = "" of X) { ~ !!! error TS1188: Only a single variable declaration is allowed in a 'for...of' statement. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement8.errors.txt b/tests/baselines/reference/parserES5ForOfStatement8.errors.txt index 829fea57e6ecd..53b263ad6e1ab 100644 --- a/tests/baselines/reference/parserES5ForOfStatement8.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement8.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts(1,15): error TS2304: Cannot find name 'X'. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement8.ts (1 errors) ==== for (var v of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement9.errors.txt b/tests/baselines/reference/parserES5ForOfStatement9.errors.txt index 4cf082b4f15fc..869cdfdf64725 100644 --- a/tests/baselines/reference/parserES5ForOfStatement9.errors.txt +++ b/tests/baselines/reference/parserES5ForOfStatement9.errors.txt @@ -1,8 +1,8 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. +tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts(1,15): error TS2304: Cannot find name 'X'. ==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement9.ts (1 errors) ==== for (let v of X) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. + ~ +!!! error TS2304: Cannot find name 'X'. } \ No newline at end of file From 32aee67c4fa63246d1e9dad61e6d83bc15503142 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Tue, 10 Mar 2015 17:36:17 -0700 Subject: [PATCH 3/8] Change a test to be more interesting --- tests/baselines/reference/ES5For-of12.errors.txt | 8 ++++---- tests/baselines/reference/ES5For-of12.js | 8 ++++++-- .../statements/for-ofStatements/ES5For-of12.ts | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/tests/baselines/reference/ES5For-of12.errors.txt b/tests/baselines/reference/ES5For-of12.errors.txt index 55144f549a0b1..02ed4c335a6e7 100644 --- a/tests/baselines/reference/ES5For-of12.errors.txt +++ b/tests/baselines/reference/ES5For-of12.errors.txt @@ -1,7 +1,7 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of12.ts(1,6): error TS2461: Type 'undefined' is not an array type. +tests/cases/conformance/statements/for-ofStatements/ES5For-of12.ts(1,7): error TS2364: Invalid left-hand side of assignment expression. ==== tests/cases/conformance/statements/for-ofStatements/ES5For-of12.ts (1 errors) ==== - for ([""] of []) { } - ~~~~ -!!! error TS2461: Type 'undefined' is not an array type. \ No newline at end of file + for ([""] of [[""]]) { } + ~~ +!!! error TS2364: Invalid left-hand side of assignment expression. \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of12.js b/tests/baselines/reference/ES5For-of12.js index c3665e8b584e4..7a5534f4aa145 100644 --- a/tests/baselines/reference/ES5For-of12.js +++ b/tests/baselines/reference/ES5For-of12.js @@ -1,7 +1,11 @@ //// [ES5For-of12.ts] -for ([""] of []) { } +for ([""] of [[""]]) { } //// [ES5For-of12.js] -for (var _i = 0, _a = []; _i < _a.length; _i++) { +for (var _i = 0, _a = [ + [ + "" + ] +]; _i < _a.length; _i++) { "" = _a[_i][0]; } diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-of12.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-of12.ts index 5fbfa31df5f4e..eb3017296aad5 100644 --- a/tests/cases/conformance/statements/for-ofStatements/ES5For-of12.ts +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-of12.ts @@ -1 +1 @@ -for ([""] of []) { } \ No newline at end of file +for ([""] of [[""]]) { } \ No newline at end of file From 29cbe9d4bae21907ddfa3e38f92fab5f503cd319 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 11 Mar 2015 16:33:19 -0700 Subject: [PATCH 4/8] Remove unhelpful comment --- src/compiler/checker.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 414a8ce17fa33..f977cdd1f16e4 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -10961,7 +10961,6 @@ module ts { } function isUnknownIdentifier(location: Node, name: string): boolean { - // Do not call resolveName on a synthesized node! Debug.assert(!nodeIsSynthesized(location), "isUnknownIdentifier called with a synthesized location"); return !resolveName(location, name, SymbolFlags.Value, /*nodeNotFoundMessage*/ undefined, /*nameArg*/ undefined) && !hasProperty(getGeneratedNamesForSourceFile(getSourceFile(location)), name); From 03176d33efda5ba6dfe7c57e62926a6324cb81df Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 11 Mar 2015 16:33:38 -0700 Subject: [PATCH 5/8] Add tests for downlevel for-of type checking --- .../reference/ES3For-ofTypeCheck1.errors.txt | 7 ++++ .../reference/ES3For-ofTypeCheck1.js | 7 ++++ .../reference/ES3For-ofTypeCheck2.js | 9 +++++ .../reference/ES3For-ofTypeCheck2.types | 5 +++ .../reference/ES3For-ofTypeCheck4.errors.txt | 8 +++++ .../reference/ES3For-ofTypeCheck4.js | 9 +++++ .../reference/ES3For-ofTypeCheck6.js | 9 +++++ .../reference/ES3For-ofTypeCheck6.types | 8 +++++ .../reference/ES5For-ofTypeCheck1.js | 7 ++++ .../reference/ES5For-ofTypeCheck1.types | 4 +++ .../reference/ES5For-ofTypeCheck10.errors.txt | 23 ++++++++++++ .../reference/ES5For-ofTypeCheck10.js | 35 +++++++++++++++++++ .../reference/ES5For-ofTypeCheck11.errors.txt | 11 ++++++ .../reference/ES5For-ofTypeCheck11.js | 11 ++++++ .../reference/ES5For-ofTypeCheck2.js | 9 +++++ .../reference/ES5For-ofTypeCheck2.types | 5 +++ .../reference/ES5For-ofTypeCheck3.js | 12 +++++++ .../reference/ES5For-ofTypeCheck3.types | 9 +++++ .../reference/ES5For-ofTypeCheck4.js | 9 +++++ .../reference/ES5For-ofTypeCheck4.types | 8 +++++ .../reference/ES5For-ofTypeCheck5.js | 9 +++++ .../reference/ES5For-ofTypeCheck5.types | 8 +++++ .../reference/ES5For-ofTypeCheck6.js | 9 +++++ .../reference/ES5For-ofTypeCheck6.types | 8 +++++ .../reference/ES5For-ofTypeCheck7.errors.txt | 8 +++++ .../reference/ES5For-ofTypeCheck7.js | 9 +++++ .../reference/ES5For-ofTypeCheck8.errors.txt | 11 ++++++ .../reference/ES5For-ofTypeCheck8.js | 11 ++++++ .../reference/ES5For-ofTypeCheck9.errors.txt | 8 +++++ .../reference/ES5For-ofTypeCheck9.js | 9 +++++ .../for-ofStatements/ES3For-ofTypeCheck1.ts | 2 ++ .../for-ofStatements/ES3For-ofTypeCheck2.ts | 2 ++ .../for-ofStatements/ES3For-ofTypeCheck4.ts | 3 ++ .../for-ofStatements/ES3For-ofTypeCheck6.ts | 3 ++ .../for-ofStatements/ES5For-ofTypeCheck1.ts | 2 ++ .../for-ofStatements/ES5For-ofTypeCheck10.ts | 15 ++++++++ .../for-ofStatements/ES5For-ofTypeCheck11.ts | 4 +++ .../for-ofStatements/ES5For-ofTypeCheck2.ts | 2 ++ .../for-ofStatements/ES5For-ofTypeCheck3.ts | 3 ++ .../for-ofStatements/ES5For-ofTypeCheck4.ts | 3 ++ .../for-ofStatements/ES5For-ofTypeCheck5.ts | 3 ++ .../for-ofStatements/ES5For-ofTypeCheck6.ts | 3 ++ .../for-ofStatements/ES5For-ofTypeCheck7.ts | 3 ++ .../for-ofStatements/ES5For-ofTypeCheck8.ts | 4 +++ .../for-ofStatements/ES5For-ofTypeCheck9.ts | 3 ++ 45 files changed, 350 insertions(+) create mode 100644 tests/baselines/reference/ES3For-ofTypeCheck1.errors.txt create mode 100644 tests/baselines/reference/ES3For-ofTypeCheck1.js create mode 100644 tests/baselines/reference/ES3For-ofTypeCheck2.js create mode 100644 tests/baselines/reference/ES3For-ofTypeCheck2.types create mode 100644 tests/baselines/reference/ES3For-ofTypeCheck4.errors.txt create mode 100644 tests/baselines/reference/ES3For-ofTypeCheck4.js create mode 100644 tests/baselines/reference/ES3For-ofTypeCheck6.js create mode 100644 tests/baselines/reference/ES3For-ofTypeCheck6.types create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck1.js create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck1.types create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck10.errors.txt create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck10.js create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck11.errors.txt create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck11.js create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck2.js create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck2.types create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck3.js create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck3.types create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck4.js create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck4.types create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck5.js create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck5.types create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck6.js create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck6.types create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck7.errors.txt create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck7.js create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck8.errors.txt create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck8.js create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck9.errors.txt create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck9.js create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck1.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck2.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck4.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck6.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck1.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck10.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck11.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck2.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck3.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck4.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck5.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck6.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck7.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck8.ts create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck9.ts diff --git a/tests/baselines/reference/ES3For-ofTypeCheck1.errors.txt b/tests/baselines/reference/ES3For-ofTypeCheck1.errors.txt new file mode 100644 index 0000000000000..6437cfbc73d47 --- /dev/null +++ b/tests/baselines/reference/ES3For-ofTypeCheck1.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck1.ts(1,15): error TS2494: Using a string in a 'for...of' statement is only supported in ECMAScript 5 and higher. + + +==== tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck1.ts (1 errors) ==== + for (var v of "") { } + ~~ +!!! error TS2494: Using a string in a 'for...of' statement is only supported in ECMAScript 5 and higher. \ No newline at end of file diff --git a/tests/baselines/reference/ES3For-ofTypeCheck1.js b/tests/baselines/reference/ES3For-ofTypeCheck1.js new file mode 100644 index 0000000000000..19efa96808b2b --- /dev/null +++ b/tests/baselines/reference/ES3For-ofTypeCheck1.js @@ -0,0 +1,7 @@ +//// [ES3For-ofTypeCheck1.ts] +for (var v of "") { } + +//// [ES3For-ofTypeCheck1.js] +for (var _i = 0, _a = ""; _i < _a.length; _i++) { + var v = _a[_i]; +} diff --git a/tests/baselines/reference/ES3For-ofTypeCheck2.js b/tests/baselines/reference/ES3For-ofTypeCheck2.js new file mode 100644 index 0000000000000..952eade6cfbb6 --- /dev/null +++ b/tests/baselines/reference/ES3For-ofTypeCheck2.js @@ -0,0 +1,9 @@ +//// [ES3For-ofTypeCheck2.ts] +for (var v of [true]) { } + +//// [ES3For-ofTypeCheck2.js] +for (var _i = 0, _a = [ + true +]; _i < _a.length; _i++) { + var v = _a[_i]; +} diff --git a/tests/baselines/reference/ES3For-ofTypeCheck2.types b/tests/baselines/reference/ES3For-ofTypeCheck2.types new file mode 100644 index 0000000000000..f5ca0ab17e86f --- /dev/null +++ b/tests/baselines/reference/ES3For-ofTypeCheck2.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck2.ts === +for (var v of [true]) { } +>v : boolean +>[true] : boolean[] + diff --git a/tests/baselines/reference/ES3For-ofTypeCheck4.errors.txt b/tests/baselines/reference/ES3For-ofTypeCheck4.errors.txt new file mode 100644 index 0000000000000..80e60008da4cc --- /dev/null +++ b/tests/baselines/reference/ES3For-ofTypeCheck4.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck4.ts(2,17): error TS2494: Using a string in a 'for...of' statement is only supported in ECMAScript 5 and higher. + + +==== tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck4.ts (1 errors) ==== + var union: string | string[]; + for (const v of union) { } + ~~~~~ +!!! error TS2494: Using a string in a 'for...of' statement is only supported in ECMAScript 5 and higher. \ No newline at end of file diff --git a/tests/baselines/reference/ES3For-ofTypeCheck4.js b/tests/baselines/reference/ES3For-ofTypeCheck4.js new file mode 100644 index 0000000000000..7386a1967eb98 --- /dev/null +++ b/tests/baselines/reference/ES3For-ofTypeCheck4.js @@ -0,0 +1,9 @@ +//// [ES3For-ofTypeCheck4.ts] +var union: string | string[]; +for (const v of union) { } + +//// [ES3For-ofTypeCheck4.js] +var union; +for (var _i = 0; _i < union.length; _i++) { + var v = union[_i]; +} diff --git a/tests/baselines/reference/ES3For-ofTypeCheck6.js b/tests/baselines/reference/ES3For-ofTypeCheck6.js new file mode 100644 index 0000000000000..ddc11808b1885 --- /dev/null +++ b/tests/baselines/reference/ES3For-ofTypeCheck6.js @@ -0,0 +1,9 @@ +//// [ES3For-ofTypeCheck6.ts] +var union: string[] | number[]; +for (var v of union) { } + +//// [ES3For-ofTypeCheck6.js] +var union; +for (var _i = 0; _i < union.length; _i++) { + var v = union[_i]; +} diff --git a/tests/baselines/reference/ES3For-ofTypeCheck6.types b/tests/baselines/reference/ES3For-ofTypeCheck6.types new file mode 100644 index 0000000000000..d7e6045b02954 --- /dev/null +++ b/tests/baselines/reference/ES3For-ofTypeCheck6.types @@ -0,0 +1,8 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck6.ts === +var union: string[] | number[]; +>union : string[] | number[] + +for (var v of union) { } +>v : string | number +>union : string[] | number[] + diff --git a/tests/baselines/reference/ES5For-ofTypeCheck1.js b/tests/baselines/reference/ES5For-ofTypeCheck1.js new file mode 100644 index 0000000000000..f1522e512b60d --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck1.js @@ -0,0 +1,7 @@ +//// [ES5For-ofTypeCheck1.ts] +for (var v of "") { } + +//// [ES5For-ofTypeCheck1.js] +for (var _i = 0, _a = ""; _i < _a.length; _i++) { + var v = _a[_i]; +} diff --git a/tests/baselines/reference/ES5For-ofTypeCheck1.types b/tests/baselines/reference/ES5For-ofTypeCheck1.types new file mode 100644 index 0000000000000..4da0ecc0e36b8 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck1.types @@ -0,0 +1,4 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck1.ts === +for (var v of "") { } +>v : string + diff --git a/tests/baselines/reference/ES5For-ofTypeCheck10.errors.txt b/tests/baselines/reference/ES5For-ofTypeCheck10.errors.txt new file mode 100644 index 0000000000000..8725fa62471d5 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck10.errors.txt @@ -0,0 +1,23 @@ +tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck10.ts(1,15): error TS2461: Type 'StringIterator' is not an array type. +tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck10.ts(11,6): error TS2304: Cannot find name 'Symbol'. + + +==== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck10.ts (2 errors) ==== + for (var v of new StringIterator) { } + ~~~~~~~~~~~~~~~~~~ +!!! error TS2461: Type 'StringIterator' is not an array type. + + // In ES3/5, you cannot for...of over an arbitrary iterable. + class StringIterator { + next() { + return { + done: true, + value: "" + }; + } + [Symbol.iterator]() { + ~~~~~~ +!!! error TS2304: Cannot find name 'Symbol'. + return this; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-ofTypeCheck10.js b/tests/baselines/reference/ES5For-ofTypeCheck10.js new file mode 100644 index 0000000000000..ffef1fde8f8f9 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck10.js @@ -0,0 +1,35 @@ +//// [ES5For-ofTypeCheck10.ts] +for (var v of new StringIterator) { } + +// In ES3/5, you cannot for...of over an arbitrary iterable. +class StringIterator { + next() { + return { + done: true, + value: "" + }; + } + [Symbol.iterator]() { + return this; + } +} + +//// [ES5For-ofTypeCheck10.js] +for (var _i = 0, _a = new StringIterator; _i < _a.length; _i++) { + var v = _a[_i]; +} +// In ES3/5, you cannot for...of over an arbitrary iterable. +var StringIterator = (function () { + function StringIterator() { + } + StringIterator.prototype.next = function () { + return { + done: true, + value: "" + }; + }; + StringIterator.prototype[Symbol.iterator] = function () { + return this; + }; + return StringIterator; +})(); diff --git a/tests/baselines/reference/ES5For-ofTypeCheck11.errors.txt b/tests/baselines/reference/ES5For-ofTypeCheck11.errors.txt new file mode 100644 index 0000000000000..635bb09616afa --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck11.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck11.ts(3,6): error TS2322: Type 'string | number' is not assignable to type 'string'. + Type 'number' is not assignable to type 'string'. + + +==== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck11.ts (1 errors) ==== + var union: string | number[]; + var v: string; + for (v of union) { } + ~ +!!! error TS2322: Type 'string | number' is not assignable to type 'string'. +!!! error TS2322: Type 'number' is not assignable to type 'string'. \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-ofTypeCheck11.js b/tests/baselines/reference/ES5For-ofTypeCheck11.js new file mode 100644 index 0000000000000..c0e46a4545256 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck11.js @@ -0,0 +1,11 @@ +//// [ES5For-ofTypeCheck11.ts] +var union: string | number[]; +var v: string; +for (v of union) { } + +//// [ES5For-ofTypeCheck11.js] +var union; +var v; +for (var _i = 0; _i < union.length; _i++) { + v = union[_i]; +} diff --git a/tests/baselines/reference/ES5For-ofTypeCheck2.js b/tests/baselines/reference/ES5For-ofTypeCheck2.js new file mode 100644 index 0000000000000..2c79054affc42 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck2.js @@ -0,0 +1,9 @@ +//// [ES5For-ofTypeCheck2.ts] +for (var v of [true]) { } + +//// [ES5For-ofTypeCheck2.js] +for (var _i = 0, _a = [ + true +]; _i < _a.length; _i++) { + var v = _a[_i]; +} diff --git a/tests/baselines/reference/ES5For-ofTypeCheck2.types b/tests/baselines/reference/ES5For-ofTypeCheck2.types new file mode 100644 index 0000000000000..e6b86ce1d81d1 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck2.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck2.ts === +for (var v of [true]) { } +>v : boolean +>[true] : boolean[] + diff --git a/tests/baselines/reference/ES5For-ofTypeCheck3.js b/tests/baselines/reference/ES5For-ofTypeCheck3.js new file mode 100644 index 0000000000000..b398f04e0ce02 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck3.js @@ -0,0 +1,12 @@ +//// [ES5For-ofTypeCheck3.ts] +var tuple: [string, number] = ["", 0]; +for (var v of tuple) { } + +//// [ES5For-ofTypeCheck3.js] +var tuple = [ + "", + 0 +]; +for (var _i = 0; _i < tuple.length; _i++) { + var v = tuple[_i]; +} diff --git a/tests/baselines/reference/ES5For-ofTypeCheck3.types b/tests/baselines/reference/ES5For-ofTypeCheck3.types new file mode 100644 index 0000000000000..5293634c6c5ac --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck3.types @@ -0,0 +1,9 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck3.ts === +var tuple: [string, number] = ["", 0]; +>tuple : [string, number] +>["", 0] : [string, number] + +for (var v of tuple) { } +>v : string | number +>tuple : [string, number] + diff --git a/tests/baselines/reference/ES5For-ofTypeCheck4.js b/tests/baselines/reference/ES5For-ofTypeCheck4.js new file mode 100644 index 0000000000000..630bc869c5822 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck4.js @@ -0,0 +1,9 @@ +//// [ES5For-ofTypeCheck4.ts] +var union: string | string[]; +for (const v of union) { } + +//// [ES5For-ofTypeCheck4.js] +var union; +for (var _i = 0; _i < union.length; _i++) { + var v = union[_i]; +} diff --git a/tests/baselines/reference/ES5For-ofTypeCheck4.types b/tests/baselines/reference/ES5For-ofTypeCheck4.types new file mode 100644 index 0000000000000..4f5721a06045c --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck4.types @@ -0,0 +1,8 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck4.ts === +var union: string | string[]; +>union : string | string[] + +for (const v of union) { } +>v : string +>union : string | string[] + diff --git a/tests/baselines/reference/ES5For-ofTypeCheck5.js b/tests/baselines/reference/ES5For-ofTypeCheck5.js new file mode 100644 index 0000000000000..2e6b47f779ddd --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck5.js @@ -0,0 +1,9 @@ +//// [ES5For-ofTypeCheck5.ts] +var union: string | number[]; +for (var v of union) { } + +//// [ES5For-ofTypeCheck5.js] +var union; +for (var _i = 0; _i < union.length; _i++) { + var v = union[_i]; +} diff --git a/tests/baselines/reference/ES5For-ofTypeCheck5.types b/tests/baselines/reference/ES5For-ofTypeCheck5.types new file mode 100644 index 0000000000000..ed3d13f3918a7 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck5.types @@ -0,0 +1,8 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck5.ts === +var union: string | number[]; +>union : string | number[] + +for (var v of union) { } +>v : string | number +>union : string | number[] + diff --git a/tests/baselines/reference/ES5For-ofTypeCheck6.js b/tests/baselines/reference/ES5For-ofTypeCheck6.js new file mode 100644 index 0000000000000..9249020b9d40b --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck6.js @@ -0,0 +1,9 @@ +//// [ES5For-ofTypeCheck6.ts] +var union: string[] | number[]; +for (var v of union) { } + +//// [ES5For-ofTypeCheck6.js] +var union; +for (var _i = 0; _i < union.length; _i++) { + var v = union[_i]; +} diff --git a/tests/baselines/reference/ES5For-ofTypeCheck6.types b/tests/baselines/reference/ES5For-ofTypeCheck6.types new file mode 100644 index 0000000000000..87999d9b0ca2e --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck6.types @@ -0,0 +1,8 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck6.ts === +var union: string[] | number[]; +>union : string[] | number[] + +for (var v of union) { } +>v : string | number +>union : string[] | number[] + diff --git a/tests/baselines/reference/ES5For-ofTypeCheck7.errors.txt b/tests/baselines/reference/ES5For-ofTypeCheck7.errors.txt new file mode 100644 index 0000000000000..9006b5a277981 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck7.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck7.ts(2,15): error TS2461: Type 'number' is not an array type. + + +==== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck7.ts (1 errors) ==== + var union: string | number; + for (var v of union) { } + ~~~~~ +!!! error TS2461: Type 'number' is not an array type. \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-ofTypeCheck7.js b/tests/baselines/reference/ES5For-ofTypeCheck7.js new file mode 100644 index 0000000000000..d5b74a247285d --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck7.js @@ -0,0 +1,9 @@ +//// [ES5For-ofTypeCheck7.ts] +var union: string | number; +for (var v of union) { } + +//// [ES5For-ofTypeCheck7.js] +var union; +for (var _i = 0; _i < union.length; _i++) { + var v = union[_i]; +} diff --git a/tests/baselines/reference/ES5For-ofTypeCheck8.errors.txt b/tests/baselines/reference/ES5For-ofTypeCheck8.errors.txt new file mode 100644 index 0000000000000..0cb52dbb21b60 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck8.errors.txt @@ -0,0 +1,11 @@ +tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck8.ts(3,6): error TS2322: Type 'string | number | symbol' is not assignable to type 'symbol'. + Type 'string' is not assignable to type 'symbol'. + + +==== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck8.ts (1 errors) ==== + var union: string | string[]| number[]| symbol[]; + var v: symbol; + for (v of union) { } + ~ +!!! error TS2322: Type 'string | number | symbol' is not assignable to type 'symbol'. +!!! error TS2322: Type 'string' is not assignable to type 'symbol'. \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-ofTypeCheck8.js b/tests/baselines/reference/ES5For-ofTypeCheck8.js new file mode 100644 index 0000000000000..d73aea1cb7b60 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck8.js @@ -0,0 +1,11 @@ +//// [ES5For-ofTypeCheck8.ts] +var union: string | string[]| number[]| symbol[]; +var v: symbol; +for (v of union) { } + +//// [ES5For-ofTypeCheck8.js] +var union; +var v; +for (var _i = 0; _i < union.length; _i++) { + v = union[_i]; +} diff --git a/tests/baselines/reference/ES5For-ofTypeCheck9.errors.txt b/tests/baselines/reference/ES5For-ofTypeCheck9.errors.txt new file mode 100644 index 0000000000000..156eb18880367 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck9.errors.txt @@ -0,0 +1,8 @@ +tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck9.ts(2,15): error TS2461: Type 'number | symbol | string[]' is not an array type. + + +==== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck9.ts (1 errors) ==== + var union: string | string[] | number | symbol; + for (let v of union) { } + ~~~~~ +!!! error TS2461: Type 'number | symbol | string[]' is not an array type. \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-ofTypeCheck9.js b/tests/baselines/reference/ES5For-ofTypeCheck9.js new file mode 100644 index 0000000000000..6c7465d10ec62 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck9.js @@ -0,0 +1,9 @@ +//// [ES5For-ofTypeCheck9.ts] +var union: string | string[] | number | symbol; +for (let v of union) { } + +//// [ES5For-ofTypeCheck9.js] +var union; +for (var _i = 0; _i < union.length; _i++) { + var v = union[_i]; +} diff --git a/tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck1.ts b/tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck1.ts new file mode 100644 index 0000000000000..ec930d826f983 --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck1.ts @@ -0,0 +1,2 @@ +//@target: ES3 +for (var v of "") { } \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck2.ts b/tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck2.ts new file mode 100644 index 0000000000000..d382ef20e4cd6 --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck2.ts @@ -0,0 +1,2 @@ +//@target: ES3 +for (var v of [true]) { } \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck4.ts b/tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck4.ts new file mode 100644 index 0000000000000..b5547b936ae45 --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck4.ts @@ -0,0 +1,3 @@ +//@target: ES3 +var union: string | string[]; +for (const v of union) { } \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck6.ts b/tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck6.ts new file mode 100644 index 0000000000000..6167d78d1796f --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES3For-ofTypeCheck6.ts @@ -0,0 +1,3 @@ +//@target: ES3 +var union: string[] | number[]; +for (var v of union) { } \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck1.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck1.ts new file mode 100644 index 0000000000000..3b27caf3fe919 --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck1.ts @@ -0,0 +1,2 @@ +//@target: ES5 +for (var v of "") { } \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck10.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck10.ts new file mode 100644 index 0000000000000..185641d080416 --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck10.ts @@ -0,0 +1,15 @@ +//@target: ES5 +for (var v of new StringIterator) { } + +// In ES3/5, you cannot for...of over an arbitrary iterable. +class StringIterator { + next() { + return { + done: true, + value: "" + }; + } + [Symbol.iterator]() { + return this; + } +} \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck11.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck11.ts new file mode 100644 index 0000000000000..a39371a4843be --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck11.ts @@ -0,0 +1,4 @@ +//@target: ES5 +var union: string | number[]; +var v: string; +for (v of union) { } \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck2.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck2.ts new file mode 100644 index 0000000000000..2e22731a78a25 --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck2.ts @@ -0,0 +1,2 @@ +//@target: ES5 +for (var v of [true]) { } \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck3.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck3.ts new file mode 100644 index 0000000000000..cc7f09df670d9 --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck3.ts @@ -0,0 +1,3 @@ +//@target: ES5 +var tuple: [string, number] = ["", 0]; +for (var v of tuple) { } \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck4.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck4.ts new file mode 100644 index 0000000000000..dc8388c05760a --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck4.ts @@ -0,0 +1,3 @@ +//@target: ES5 +var union: string | string[]; +for (const v of union) { } \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck5.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck5.ts new file mode 100644 index 0000000000000..f0218bd57f91a --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck5.ts @@ -0,0 +1,3 @@ +//@target: ES5 +var union: string | number[]; +for (var v of union) { } \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck6.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck6.ts new file mode 100644 index 0000000000000..46cc82af9837d --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck6.ts @@ -0,0 +1,3 @@ +//@target: ES5 +var union: string[] | number[]; +for (var v of union) { } \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck7.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck7.ts new file mode 100644 index 0000000000000..4f7dd1c6d3f0f --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck7.ts @@ -0,0 +1,3 @@ +//@target: ES5 +var union: string | number; +for (var v of union) { } \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck8.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck8.ts new file mode 100644 index 0000000000000..2c9f3b63d1db6 --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck8.ts @@ -0,0 +1,4 @@ +//@target: ES5 +var union: string | string[]| number[]| symbol[]; +var v: symbol; +for (v of union) { } \ No newline at end of file diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck9.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck9.ts new file mode 100644 index 0000000000000..3c68f329f0e25 --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck9.ts @@ -0,0 +1,3 @@ +//@target: ES5 +var union: string | string[] | number | symbol; +for (let v of union) { } \ No newline at end of file From 7d2d55e44e539277a9be11b832abb7cf7abdf22b Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Wed, 11 Mar 2015 18:53:04 -0700 Subject: [PATCH 6/8] Rebaseline tests that will be affected by #2308 --- .../reference/ES5For-of17.errors.txt | 13 ----------- tests/baselines/reference/ES5For-of17.types | 22 +++++++++++++++++++ .../parserES5ForOfStatement18.errors.txt | 7 ------ .../reference/parserES5ForOfStatement18.types | 5 +++++ 4 files changed, 27 insertions(+), 20 deletions(-) delete mode 100644 tests/baselines/reference/ES5For-of17.errors.txt create mode 100644 tests/baselines/reference/ES5For-of17.types delete mode 100644 tests/baselines/reference/parserES5ForOfStatement18.errors.txt create mode 100644 tests/baselines/reference/parserES5ForOfStatement18.types diff --git a/tests/baselines/reference/ES5For-of17.errors.txt b/tests/baselines/reference/ES5For-of17.errors.txt deleted file mode 100644 index 05c89874fcf0f..0000000000000 --- a/tests/baselines/reference/ES5For-of17.errors.txt +++ /dev/null @@ -1,13 +0,0 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-of17.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of17.ts (1 errors) ==== - for (let v of []) { - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - v; - for (let v of [v]) { - var x = v; - v++; - } - } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of17.types b/tests/baselines/reference/ES5For-of17.types new file mode 100644 index 0000000000000..4dafdc0599d37 --- /dev/null +++ b/tests/baselines/reference/ES5For-of17.types @@ -0,0 +1,22 @@ +=== tests/cases/conformance/statements/for-ofStatements/ES5For-of17.ts === +for (let v of []) { +>v : any +>[] : undefined[] + + v; +>v : any + + for (let v of [v]) { +>v : any +>[v] : any[] +>v : any + + var x = v; +>x : any +>v : any + + v++; +>v++ : number +>v : any + } +} diff --git a/tests/baselines/reference/parserES5ForOfStatement18.errors.txt b/tests/baselines/reference/parserES5ForOfStatement18.errors.txt deleted file mode 100644 index e123be9c4f717..0000000000000 --- a/tests/baselines/reference/parserES5ForOfStatement18.errors.txt +++ /dev/null @@ -1,7 +0,0 @@ -tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts(1,1): error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. - - -==== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts (1 errors) ==== - for (var of of of) { } - ~~~ -!!! error TS2482: 'for...of' statements are only available when targeting ECMAScript 6 or higher. \ No newline at end of file diff --git a/tests/baselines/reference/parserES5ForOfStatement18.types b/tests/baselines/reference/parserES5ForOfStatement18.types new file mode 100644 index 0000000000000..f9544e39a31d1 --- /dev/null +++ b/tests/baselines/reference/parserES5ForOfStatement18.types @@ -0,0 +1,5 @@ +=== tests/cases/conformance/parser/ecmascript5/Statements/parserES5ForOfStatement18.ts === +for (var of of of) { } +>of : any +>of : any + From 22f80b9582d9c0bf729fed0e936e7a2242633898 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 12 Mar 2015 13:37:08 -0700 Subject: [PATCH 7/8] Adjust baselines after merge --- .../reference/ES5For-of17.errors.txt | 13 +++++++++++ tests/baselines/reference/ES5For-of17.types | 22 ------------------- .../reference/ES5For-of20.errors.txt | 5 ++++- 3 files changed, 17 insertions(+), 23 deletions(-) create mode 100644 tests/baselines/reference/ES5For-of17.errors.txt delete mode 100644 tests/baselines/reference/ES5For-of17.types diff --git a/tests/baselines/reference/ES5For-of17.errors.txt b/tests/baselines/reference/ES5For-of17.errors.txt new file mode 100644 index 0000000000000..3b9ab93a565b7 --- /dev/null +++ b/tests/baselines/reference/ES5For-of17.errors.txt @@ -0,0 +1,13 @@ +tests/cases/conformance/statements/for-ofStatements/ES5For-of17.ts(3,20): error TS2448: Block-scoped variable 'v' used before its declaration. + + +==== tests/cases/conformance/statements/for-ofStatements/ES5For-of17.ts (1 errors) ==== + for (let v of []) { + v; + for (let v of [v]) { + ~ +!!! error TS2448: Block-scoped variable 'v' used before its declaration. + var x = v; + v++; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-of17.types b/tests/baselines/reference/ES5For-of17.types deleted file mode 100644 index 4dafdc0599d37..0000000000000 --- a/tests/baselines/reference/ES5For-of17.types +++ /dev/null @@ -1,22 +0,0 @@ -=== tests/cases/conformance/statements/for-ofStatements/ES5For-of17.ts === -for (let v of []) { ->v : any ->[] : undefined[] - - v; ->v : any - - for (let v of [v]) { ->v : any ->[v] : any[] ->v : any - - var x = v; ->x : any ->v : any - - v++; ->v++ : number ->v : any - } -} diff --git a/tests/baselines/reference/ES5For-of20.errors.txt b/tests/baselines/reference/ES5For-of20.errors.txt index 8150991099615..772d5143a0465 100644 --- a/tests/baselines/reference/ES5For-of20.errors.txt +++ b/tests/baselines/reference/ES5For-of20.errors.txt @@ -1,10 +1,13 @@ +tests/cases/conformance/statements/for-ofStatements/ES5For-of20.ts(3,20): error TS2448: Block-scoped variable 'v' used before its declaration. tests/cases/conformance/statements/for-ofStatements/ES5For-of20.ts(4,15): error TS1155: 'const' declarations must be initialized -==== tests/cases/conformance/statements/for-ofStatements/ES5For-of20.ts (1 errors) ==== +==== tests/cases/conformance/statements/for-ofStatements/ES5For-of20.ts (2 errors) ==== for (let v of []) { let v; for (let v of [v]) { + ~ +!!! error TS2448: Block-scoped variable 'v' used before its declaration. const v; ~ !!! error TS1155: 'const' declarations must be initialized From 6691408147bb6e773fed3ef116c3fd30ee6c64e4 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 12 Mar 2015 14:56:58 -0700 Subject: [PATCH 8/8] Address PR feedback --- src/compiler/checker.ts | 67 ++++++++++++++----- .../diagnosticInformationMap.generated.ts | 1 + src/compiler/diagnosticMessages.json | 4 ++ .../reference/ES5For-ofTypeCheck10.errors.txt | 4 +- .../reference/ES5For-ofTypeCheck12.errors.txt | 7 ++ .../reference/ES5For-ofTypeCheck12.js | 7 ++ .../for-ofStatements/ES5For-ofTypeCheck12.ts | 2 + 7 files changed, 73 insertions(+), 19 deletions(-) create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck12.errors.txt create mode 100644 tests/baselines/reference/ES5For-ofTypeCheck12.js create mode 100644 tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck12.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 75c8584428668..1500a47f19787 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -4763,17 +4763,22 @@ module ts { // For a union type, remove all constituent types that are of the given type kind (when isOfTypeKind is true) // or not of the given type kind (when isOfTypeKind is false) - function removeTypesFromUnionType(type: Type, typeKind: TypeFlags, isOfTypeKind: boolean): Type { + function removeTypesFromUnionType(type: Type, typeKind: TypeFlags, isOfTypeKind: boolean, allowEmptyUnionResult: boolean): Type { if (type.flags & TypeFlags.Union) { var types = (type).types; if (forEach(types, t => !!(t.flags & typeKind) === isOfTypeKind)) { // Above we checked if we have anything to remove, now use the opposite test to do the removal var narrowedType = getUnionType(filter(types, t => !(t.flags & typeKind) === isOfTypeKind)); - if (narrowedType !== emptyObjectType) { + if (allowEmptyUnionResult || narrowedType !== emptyObjectType) { return narrowedType; } } } + else if (allowEmptyUnionResult && !!(type.flags & typeKind) === isOfTypeKind) { + // Use getUnionType(emptyArray) instead of emptyObjectType in case the way empty union types + // are represented ever changes. + return getUnionType(emptyArray); + } return type; } @@ -4976,7 +4981,8 @@ module ts { if (assumeTrue) { // Assumed result is true. If check was not for a primitive type, remove all primitive types if (!typeInfo) { - return removeTypesFromUnionType(type, /*typeKind*/ TypeFlags.StringLike | TypeFlags.NumberLike | TypeFlags.Boolean | TypeFlags.ESSymbol, /*isOfTypeKind*/ true); + return removeTypesFromUnionType(type, /*typeKind*/ TypeFlags.StringLike | TypeFlags.NumberLike | TypeFlags.Boolean | TypeFlags.ESSymbol, + /*isOfTypeKind*/ true, /*allowEmptyUnionResult*/ false); } // Check was for a primitive type, return that primitive type if it is a subtype if (isTypeSubtypeOf(typeInfo.type, type)) { @@ -4984,12 +4990,12 @@ module ts { } // Otherwise, remove all types that aren't of the primitive type kind. This can happen when the type is // union of enum types and other types. - return removeTypesFromUnionType(type, /*typeKind*/ typeInfo.flags, /*isOfTypeKind*/ false); + return removeTypesFromUnionType(type, /*typeKind*/ typeInfo.flags, /*isOfTypeKind*/ false, /*allowEmptyUnionResult*/ false); } else { // Assumed result is false. If check was for a primitive type, remove that primitive type if (typeInfo) { - return removeTypesFromUnionType(type, /*typeKind*/ typeInfo.flags, /*isOfTypeKind*/ true); + return removeTypesFromUnionType(type, /*typeKind*/ typeInfo.flags, /*isOfTypeKind*/ true, /*allowEmptyUnionResult*/ false); } // Otherwise we don't have enough information to do anything. return type; @@ -9027,28 +9033,55 @@ module ts { } } + /** + * This function does the following steps: + * 1. Break up arrayOrStringType (possibly a union) into its string constituents and array constituents. + * 2. Take the element types of the array constituents. + * 3. Return the union of the element types, and string if there was a string constitutent. + * + * For example: + * string -> string + * number[] -> number + * string[] | number[] -> string | number + * string | number[] -> string | number + * string | string[] | number[] -> string | number + * + * It also errors if: + * 1. Some constituent is neither a string nor an array. + * 2. Some constituent is a string and target is less than ES5 (because in ES3 string is not indexable). + */ function checkElementTypeOfArrayOrString(arrayOrStringType: Type, expressionForError: Expression): Type { Debug.assert(languageVersion < ScriptTarget.ES6); - var isJustString = allConstituentTypesHaveKind(arrayOrStringType, TypeFlags.StringLike); - // Check isJustString because removeTypesFromUnionType will only remove types if it doesn't result - // in an emptyObjectType. In this case, we actually do want the emptyObjectType. - var arrayType = isJustString ? emptyObjectType : removeTypesFromUnionType(arrayOrStringType, TypeFlags.StringLike, /*isTypeOfKind*/ true); - var hasStringConstituent = arrayOrStringType !== emptyObjectType && arrayOrStringType !== arrayType; + // After we remove all types that are StringLike, we will know if there was a string constituent + // based on whether the remaining type is the same as the initial type. + var arrayType = removeTypesFromUnionType(arrayOrStringType, TypeFlags.StringLike, /*isTypeOfKind*/ true, /*allowEmptyUnionResult*/ true); + var hasStringConstituent = arrayOrStringType !== arrayType; var reportedError = false; - if (hasStringConstituent && languageVersion < ScriptTarget.ES5) { - error(expressionForError, Diagnostics.Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher); - reportedError = true; - } + if (hasStringConstituent) { + if (languageVersion < ScriptTarget.ES5) { + error(expressionForError, Diagnostics.Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher); + reportedError = true; + } - if (isJustString) { - return stringType; + // Now that we've removed all the StringLike types, if no constituents remain, then the entire + // arrayOrStringType was a string. + if (arrayType === emptyObjectType) { + return stringType; + } } if (!isArrayLikeType(arrayType)) { if (!reportedError) { - error(expressionForError, Diagnostics.Type_0_is_not_an_array_type, typeToString(arrayType)); + // Which error we report depends on whether there was a string constituent. For example, + // if the input type is number | string, we want to say that number is not an array type. + // But if the input was just number, we want to say that number is not an array type + // or a string type. + var diagnostic = hasStringConstituent + ? Diagnostics.Type_0_is_not_an_array_type + : Diagnostics.Type_0_is_not_an_array_type_or_a_string_type; + error(expressionForError, diagnostic, typeToString(arrayType)); } return hasStringConstituent ? stringType : unknownType; } diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index ef8a3936bc3c0..d40fcd25ce089 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -339,6 +339,7 @@ module ts { Cannot_redeclare_identifier_0_in_catch_clause: { code: 2492, category: DiagnosticCategory.Error, key: "Cannot redeclare identifier '{0}' in catch clause" }, Tuple_type_0_with_length_1_cannot_be_assigned_to_tuple_with_length_2: { code: 2493, category: DiagnosticCategory.Error, key: "Tuple type '{0}' with length '{1}' cannot be assigned to tuple with length '{2}'." }, Using_a_string_in_a_for_of_statement_is_only_supported_in_ECMAScript_5_and_higher: { code: 2494, category: DiagnosticCategory.Error, key: "Using a string in a 'for...of' statement is only supported in ECMAScript 5 and higher." }, + Type_0_is_not_an_array_type_or_a_string_type: { code: 2461, category: DiagnosticCategory.Error, key: "Type '{0}' is not an array type or a string type." }, Import_declaration_0_is_using_private_name_1: { code: 4000, category: DiagnosticCategory.Error, key: "Import declaration '{0}' is using private name '{1}'." }, Type_parameter_0_of_exported_class_has_or_is_using_private_name_1: { code: 4002, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported class has or is using private name '{1}'." }, Type_parameter_0_of_exported_interface_has_or_is_using_private_name_1: { code: 4004, category: DiagnosticCategory.Error, key: "Type parameter '{0}' of exported interface has or is using private name '{1}'." }, diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index efeb54d93fca5..c4121e92251b2 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1347,6 +1347,10 @@ "category": "Error", "code": 2494 }, + "Type '{0}' is not an array type or a string type.": { + "category": "Error", + "code": 2461 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", diff --git a/tests/baselines/reference/ES5For-ofTypeCheck10.errors.txt b/tests/baselines/reference/ES5For-ofTypeCheck10.errors.txt index 8725fa62471d5..9551d0467e9ba 100644 --- a/tests/baselines/reference/ES5For-ofTypeCheck10.errors.txt +++ b/tests/baselines/reference/ES5For-ofTypeCheck10.errors.txt @@ -1,11 +1,11 @@ -tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck10.ts(1,15): error TS2461: Type 'StringIterator' is not an array type. +tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck10.ts(1,15): error TS2461: Type 'StringIterator' is not an array type or a string type. tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck10.ts(11,6): error TS2304: Cannot find name 'Symbol'. ==== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck10.ts (2 errors) ==== for (var v of new StringIterator) { } ~~~~~~~~~~~~~~~~~~ -!!! error TS2461: Type 'StringIterator' is not an array type. +!!! error TS2461: Type 'StringIterator' is not an array type or a string type. // In ES3/5, you cannot for...of over an arbitrary iterable. class StringIterator { diff --git a/tests/baselines/reference/ES5For-ofTypeCheck12.errors.txt b/tests/baselines/reference/ES5For-ofTypeCheck12.errors.txt new file mode 100644 index 0000000000000..b726aaad6c7c5 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck12.errors.txt @@ -0,0 +1,7 @@ +tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck12.ts(1,17): error TS2461: Type 'number' is not an array type or a string type. + + +==== tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck12.ts (1 errors) ==== + for (const v of 0) { } + ~ +!!! error TS2461: Type 'number' is not an array type or a string type. \ No newline at end of file diff --git a/tests/baselines/reference/ES5For-ofTypeCheck12.js b/tests/baselines/reference/ES5For-ofTypeCheck12.js new file mode 100644 index 0000000000000..6004990f6dc12 --- /dev/null +++ b/tests/baselines/reference/ES5For-ofTypeCheck12.js @@ -0,0 +1,7 @@ +//// [ES5For-ofTypeCheck12.ts] +for (const v of 0) { } + +//// [ES5For-ofTypeCheck12.js] +for (var _i = 0, _a = 0; _i < _a.length; _i++) { + var v = _a[_i]; +} diff --git a/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck12.ts b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck12.ts new file mode 100644 index 0000000000000..2d220dc5f261f --- /dev/null +++ b/tests/cases/conformance/statements/for-ofStatements/ES5For-ofTypeCheck12.ts @@ -0,0 +1,2 @@ +//@target: ES5 +for (const v of 0) { } \ No newline at end of file