From fd88b0f2e35a1b2120a3e6705b4a6520b849aeaa Mon Sep 17 00:00:00 2001 From: Arun Kumar Mohan Date: Thu, 2 Apr 2020 18:42:31 -0500 Subject: [PATCH] fix(logical-assignment): Do not assign names to anonymous functions --- .../src/index.js | 9 ++++++++- .../logical-assignment/anonymous-function/input.js | 8 ++++++++ .../logical-assignment/anonymous-function/options.json | 3 +++ .../logical-assignment/anonymous-function/output.js | 6 ++++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/input.js create mode 100644 packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/options.json create mode 100644 packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/output.js diff --git a/packages/babel-plugin-proposal-logical-assignment-operators/src/index.js b/packages/babel-plugin-proposal-logical-assignment-operators/src/index.js index 813dcd761f7c..b3797f85be36 100644 --- a/packages/babel-plugin-proposal-logical-assignment-operators/src/index.js +++ b/packages/babel-plugin-proposal-logical-assignment-operators/src/index.js @@ -39,11 +39,18 @@ export default declare(api => { } } + const isRHSAnonymousFunction = t.isFunctionExpression(right, { + id: null, + }); + const rightExpression = isRHSAnonymousFunction + ? t.sequenceExpression([t.numericLiteral(0), right]) + : right; + path.replaceWith( t.logicalExpression( operator.slice(0, -1), lhs, - t.assignmentExpression("=", left, right), + t.assignmentExpression("=", left, rightExpression), ), ); }, diff --git a/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/input.js b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/input.js new file mode 100644 index 000000000000..426a65a92731 --- /dev/null +++ b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/input.js @@ -0,0 +1,8 @@ +var a; +console.log((a ||= function () {}).name); + +var b = 1; +console.log((b &&= function () {}).name); + +var c; +console.log((c ??= function () {}).name); diff --git a/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/options.json b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/options.json new file mode 100644 index 000000000000..259c77d8e49c --- /dev/null +++ b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-logical-assignment-operators"] +} diff --git a/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/output.js b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/output.js new file mode 100644 index 000000000000..79297c746323 --- /dev/null +++ b/packages/babel-plugin-proposal-logical-assignment-operators/test/fixtures/logical-assignment/anonymous-function/output.js @@ -0,0 +1,6 @@ +var a; +console.log((a || (a = (0, function () {}))).name); +var b = 1; +console.log((b && (b = (0, function () {}))).name); +var c; +console.log((c ?? (c = (0, function () {}))).name);