From ec61bd9386c86fc4006e121b9ad6bdc9b7b2c8f0 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 2 Feb 2016 22:13:26 -0500 Subject: [PATCH 1/4] Revert "Don't mark async functions as hoist" This reverts commit d34cb69912ee5789c7d1029c3be75d22d13e7bf8. --- packages/babel-helper-remap-async-to-generator/src/index.js | 1 + .../test/fixtures/async-to-generator/statement/actual.js | 2 -- .../test/fixtures/async-to-generator/statement/expected.js | 2 -- 3 files changed, 1 insertion(+), 4 deletions(-) diff --git a/packages/babel-helper-remap-async-to-generator/src/index.js b/packages/babel-helper-remap-async-to-generator/src/index.js index ee16627eb5..d3650c066f 100644 --- a/packages/babel-helper-remap-async-to-generator/src/index.js +++ b/packages/babel-helper-remap-async-to-generator/src/index.js @@ -87,6 +87,7 @@ function plainFunction(path: NodePath, callId: Object) { t.callExpression(container, []) ) ]); + declar._blockHoist = true; retFunction.id = asyncFnId; path.replaceWith(declar); diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/statement/actual.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/statement/actual.js index 2b301a1500..e422835657 100644 --- a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/statement/actual.js +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/statement/actual.js @@ -1,5 +1,3 @@ -function normalFunction() {} - async function foo() { var wat = await bar(); } diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/statement/expected.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/statement/expected.js index 6f6a08626b..51140320d4 100644 --- a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/statement/expected.js +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/statement/expected.js @@ -1,5 +1,3 @@ -function normalFunction() {} - let foo = function () { var ref = babelHelpers.asyncToGenerator(function* () { var wat = yield bar(); From e759b5f835235ea65948f9e35073ab76dec8b5c3 Mon Sep 17 00:00:00 2001 From: Erik Date: Tue, 2 Feb 2016 22:14:08 -0500 Subject: [PATCH 2/4] Add exec test for T6882 (async function hoisting) --- .../test/fixtures/regression/T6882/exec.js | 3 +++ .../test/fixtures/regression/options.json | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/T6882/exec.js create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/options.json diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/T6882/exec.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/T6882/exec.js new file mode 100644 index 0000000000..05245197ef --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/T6882/exec.js @@ -0,0 +1,3 @@ +foo(); + +async function foo() {} diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/options.json b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/options.json new file mode 100644 index 0000000000..94bdeeb0eb --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/regression/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["external-helpers", "transform-es2015-block-scoping", "transform-regenerator", "transform-async-to-generator"] +} From 4142003bbd2fe3f862f9ddfde05274ee003de2cc Mon Sep 17 00:00:00 2001 From: Erik Desjardins Date: Wed, 3 Feb 2016 11:23:32 -0500 Subject: [PATCH 3/4] Hoist initial `exports.foo = undefined` and `__esModule` declarations above hoisted async functions --- .../src/index.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js b/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js index 097f17f7ce..86db8756b1 100644 --- a/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js +++ b/packages/babel-plugin-transform-es2015-modules-commonjs/src/index.js @@ -399,14 +399,21 @@ export default function () { hoistedExportsNode = buildExportsAssignment(t.identifier(name), hoistedExportsNode).expression; } - topNodes.unshift(t.expressionStatement(hoistedExportsNode)); + const node = t.expressionStatement(hoistedExportsNode); + node._blockHoist = 3; + + topNodes.unshift(node); } // add __esModule declaration if this file has any exports if (hasExports && !strict) { let buildTemplate = buildExportsModuleDeclaration; if (this.opts.loose) buildTemplate = buildLooseExportsModuleDeclaration; - topNodes.unshift(buildTemplate()); + + const declar = buildTemplate(); + declar._blockHoist = 3; + + topNodes.unshift(declar); } path.unshiftContainer("body", topNodes); From 84af53d3565642887cb174190fecceb6fb45387a Mon Sep 17 00:00:00 2001 From: Erik Desjardins Date: Wed, 3 Feb 2016 11:30:40 -0500 Subject: [PATCH 4/4] Async function will be hoisted above some imports ...but it's still below `exports.foo = undefined;`, so the test is intact --- .../fixtures/export-async/import-and-export/expected.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/export-async/import-and-export/expected.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/export-async/import-and-export/expected.js index 463c8b559a..7ea795d5ca 100644 --- a/packages/babel-plugin-transform-async-to-generator/test/fixtures/export-async/import-and-export/expected.js +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/export-async/import-and-export/expected.js @@ -5,13 +5,13 @@ Object.defineProperty(exports, "__esModule", { }); exports.foo = undefined; -var _bar = require('bar'); - -var _bar2 = babelHelpers.interopRequireDefault(_bar); - let foo = exports.foo = function () { var ref = babelHelpers.asyncToGenerator(function* () {}); return function foo() { return ref.apply(this, arguments); }; }(); + +var _bar = require('bar'); + +var _bar2 = babelHelpers.interopRequireDefault(_bar);