From 452f8f150cc17810209bcd0ab0bd5f013ab1faa1 Mon Sep 17 00:00:00 2001 From: Diogo Franco Date: Fri, 7 Apr 2017 00:17:31 +0900 Subject: [PATCH] Always use the native (or polyfilled) Promise in transform-async-to-generator (#5536) * Always use the native (or polyfilled) Promise in transform-async-to-generator Fixes #5531 * Simplify scope handling to only un-shadow the Program's Promise Only the helper needs to see the native Promise. --- .../src/index.js | 7 ++++++ .../shadowed-promise-import/actual.js | 5 ++++ .../shadowed-promise-import/expected.js | 13 ++++++++++ .../shadowed-promise-import/options.json | 5 ++++ .../shadowed-promise-nested/actual.js | 11 ++++++++ .../shadowed-promise-nested/expected.js | 25 +++++++++++++++++++ .../shadowed-promise-nested/options.json | 5 ++++ .../shadowed-promise/actual.js | 4 +++ .../shadowed-promise/expected.js | 15 +++++++++++ .../shadowed-promise/options.json | 5 ++++ 10 files changed, 95 insertions(+) create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-import/actual.js create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-import/expected.js create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-import/options.json create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-nested/actual.js create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-nested/expected.js create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-nested/options.json create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise/actual.js create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise/expected.js create mode 100644 packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise/options.json diff --git a/packages/babel-plugin-transform-async-to-generator/src/index.js b/packages/babel-plugin-transform-async-to-generator/src/index.js index 73caf1bebe..27e92a5ec7 100644 --- a/packages/babel-plugin-transform-async-to-generator/src/index.js +++ b/packages/babel-plugin-transform-async-to-generator/src/index.js @@ -9,6 +9,13 @@ export default function () { Function(path, state) { if (!path.node.async || path.node.generator) return; + // Ensure any Promise bindings at the Program level are renamed + // so the asyncToGenerator helper only sees the native Promise + const programScope = path.scope.getProgramParent(); + if (programScope.hasBinding("Promise", true)) { + programScope.rename("Promise"); + } + remapAsyncToGenerator(path, state.file, { wrapAsync: state.addHelper("asyncToGenerator"), }); diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-import/actual.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-import/actual.js new file mode 100644 index 0000000000..3d87c3186a --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-import/actual.js @@ -0,0 +1,5 @@ +import Promise from 'somewhere'; + +async function foo() { + await Promise.resolve(); +} diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-import/expected.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-import/expected.js new file mode 100644 index 0000000000..1408707062 --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-import/expected.js @@ -0,0 +1,13 @@ +let foo = (() => { + var _ref = _asyncToGenerator(function* () { + yield _Promise.resolve(); + }); + + return function foo() { + return _ref.apply(this, arguments); + }; +})(); + +function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } + +import _Promise from 'somewhere'; \ No newline at end of file diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-import/options.json b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-import/options.json new file mode 100644 index 0000000000..84679ca3cf --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-import/options.json @@ -0,0 +1,5 @@ +{ + "plugins": [ + "transform-async-to-generator" + ] +} diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-nested/actual.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-nested/actual.js new file mode 100644 index 0000000000..2708d0b102 --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-nested/actual.js @@ -0,0 +1,11 @@ +let Promise; + +async function foo() { + let Promise; + + await bar(); + + async function bar() { + return Promise.resolve(); + } +} diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-nested/expected.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-nested/expected.js new file mode 100644 index 0000000000..3ad5870331 --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-nested/expected.js @@ -0,0 +1,25 @@ +let foo = (() => { + var _ref = _asyncToGenerator(function* () { + let bar = (() => { + var _ref2 = _asyncToGenerator(function* () { + return Promise.resolve(); + }); + + return function bar() { + return _ref2.apply(this, arguments); + }; + })(); + + let Promise; + + yield bar(); + }); + + return function foo() { + return _ref.apply(this, arguments); + }; +})(); + +function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } + +let _Promise; \ No newline at end of file diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-nested/options.json b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-nested/options.json new file mode 100644 index 0000000000..84679ca3cf --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise-nested/options.json @@ -0,0 +1,5 @@ +{ + "plugins": [ + "transform-async-to-generator" + ] +} diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise/actual.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise/actual.js new file mode 100644 index 0000000000..0da1439fcc --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise/actual.js @@ -0,0 +1,4 @@ +let Promise; +async function foo() { + await new Promise(resolve => { resolve() }); +} diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise/expected.js b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise/expected.js new file mode 100644 index 0000000000..4dfaddf93e --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise/expected.js @@ -0,0 +1,15 @@ +let foo = (() => { + var _ref = _asyncToGenerator(function* () { + yield new _Promise(function (resolve) { + resolve(); + }); + }); + + return function foo() { + return _ref.apply(this, arguments); + }; +})(); + +function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } + +let _Promise; diff --git a/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise/options.json b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise/options.json new file mode 100644 index 0000000000..84679ca3cf --- /dev/null +++ b/packages/babel-plugin-transform-async-to-generator/test/fixtures/async-to-generator/shadowed-promise/options.json @@ -0,0 +1,5 @@ +{ + "plugins": [ + "transform-async-to-generator" + ] +}