From 0c388af6902ffdf71b9a0c83384daf9f526279bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hu=C3=A1ng=20J=C3=B9nli=C3=A0ng?= Date: Tue, 29 Mar 2022 19:35:44 -0400 Subject: [PATCH] fix: mark the last statement in do block as completion --- .../src/index.ts | 7 +++---- .../completion-do-expression/exec.js | 9 +++++++++ .../completion-do-expression/input.js | 8 ++++++++ .../completion-do-expression/options.json | 10 ++++++++++ .../completion-do-expression/output.js | 15 +++++++++++++++ .../assignment/completion-do-expression/exec.js | 9 +++++++++ .../assignment/completion-do-expression/input.js | 8 ++++++++ .../completion-do-expression/options.json | 4 ++++ .../assignment/completion-do-expression/output.js | 11 +++++++++++ packages/babel-traverse/src/path/introspection.ts | 6 +++++- 10 files changed, 82 insertions(+), 5 deletions(-) create mode 100644 packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/exec.js create mode 100644 packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/input.js create mode 100644 packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/options.json create mode 100644 packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/output.js create mode 100644 packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/exec.js create mode 100644 packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/input.js create mode 100644 packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/options.json create mode 100644 packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/output.js diff --git a/packages/babel-plugin-proposal-destructuring-private/src/index.ts b/packages/babel-plugin-proposal-destructuring-private/src/index.ts index ec6d1d4819c6..21f6b8d0f25e 100644 --- a/packages/babel-plugin-proposal-destructuring-private/src/index.ts +++ b/packages/babel-plugin-proposal-destructuring-private/src/index.ts @@ -41,20 +41,19 @@ export default declare(function ({ Function(path) { // (b, { #x: x } = I) => body // transforms to: - // (p1, p2) => { var b = p1, { #x: x } = p2 === undefined ? I : p2; body; } + // (b, p1) => { var { #x: x } = p1 === undefined ? I : p1; body; } const index = path.node.params.findIndex(param => hasPrivateKeys(param)); if (index === -1) return; // wrap function body within IIFE if any param is shadowed convertFunctionParams(path, ignoreFunctionLength, () => false, false); + // invariant: path.body is always a BlockStatement after `convertFunctionParams` const { node, scope } = path; const params = node.params; const paramsAfterIndex = params.splice(index); const { params: transformedParams, variableDeclaration } = buildVariableDeclarationFromParams(paramsAfterIndex, scope); - path - .get("body") // invariant: path.body is always a BlockStatement - .unshiftContainer("body", variableDeclaration); + path.get("body").unshiftContainer("body", variableDeclaration); params.push(...transformedParams); scope.crawl(); // the pattern will be handled by VariableDeclaration visitor. diff --git a/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/exec.js b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/exec.js new file mode 100644 index 000000000000..4e8130dbed03 --- /dev/null +++ b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/exec.js @@ -0,0 +1,9 @@ +var result; +class C { + static #x; + static { + var x; + result = do { ({#x: x = 2} = C); } + } +} +expect(result).toBe(C); diff --git a/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/input.js b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/input.js new file mode 100644 index 000000000000..a929a603b588 --- /dev/null +++ b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/input.js @@ -0,0 +1,8 @@ +var result; +class C { + static #x; + static { + var x; + result = do { ({#x: x = 2} = C); } + } +} diff --git a/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/options.json b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/options.json new file mode 100644 index 000000000000..637f74481731 --- /dev/null +++ b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + "proposal-do-expressions", + "proposal-destructuring-private", + "proposal-class-static-block", + "proposal-class-properties", + "proposal-private-methods", + ["proposal-object-rest-spread", { "useBuiltIns": true }] + ] +} diff --git a/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/output.js b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/output.js new file mode 100644 index 000000000000..6820a344d940 --- /dev/null +++ b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment--es2015/completion-do-expression/output.js @@ -0,0 +1,15 @@ +var result; + +class C {} + +var _x = { + writable: true, + value: void 0 +}; + +(() => { + var _m, _m2; + + var x; + result = (_m = C, _m2 = babelHelpers.classStaticPrivateFieldSpecGet(_m, C, _x), x = _m2 === void 0 ? 2 : _m2, _m); +})(); diff --git a/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/exec.js b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/exec.js new file mode 100644 index 000000000000..4e8130dbed03 --- /dev/null +++ b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/exec.js @@ -0,0 +1,9 @@ +var result; +class C { + static #x; + static { + var x; + result = do { ({#x: x = 2} = C); } + } +} +expect(result).toBe(C); diff --git a/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/input.js b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/input.js new file mode 100644 index 000000000000..a929a603b588 --- /dev/null +++ b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/input.js @@ -0,0 +1,8 @@ +var result; +class C { + static #x; + static { + var x; + result = do { ({#x: x = 2} = C); } + } +} diff --git a/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/options.json b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/options.json new file mode 100644 index 000000000000..fd0b65b50e67 --- /dev/null +++ b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/options.json @@ -0,0 +1,4 @@ +{ + "plugins": ["proposal-do-expressions", "proposal-destructuring-private"], + "minNodeVersion": "16.11.0" +} diff --git a/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/output.js b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/output.js new file mode 100644 index 000000000000..d32ee58d5442 --- /dev/null +++ b/packages/babel-plugin-proposal-destructuring-private/test/fixtures/assignment/completion-do-expression/output.js @@ -0,0 +1,11 @@ +var result; + +class C { + static #x; + static { + var _m, _m2; + + var x; + result = (_m = C, _m2 = _m.#x, x = _m2 === void 0 ? 2 : _m2, _m); + } +} diff --git a/packages/babel-traverse/src/path/introspection.ts b/packages/babel-traverse/src/path/introspection.ts index 7680d6b08b91..e55c161f3ef8 100644 --- a/packages/babel-traverse/src/path/introspection.ts +++ b/packages/babel-traverse/src/path/introspection.ts @@ -149,7 +149,11 @@ export function isCompletionRecord( if (Array.isArray(container) && path.key !== container.length - 1) { return false; } - } while ((path = path.parentPath) && !path.isProgram()); + } while ( + (path = path.parentPath) && + !path.isProgram() && + !path.isDoExpression() + ); return true; }