From 1e27df5e6a9f0cea5bc398f1d754048ad460812d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 15 Nov 2019 11:29:08 -0500 Subject: [PATCH 1/2] polish: skip creating extra reference for safely re-used node --- .../src/index.js | 17 ++++++++++------- .../transform-identifier-in-function/input.js | 3 +++ .../options.json | 3 +++ .../transform-identifier-in-function/output.js | 3 +++ .../transform-in-default/input.js | 2 +- .../transform-in-default/output.js | 4 ++-- .../transform-indentifier-in-default/input.js | 1 + .../options.json | 3 +++ .../transform-indentifier-in-default/output.js | 1 + 9 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/input.js create mode 100644 packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/options.json create mode 100644 packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/output.js create mode 100644 packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/input.js create mode 100644 packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/options.json create mode 100644 packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/output.js diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/src/index.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/src/index.js index 5b3c2a3a4dc3..6df8d253c751 100644 --- a/packages/babel-plugin-proposal-nullish-coalescing-operator/src/index.js +++ b/packages/babel-plugin-proposal-nullish-coalescing-operator/src/index.js @@ -16,14 +16,17 @@ export default declare((api, { loose = false }) => { return; } - const ref = scope.generateUidIdentifierBasedOnNode(node.left); - scope.push({ id: ref }); + let ref, assignment; + // skip creating extra reference when `left` is semantically safe to re-use + if (t.isIdentifier(node.left)) { + ref = node.left; + assignment = t.cloneNode(node.left); + } else { + ref = scope.generateUidIdentifierBasedOnNode(node.left); + scope.push({ id: ref }); - const assignment = t.assignmentExpression( - "=", - t.cloneNode(ref), - node.left, - ); + assignment = t.assignmentExpression("=", t.cloneNode(ref), node.left); + } path.replaceWith( t.conditionalExpression( diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/input.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/input.js new file mode 100644 index 000000000000..4b3ef47dd277 --- /dev/null +++ b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/input.js @@ -0,0 +1,3 @@ +function foo(opts) { + var foo = opts ?? {}; +} diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/options.json b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/options.json new file mode 100644 index 000000000000..47e490d2afcf --- /dev/null +++ b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-nullish-coalescing-operator"] +} diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/output.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/output.js new file mode 100644 index 000000000000..8b0cc0d23bdf --- /dev/null +++ b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/output.js @@ -0,0 +1,3 @@ +function foo(opts) { + var foo = opts !== null && opts !== void 0 ? opts : {}; +} diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-in-default/input.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-in-default/input.js index 7c7dcae88cf4..0c13164800af 100644 --- a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-in-default/input.js +++ b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-in-default/input.js @@ -1 +1 @@ -function foo(foo, bar = foo ?? "bar") {} +function foo(foo, qux = foo.bar ?? "qux") {} diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-in-default/output.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-in-default/output.js index 303ed2159928..2b2f2314b366 100644 --- a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-in-default/output.js +++ b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-in-default/output.js @@ -1,3 +1,3 @@ -function foo(foo, bar = (_foo = foo) !== null && _foo !== void 0 ? _foo : "bar") { - var _foo; +function foo(foo, qux = (_foo$bar = foo.bar) !== null && _foo$bar !== void 0 ? _foo$bar : "qux") { + var _foo$bar; } diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/input.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/input.js new file mode 100644 index 000000000000..7c7dcae88cf4 --- /dev/null +++ b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/input.js @@ -0,0 +1 @@ +function foo(foo, bar = foo ?? "bar") {} diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/options.json b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/options.json new file mode 100644 index 000000000000..47e490d2afcf --- /dev/null +++ b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-nullish-coalescing-operator"] +} diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/output.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/output.js new file mode 100644 index 000000000000..8434439d0782 --- /dev/null +++ b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/output.js @@ -0,0 +1 @@ +function foo(foo, bar = foo !== null && foo !== void 0 ? foo : "bar") {} From 5db3e3a1621877b0e711bbc4a52321a45565d39d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Fri, 15 Nov 2019 14:45:26 -0500 Subject: [PATCH 2/2] reimplement using scope.maybeGenerateMemoised --- .../src/index.js | 12 +++++------- .../transform-identifier-in-function/input.js | 3 --- .../transform-identifier-in-function/output.js | 3 --- .../input.js | 0 .../options.json | 0 .../output.js | 0 .../transform-static-refs-in-function/input.js | 3 +++ .../options.json | 0 .../transform-static-refs-in-function/output.js | 3 +++ 9 files changed, 11 insertions(+), 13 deletions(-) delete mode 100644 packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/input.js delete mode 100644 packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/output.js rename packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/{transform-indentifier-in-default => transform-static-refs-in-default}/input.js (100%) rename packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/{transform-identifier-in-function => transform-static-refs-in-default}/options.json (100%) rename packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/{transform-indentifier-in-default => transform-static-refs-in-default}/output.js (100%) create mode 100644 packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-function/input.js rename packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/{transform-indentifier-in-default => transform-static-refs-in-function}/options.json (100%) create mode 100644 packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-function/output.js diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/src/index.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/src/index.js index 6df8d253c751..848a6c3ee3cd 100644 --- a/packages/babel-plugin-proposal-nullish-coalescing-operator/src/index.js +++ b/packages/babel-plugin-proposal-nullish-coalescing-operator/src/index.js @@ -16,16 +16,14 @@ export default declare((api, { loose = false }) => { return; } - let ref, assignment; - // skip creating extra reference when `left` is semantically safe to re-use - if (t.isIdentifier(node.left)) { + let ref = scope.maybeGenerateMemoised(node.left); + let assignment; + // skip creating extra reference when `left` is static + if (ref === null) { ref = node.left; assignment = t.cloneNode(node.left); } else { - ref = scope.generateUidIdentifierBasedOnNode(node.left); - scope.push({ id: ref }); - - assignment = t.assignmentExpression("=", t.cloneNode(ref), node.left); + assignment = t.assignmentExpression("=", ref, node.left); } path.replaceWith( diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/input.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/input.js deleted file mode 100644 index 4b3ef47dd277..000000000000 --- a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/input.js +++ /dev/null @@ -1,3 +0,0 @@ -function foo(opts) { - var foo = opts ?? {}; -} diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/output.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/output.js deleted file mode 100644 index 8b0cc0d23bdf..000000000000 --- a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/output.js +++ /dev/null @@ -1,3 +0,0 @@ -function foo(opts) { - var foo = opts !== null && opts !== void 0 ? opts : {}; -} diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/input.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-default/input.js similarity index 100% rename from packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/input.js rename to packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-default/input.js diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/options.json b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-default/options.json similarity index 100% rename from packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-identifier-in-function/options.json rename to packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-default/options.json diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/output.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-default/output.js similarity index 100% rename from packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/output.js rename to packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-default/output.js diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-function/input.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-function/input.js new file mode 100644 index 000000000000..8e488a306361 --- /dev/null +++ b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-function/input.js @@ -0,0 +1,3 @@ +function foo() { + var foo = this ?? {}; +} diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/options.json b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-function/options.json similarity index 100% rename from packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-indentifier-in-default/options.json rename to packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-function/options.json diff --git a/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-function/output.js b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-function/output.js new file mode 100644 index 000000000000..a13ea3508a20 --- /dev/null +++ b/packages/babel-plugin-proposal-nullish-coalescing-operator/test/fixtures/nullish-coalescing/transform-static-refs-in-function/output.js @@ -0,0 +1,3 @@ +function foo() { + var foo = this !== null && this !== void 0 ? this : {}; +}