From 6736ced51d4e48a17969045e85f976509452d90f Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Mon, 12 Feb 2018 12:30:29 -0800 Subject: [PATCH] Fix duplicate label in es2017 async function --- src/compiler/transformers/esnext.ts | 2 +- .../baselines/reference/asyncAwait_es2017.js | 15 +++++++++++++- .../reference/asyncAwait_es2017.symbols | 11 +++++++++- .../reference/asyncAwait_es2017.types | 17 +++++++++++++++- tests/baselines/reference/asyncAwait_es5.js | 20 +++++++++++++++++++ .../reference/asyncAwait_es5.symbols | 9 +++++++++ .../baselines/reference/asyncAwait_es5.types | 15 ++++++++++++++ tests/baselines/reference/asyncAwait_es6.js | 17 +++++++++++++++- .../reference/asyncAwait_es6.symbols | 11 +++++++++- .../baselines/reference/asyncAwait_es6.types | 17 +++++++++++++++- .../async/es2017/asyncAwait_es2017.ts | 9 ++++++++- .../conformance/async/es5/asyncAwait_es5.ts | 7 +++++++ .../conformance/async/es6/asyncAwait_es6.ts | 9 ++++++++- 13 files changed, 150 insertions(+), 9 deletions(-) diff --git a/src/compiler/transformers/esnext.ts b/src/compiler/transformers/esnext.ts index 424371ad311..82ff52ead90 100644 --- a/src/compiler/transformers/esnext.ts +++ b/src/compiler/transformers/esnext.ts @@ -153,7 +153,7 @@ namespace ts { if (statement.kind === SyntaxKind.ForOfStatement && (statement).awaitModifier) { return visitForOfStatement(statement, node); } - return restoreEnclosingLabel(visitEachChild(node, visitor, context), node); + return restoreEnclosingLabel(visitEachChild(statement, visitor, context), node); } return visitEachChild(node, visitor, context); } diff --git a/tests/baselines/reference/asyncAwait_es2017.js b/tests/baselines/reference/asyncAwait_es2017.js index 314c99fa210..70a4c63be2e 100644 --- a/tests/baselines/reference/asyncAwait_es2017.js +++ b/tests/baselines/reference/asyncAwait_es2017.js @@ -14,7 +14,7 @@ let f6 = async function(): MyPromise { } let f7 = async () => { }; let f8 = async (): Promise => { }; -let f9 = async (): MyPromise => { }; +let f9 = async (): MyPromise => { }; let f10 = async () => p; let f11 = async () => mp; let f12 = async (): Promise => mp; @@ -37,6 +37,13 @@ class C { module M { export async function f1() { } +} + +async function f14() { + block: { + await 1; + break block; + } } //// [asyncAwait_es2017.js] @@ -71,3 +78,9 @@ var M; async function f1() { } M.f1 = f1; })(M || (M = {})); +async function f14() { + block: { + await 1; + break block; + } +} diff --git a/tests/baselines/reference/asyncAwait_es2017.symbols b/tests/baselines/reference/asyncAwait_es2017.symbols index 0f302638276..8d8a23011c7 100644 --- a/tests/baselines/reference/asyncAwait_es2017.symbols +++ b/tests/baselines/reference/asyncAwait_es2017.symbols @@ -46,7 +46,7 @@ let f8 = async (): Promise => { }; >f8 : Symbol(f8, Decl(asyncAwait_es2017.ts, 14, 3)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) -let f9 = async (): MyPromise => { }; +let f9 = async (): MyPromise => { }; >f9 : Symbol(f9, Decl(asyncAwait_es2017.ts, 15, 3)) >MyPromise : Symbol(MyPromise, Decl(asyncAwait_es2017.ts, 0, 0), Decl(asyncAwait_es2017.ts, 1, 11)) @@ -116,3 +116,12 @@ module M { export async function f1() { } >f1 : Symbol(f1, Decl(asyncAwait_es2017.ts, 36, 10)) } + +async function f14() { +>f14 : Symbol(f14, Decl(asyncAwait_es2017.ts, 38, 1)) + + block: { + await 1; + break block; + } +} diff --git a/tests/baselines/reference/asyncAwait_es2017.types b/tests/baselines/reference/asyncAwait_es2017.types index a1226d0cbfe..42b54aa56be 100644 --- a/tests/baselines/reference/asyncAwait_es2017.types +++ b/tests/baselines/reference/asyncAwait_es2017.types @@ -51,7 +51,7 @@ let f8 = async (): Promise => { }; >async (): Promise => { } : () => Promise >Promise : Promise -let f9 = async (): MyPromise => { }; +let f9 = async (): MyPromise => { }; >f9 : () => Promise >async (): MyPromise => { } : () => Promise >MyPromise : Promise @@ -127,3 +127,18 @@ module M { export async function f1() { } >f1 : () => Promise } + +async function f14() { +>f14 : () => Promise + + block: { +>block : any + + await 1; +>await 1 : 1 +>1 : 1 + + break block; +>block : any + } +} diff --git a/tests/baselines/reference/asyncAwait_es5.js b/tests/baselines/reference/asyncAwait_es5.js index 653082be8d6..6434ae5a766 100644 --- a/tests/baselines/reference/asyncAwait_es5.js +++ b/tests/baselines/reference/asyncAwait_es5.js @@ -37,6 +37,13 @@ class C { module M { export async function f1() { } +} + +async function f14() { + block: { + await 1; + break block; + } } //// [asyncAwait_es5.js] @@ -188,3 +195,16 @@ var M; } M.f1 = f1; })(M || (M = {})); +function f14() { + return __awaiter(this, void 0, void 0, function () { + return __generator(this, function (_a) { + switch (_a.label) { + case 0: return [4 /*yield*/, 1]; + case 1: + _a.sent(); + return [3 /*break*/, 2]; + case 2: return [2 /*return*/]; + } + }); + }); +} diff --git a/tests/baselines/reference/asyncAwait_es5.symbols b/tests/baselines/reference/asyncAwait_es5.symbols index cdc52137ff4..e10fd971b7b 100644 --- a/tests/baselines/reference/asyncAwait_es5.symbols +++ b/tests/baselines/reference/asyncAwait_es5.symbols @@ -116,3 +116,12 @@ module M { export async function f1() { } >f1 : Symbol(f1, Decl(asyncAwait_es5.ts, 36, 10)) } + +async function f14() { +>f14 : Symbol(f14, Decl(asyncAwait_es5.ts, 38, 1)) + + block: { + await 1; + break block; + } +} diff --git a/tests/baselines/reference/asyncAwait_es5.types b/tests/baselines/reference/asyncAwait_es5.types index 4162aa84b76..6be39599fa1 100644 --- a/tests/baselines/reference/asyncAwait_es5.types +++ b/tests/baselines/reference/asyncAwait_es5.types @@ -127,3 +127,18 @@ module M { export async function f1() { } >f1 : () => Promise } + +async function f14() { +>f14 : () => Promise + + block: { +>block : any + + await 1; +>await 1 : 1 +>1 : 1 + + break block; +>block : any + } +} diff --git a/tests/baselines/reference/asyncAwait_es6.js b/tests/baselines/reference/asyncAwait_es6.js index d6635098aed..3cfe3b3ceec 100644 --- a/tests/baselines/reference/asyncAwait_es6.js +++ b/tests/baselines/reference/asyncAwait_es6.js @@ -14,7 +14,7 @@ let f6 = async function(): MyPromise { } let f7 = async () => { }; let f8 = async (): Promise => { }; -let f9 = async (): MyPromise => { }; +let f9 = async (): MyPromise => { }; let f10 = async () => p; let f11 = async () => mp; let f12 = async (): Promise => mp; @@ -37,6 +37,13 @@ class C { module M { export async function f1() { } +} + +async function f14() { + block: { + await 1; + break block; + } } //// [asyncAwait_es6.js] @@ -111,3 +118,11 @@ var M; } M.f1 = f1; })(M || (M = {})); +function f14() { + return __awaiter(this, void 0, void 0, function* () { + block: { + yield 1; + break block; + } + }); +} diff --git a/tests/baselines/reference/asyncAwait_es6.symbols b/tests/baselines/reference/asyncAwait_es6.symbols index 9093fc69064..380ecbcafe3 100644 --- a/tests/baselines/reference/asyncAwait_es6.symbols +++ b/tests/baselines/reference/asyncAwait_es6.symbols @@ -46,7 +46,7 @@ let f8 = async (): Promise => { }; >f8 : Symbol(f8, Decl(asyncAwait_es6.ts, 14, 3)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --)) -let f9 = async (): MyPromise => { }; +let f9 = async (): MyPromise => { }; >f9 : Symbol(f9, Decl(asyncAwait_es6.ts, 15, 3)) >MyPromise : Symbol(MyPromise, Decl(asyncAwait_es6.ts, 0, 0), Decl(asyncAwait_es6.ts, 1, 11)) @@ -116,3 +116,12 @@ module M { export async function f1() { } >f1 : Symbol(f1, Decl(asyncAwait_es6.ts, 36, 10)) } + +async function f14() { +>f14 : Symbol(f14, Decl(asyncAwait_es6.ts, 38, 1)) + + block: { + await 1; + break block; + } +} diff --git a/tests/baselines/reference/asyncAwait_es6.types b/tests/baselines/reference/asyncAwait_es6.types index 5f0cd2cc35a..de6b7177e42 100644 --- a/tests/baselines/reference/asyncAwait_es6.types +++ b/tests/baselines/reference/asyncAwait_es6.types @@ -51,7 +51,7 @@ let f8 = async (): Promise => { }; >async (): Promise => { } : () => Promise >Promise : Promise -let f9 = async (): MyPromise => { }; +let f9 = async (): MyPromise => { }; >f9 : () => Promise >async (): MyPromise => { } : () => Promise >MyPromise : Promise @@ -127,3 +127,18 @@ module M { export async function f1() { } >f1 : () => Promise } + +async function f14() { +>f14 : () => Promise + + block: { +>block : any + + await 1; +>await 1 : 1 +>1 : 1 + + break block; +>block : any + } +} diff --git a/tests/cases/conformance/async/es2017/asyncAwait_es2017.ts b/tests/cases/conformance/async/es2017/asyncAwait_es2017.ts index a255cb7cb71..7256762788b 100644 --- a/tests/cases/conformance/async/es2017/asyncAwait_es2017.ts +++ b/tests/cases/conformance/async/es2017/asyncAwait_es2017.ts @@ -14,7 +14,7 @@ let f6 = async function(): MyPromise { } let f7 = async () => { }; let f8 = async (): Promise => { }; -let f9 = async (): MyPromise => { }; +let f9 = async (): MyPromise => { }; let f10 = async () => p; let f11 = async () => mp; let f12 = async (): Promise => mp; @@ -37,4 +37,11 @@ class C { module M { export async function f1() { } +} + +async function f14() { + block: { + await 1; + break block; + } } \ No newline at end of file diff --git a/tests/cases/conformance/async/es5/asyncAwait_es5.ts b/tests/cases/conformance/async/es5/asyncAwait_es5.ts index 88cda3201dc..5c33a42ab74 100644 --- a/tests/cases/conformance/async/es5/asyncAwait_es5.ts +++ b/tests/cases/conformance/async/es5/asyncAwait_es5.ts @@ -38,4 +38,11 @@ class C { module M { export async function f1() { } +} + +async function f14() { + block: { + await 1; + break block; + } } \ No newline at end of file diff --git a/tests/cases/conformance/async/es6/asyncAwait_es6.ts b/tests/cases/conformance/async/es6/asyncAwait_es6.ts index 8e72197a98d..203d748e114 100644 --- a/tests/cases/conformance/async/es6/asyncAwait_es6.ts +++ b/tests/cases/conformance/async/es6/asyncAwait_es6.ts @@ -14,7 +14,7 @@ let f6 = async function(): MyPromise { } let f7 = async () => { }; let f8 = async (): Promise => { }; -let f9 = async (): MyPromise => { }; +let f9 = async (): MyPromise => { }; let f10 = async () => p; let f11 = async () => mp; let f12 = async (): Promise => mp; @@ -37,4 +37,11 @@ class C { module M { export async function f1() { } +} + +async function f14() { + block: { + await 1; + break block; + } } \ No newline at end of file