diff --git a/async-to-promises.ts b/async-to-promises.ts index c2e977f..0918edc 100644 --- a/async-to-promises.ts +++ b/async-to-promises.ts @@ -1,4 +1,4 @@ -import { ArrowFunctionExpression, AwaitExpression, BlockStatement, CallExpression, ClassMethod, File, LabeledStatement, Node, Expression, FunctionDeclaration, Statement, Identifier, ForStatement, ForInStatement, SpreadElement, ReturnStatement, ForOfStatement, Function, FunctionExpression, MemberExpression, NumericLiteral, ThisExpression, SwitchCase, Program, VariableDeclaration, VariableDeclarator, StringLiteral, BooleanLiteral, Pattern, LVal, YieldExpression } from "babel-types"; +import { ArrowFunctionExpression, AwaitExpression, BlockStatement, CallExpression, ClassMethod, File, LabeledStatement, Node, Expression, FunctionDeclaration, Statement, Identifier, ForStatement, ForInStatement, SpreadElement, ReturnStatement, ForOfStatement, Function, FunctionExpression, MemberExpression, NumericLiteral, ThisExpression, SwitchCase, Program, VariableDeclaration, VariableDeclarator, StringLiteral, BooleanLiteral, Pattern, LVal, ObjectPattern, YieldExpression } from "babel-types"; import { NodePath, Scope, Visitor } from "babel-traverse"; import { code as helperCode } from "./helpers-string"; @@ -3312,12 +3312,23 @@ export default function({ types, template, traverse, transformFromAst, version } if (param.isAssignmentPattern()) { const init = param.get("right"); if (!isExpressionOfLiterals(init, literals)) { - const id = param.get("left").node; + const left = param.get("left") as NodePath; + let id: Identifier; + let after: Statement | undefined; + if (left.isIdentifier()) { + id = left.node; + } else { + id = left.scope.generateUidIdentifier(`arg${i}`); + after = types.variableDeclaration("let", [types.variableDeclarator(left.node, id)]); + } const initNode = init.node; param.replaceWith(id); const isMissing = types.binaryExpression("===", id, types.identifier("undefined")); const assignment = types.expressionStatement(types.assignmentExpression("=", id, initNode)); statements.push(types.ifStatement(isMissing, assignment)); + if (after) { + statements.push(after); + } } } else if (param.isIdentifier()) { literals.push(param.node.name); diff --git a/tests/default argument pattern/hoisted.js b/tests/default argument pattern/hoisted.js new file mode 100644 index 0000000..af672c8 --- /dev/null +++ b/tests/default argument pattern/hoisted.js @@ -0,0 +1 @@ +const f=_async(function(_arg){if(_arg===undefined)_arg=(x++,{});let{y=(z++,{})}=_arg;});let x=0,z=0; \ No newline at end of file diff --git a/tests/default argument pattern/inlined.js b/tests/default argument pattern/inlined.js new file mode 100644 index 0000000..39dea48 --- /dev/null +++ b/tests/default argument pattern/inlined.js @@ -0,0 +1 @@ +const f=function(_arg){try{if(_arg===undefined)_arg=(x++,{});let{y=(z++,{})}=_arg;return;}catch(e){return Promise.reject(e);}};let x=0,z=0; \ No newline at end of file diff --git a/tests/default argument pattern/input.js b/tests/default argument pattern/input.js new file mode 100644 index 0000000..6185f07 --- /dev/null +++ b/tests/default argument pattern/input.js @@ -0,0 +1,4 @@ +let x = 0, z = 0; + +async function f({y = (z++, {})} = (x++, {})) { +} diff --git a/tests/default argument pattern/options.json b/tests/default argument pattern/options.json new file mode 100644 index 0000000..c8102d5 --- /dev/null +++ b/tests/default argument pattern/options.json @@ -0,0 +1,4 @@ +{ + "checkSyntax": false, + "module": true +} diff --git a/tests/default argument pattern/output.js b/tests/default argument pattern/output.js new file mode 100644 index 0000000..5624155 --- /dev/null +++ b/tests/default argument pattern/output.js @@ -0,0 +1 @@ +const f=_async((_arg)=>{if(_arg===undefined)_arg=(x++,{});let{y=(z++,{})}=_arg;});let x=0,z=0; \ No newline at end of file