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.
This commit is contained in:
Diogo Franco
2017-04-07 00:17:31 +09:00
committed by Henry Zhu
parent c732f5e1d0
commit 452f8f150c
10 changed files with 95 additions and 0 deletions

View File

@@ -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"),
});

View File

@@ -0,0 +1,5 @@
import Promise from 'somewhere';
async function foo() {
await Promise.resolve();
}

View File

@@ -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';

View File

@@ -0,0 +1,5 @@
{
"plugins": [
"transform-async-to-generator"
]
}

View File

@@ -0,0 +1,11 @@
let Promise;
async function foo() {
let Promise;
await bar();
async function bar() {
return Promise.resolve();
}
}

View File

@@ -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;

View File

@@ -0,0 +1,5 @@
{
"plugins": [
"transform-async-to-generator"
]
}

View File

@@ -0,0 +1,4 @@
let Promise;
async function foo() {
await new Promise(resolve => { resolve() });
}

View File

@@ -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;

View File

@@ -0,0 +1,5 @@
{
"plugins": [
"transform-async-to-generator"
]
}