Set correct async/generator in IIFE for params (#11346)

* Set correct async/generator in IIFE for params

* Reject in async params

* Skip async test on node 6 (it doesn't support async fns)
This commit is contained in:
Nicolò Ribaudo 2020-03-29 22:01:15 +02:00 committed by GitHub
parent 71e7a7b1e0
commit c8a8be7221
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 71 additions and 0 deletions

View File

@ -181,6 +181,13 @@ export default function convertFunctionParams(path, loose) {
const bodyPath = path.get("body.body");
const arrowPath = bodyPath[bodyPath.length - 1].get("argument.callee");
arrowPath.arrowFunctionToExpression();
arrowPath.node.generator = path.node.generator;
arrowPath.node.async = path.node.async;
// We don't reset "async" because if the default value of a parameter
// throws, it must reject asynchronously.
path.node.generator = false;
} else {
path.get("body").unshiftContainer("body", body);
}

View File

@ -0,0 +1,13 @@
const err = new Error();
async function f(a = (() => { throw err })()) {
throw 1;
var a = await a;
return a;
}
return (async () => {
let p;
expect(() => { p = f() }).not.toThrow();
await expect(p).rejects.toThrow(err);
})();

View File

@ -0,0 +1,9 @@
{
"plugins": [
"transform-parameters"
],
"parserOpts": {
"allowReturnOutsideFunction": true
},
"minNodeVersion": "8.0.0"
}

View File

@ -0,0 +1,14 @@
function* f(a = 1) {
var a = yield a;
return a;
}
async function g(a = 1) {
var a = await a;
return a;
}
async function* h(a = 1) {
var a = await (yield a);
return a;
}

View File

@ -0,0 +1,5 @@
{
"plugins": [
"transform-parameters"
]
}

View File

@ -0,0 +1,23 @@
function f() {
let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
return function* (a) {
var a = yield a;
return a;
}(a);
}
async function g() {
let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
return async function (a) {
var a = await a;
return a;
}(a);
}
async function h() {
let a = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1;
return async function* (a) {
var a = await (yield a);
return a;
}(a);
}