From 087405ee6c7d01cda4f4ccf927fc67f74e280858 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Sat, 11 Apr 2020 00:18:06 +0100 Subject: [PATCH 01/23] Skip TSAsExpression when transforming spread in CallExpression --- packages/babel-plugin-transform-spread/src/index.js | 13 ++++++++++--- .../test/fixtures/regression/11400/input.ts | 1 + .../test/fixtures/regression/11400/options.json | 7 +++++++ .../test/fixtures/regression/11400/output.js | 3 +++ 4 files changed, 21 insertions(+), 3 deletions(-) create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/regression/11400/input.ts create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/regression/11400/options.json create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/regression/11400/output.js diff --git a/packages/babel-plugin-transform-spread/src/index.js b/packages/babel-plugin-transform-spread/src/index.js index 16af42b08fd6..15c8b5817a09 100644 --- a/packages/babel-plugin-transform-spread/src/index.js +++ b/packages/babel-plugin-transform-spread/src/index.js @@ -94,7 +94,14 @@ export default declare((api, options) => { const args = node.arguments; if (!hasSpread(args)) return; - const calleePath = path.get("callee"); + let calleePath = path.get("callee"); + + if (calleePath.isTSAsExpression()) { + do { + calleePath = calleePath.get("expression"); + } while (calleePath.isTSAsExpression()); + } + if (calleePath.isSuper()) return; let contextLiteral = scope.buildUndefinedNode(); @@ -120,7 +127,7 @@ export default declare((api, options) => { node.arguments.push(first); } - const callee = node.callee; + const callee = calleePath.node; if (calleePath.isMemberExpression()) { const temp = scope.maybeGenerateMemoised(callee.object); @@ -132,7 +139,7 @@ export default declare((api, options) => { } t.appendToMemberExpression(callee, t.identifier("apply")); } else { - node.callee = t.memberExpression(node.callee, t.identifier("apply")); + node.callee = t.memberExpression(callee, t.identifier("apply")); } if (t.isSuper(contextLiteral)) { diff --git a/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/input.ts b/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/input.ts new file mode 100644 index 000000000000..a63a4cd574fa --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/input.ts @@ -0,0 +1 @@ +(dog.bark as any)(...args) \ No newline at end of file diff --git a/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/options.json b/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/options.json new file mode 100644 index 000000000000..7f73c527c1c2 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/options.json @@ -0,0 +1,7 @@ +{ + "presets": [ + [ + "typescript" + ] + ] +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/output.js b/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/output.js new file mode 100644 index 000000000000..d3814197145a --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/output.js @@ -0,0 +1,3 @@ +var _dog; + +(_dog = dog).bark.apply(_dog, babelHelpers.toConsumableArray(args)); From e090927cd1e5138ae178287ee14befb88ee2e847 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Sun, 3 May 2020 23:27:28 +0100 Subject: [PATCH 02/23] Create @babel/helper-get-call-context package --- .../babel-helper-get-call-context/.npmignore | 3 +++ .../babel-helper-get-call-context/README.md | 17 +++++++++++++++++ .../babel-helper-get-call-context/package.json | 14 ++++++++++++++ .../babel-helper-get-call-context/src/index.js | 18 ++++++++++++++++++ .../babel-plugin-transform-spread/package.json | 3 ++- .../babel-plugin-transform-spread/src/index.js | 9 ++------- .../call-context/flow-type-cast/input.ts | 1 + .../call-context/flow-type-cast/options.json | 7 +++++++ .../call-context/flow-type-cast/output.js | 3 +++ .../test/fixtures/call-context/options.json | 3 +++ .../parenthesized-expressions/input.js | 1 + .../parenthesized-expressions/options.json | 5 +++++ .../parenthesized-expressions/output.js | 3 +++ .../call-context/ts-as-class-field/input.ts | 7 +++++++ .../ts-as-class-field/options.json | 12 ++++++++++++ .../call-context/ts-as-class-field/output.js | 17 +++++++++++++++++ .../call-context/ts-type-cast/input.ts | 1 + .../call-context/ts-type-cast/options.json | 7 +++++++ .../call-context/ts-type-cast/output.js | 3 +++ .../test/fixtures/regression/11400/input.ts | 2 +- .../fixtures/regression/11400/options.json | 10 +++++----- 21 files changed, 132 insertions(+), 14 deletions(-) create mode 100644 packages/babel-helper-get-call-context/.npmignore create mode 100644 packages/babel-helper-get-call-context/README.md create mode 100644 packages/babel-helper-get-call-context/package.json create mode 100644 packages/babel-helper-get-call-context/src/index.js create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/input.ts create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/options.json create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/output.js create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/options.json create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/input.js create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/options.json create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/output.js create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/input.ts create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/options.json create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/output.js create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/input.ts create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/options.json create mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/output.js diff --git a/packages/babel-helper-get-call-context/.npmignore b/packages/babel-helper-get-call-context/.npmignore new file mode 100644 index 000000000000..f9806945836e --- /dev/null +++ b/packages/babel-helper-get-call-context/.npmignore @@ -0,0 +1,3 @@ +src +test +*.log diff --git a/packages/babel-helper-get-call-context/README.md b/packages/babel-helper-get-call-context/README.md new file mode 100644 index 000000000000..53d6e67ea741 --- /dev/null +++ b/packages/babel-helper-get-call-context/README.md @@ -0,0 +1,17 @@ +# @babel/helper-get-call-context + +> Helper function to get the context of a CallExpression + +## Install + +Using npm: + +```sh +npm install --save-dev @babel/helper-get-call-context +``` + +or using yarn: + +```sh +yarn add @babel/helper-get-call-context --dev +``` diff --git a/packages/babel-helper-get-call-context/package.json b/packages/babel-helper-get-call-context/package.json new file mode 100644 index 000000000000..0c59a8d5692c --- /dev/null +++ b/packages/babel-helper-get-call-context/package.json @@ -0,0 +1,14 @@ +{ + "name": "@babel/helper-get-call-context", + "version": "7.9.6", + "description": "Helper function to get call context", + "repository": "https://github.com/babel/babel/tree/master/packages/babel-helper-get-call-context", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "main": "lib/index.js", + "dependencies": { + "@babel/traverse": "^7.9.6" + } +} diff --git a/packages/babel-helper-get-call-context/src/index.js b/packages/babel-helper-get-call-context/src/index.js new file mode 100644 index 000000000000..4d0e33274369 --- /dev/null +++ b/packages/babel-helper-get-call-context/src/index.js @@ -0,0 +1,18 @@ +import type { NodePath } from "@babel/traverse"; + +export default function(callPath: NodePath): NodePath { + callPath.assertCallExpression(); + + let calleePath = callPath.get("callee"); + + while ( + calleePath.isTSAsExpression() || + calleePath.isTypeCastExpression() || + calleePath.isTSTypeAssertion() || + calleePath.isParenthesizedExpression() + ) { + calleePath = calleePath.get("expression"); + } + + return calleePath; +} diff --git a/packages/babel-plugin-transform-spread/package.json b/packages/babel-plugin-transform-spread/package.json index 1bcfe9a81492..1ccb3a4ef1b6 100644 --- a/packages/babel-plugin-transform-spread/package.json +++ b/packages/babel-plugin-transform-spread/package.json @@ -19,6 +19,7 @@ }, "devDependencies": { "@babel/core": "^7.8.3", - "@babel/helper-plugin-test-runner": "^7.8.3" + "@babel/helper-plugin-test-runner": "^7.8.3", + "@babel/helper-get-call-context": "7.9.6" } } diff --git a/packages/babel-plugin-transform-spread/src/index.js b/packages/babel-plugin-transform-spread/src/index.js index 15c8b5817a09..ed5a1f08af4a 100644 --- a/packages/babel-plugin-transform-spread/src/index.js +++ b/packages/babel-plugin-transform-spread/src/index.js @@ -1,4 +1,5 @@ import { declare } from "@babel/helper-plugin-utils"; +import getCallContext from "@babel/helper-get-call-context"; import { types as t } from "@babel/core"; export default declare((api, options) => { @@ -94,13 +95,7 @@ export default declare((api, options) => { const args = node.arguments; if (!hasSpread(args)) return; - let calleePath = path.get("callee"); - - if (calleePath.isTSAsExpression()) { - do { - calleePath = calleePath.get("expression"); - } while (calleePath.isTSAsExpression()); - } + const calleePath = getCallContext(path); if (calleePath.isSuper()) return; diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/input.ts b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/input.ts new file mode 100644 index 000000000000..8874581acdfa --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/input.ts @@ -0,0 +1 @@ +(a.b: any)(...args) diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/options.json b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/options.json new file mode 100644 index 000000000000..621ebc692798 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/options.json @@ -0,0 +1,7 @@ +{ + "presets": [ + [ + "flow" + ] + ] +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/output.js b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/output.js new file mode 100644 index 000000000000..721fb585e076 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/output.js @@ -0,0 +1,3 @@ +var _a; + +(_a = a).b.apply(_a, babelHelpers.toConsumableArray(args)); diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/options.json b/packages/babel-plugin-transform-spread/test/fixtures/call-context/options.json new file mode 100644 index 000000000000..e9f2daf0be9f --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["external-helpers", "transform-spread", "transform-parameters"] +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/input.js b/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/input.js new file mode 100644 index 000000000000..9467f61f0957 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/input.js @@ -0,0 +1 @@ +(a.b)(...args) diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/options.json b/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/options.json new file mode 100644 index 000000000000..2931a52b5b3f --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/options.json @@ -0,0 +1,5 @@ +{ + "parserOpts": { + "createParenthesizedExpressions": true + } +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/output.js b/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/output.js new file mode 100644 index 000000000000..ab23369a541d --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/output.js @@ -0,0 +1,3 @@ +var _a; + +((_a = a).b.apply)(_a, babelHelpers.toConsumableArray(args)); diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/input.ts b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/input.ts new file mode 100644 index 000000000000..e47087eb2535 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/input.ts @@ -0,0 +1,7 @@ +class A { + #x; + + fn() { + (this.#x as any)(...args); + } +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/options.json b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/options.json new file mode 100644 index 000000000000..26ba6c1902e1 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/options.json @@ -0,0 +1,12 @@ +{ + "presets": [ + [ + "typescript" + ] + ], + "plugins": [ + [ + "proposal-class-properties" + ] + ] +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/output.js b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/output.js new file mode 100644 index 000000000000..7b70c5cdc052 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/output.js @@ -0,0 +1,17 @@ +function _classPrivateFieldGet(receiver, privateMap) { var descriptor = privateMap.get(receiver); if (!descriptor) { throw new TypeError("attempted to get private field on non-instance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } + +class A { + constructor() { + _x.set(this, { + writable: true, + value: void 0 + }); + } + + fn() { + _classPrivateFieldGet(this, _x)(...args); + } + +} + +var _x = new WeakMap(); diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/input.ts b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/input.ts new file mode 100644 index 000000000000..354578c62526 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/input.ts @@ -0,0 +1 @@ +( a.b)(...args) diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/options.json b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/options.json new file mode 100644 index 000000000000..52dd0fd384e3 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/options.json @@ -0,0 +1,7 @@ +{ + "presets": [ + [ + "typescript" + ] + ] +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/output.js b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/output.js new file mode 100644 index 000000000000..721fb585e076 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/output.js @@ -0,0 +1,3 @@ +var _a; + +(_a = a).b.apply(_a, babelHelpers.toConsumableArray(args)); diff --git a/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/input.ts b/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/input.ts index a63a4cd574fa..2bf46926aef3 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/input.ts +++ b/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/input.ts @@ -1 +1 @@ -(dog.bark as any)(...args) \ No newline at end of file +(dog.bark as any)(...args) diff --git a/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/options.json b/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/options.json index 7f73c527c1c2..52dd0fd384e3 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/options.json +++ b/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/options.json @@ -1,7 +1,7 @@ { - "presets": [ - [ - "typescript" - ] + "presets": [ + [ + "typescript" ] -} \ No newline at end of file + ] +} From b41cc1023093c6ec626aa276a01944ae25c732f8 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Mon, 4 May 2020 20:47:40 +0100 Subject: [PATCH 03/23] Support OptionalCallExpressions --- packages/babel-helper-get-call-context/src/index.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/babel-helper-get-call-context/src/index.js b/packages/babel-helper-get-call-context/src/index.js index 4d0e33274369..1570a20f3053 100644 --- a/packages/babel-helper-get-call-context/src/index.js +++ b/packages/babel-helper-get-call-context/src/index.js @@ -1,7 +1,12 @@ import type { NodePath } from "@babel/traverse"; export default function(callPath: NodePath): NodePath { - callPath.assertCallExpression(); + if (!callPath.isCallExpression() && !callPath.isOptionalCallExpression()) { + throw new Error( + `Expected type "CallExpression" or "OptionalCallExpression" ` + + `but instead got "${callPath.type}".`, + ); + } let calleePath = callPath.get("callee"); From 2bdb62dbad15b6f91aea478e150ec5a4e54d53c5 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Sun, 17 May 2020 22:39:19 +0100 Subject: [PATCH 04/23] Use helper in optional chaining plugin, and move tests --- .../babel-plugin-proposal-optional-chaining/package.json | 3 ++- .../babel-plugin-proposal-optional-chaining/src/index.js | 9 ++++++++- .../test/fixtures/call-context/options.json | 3 +++ .../test/fixtures/call-context/ts-as/input.ts | 1 + .../test/fixtures/call-context/ts-as/options.json | 7 +++++++ .../test/fixtures/call-context/ts-as/output.js | 3 +++ .../test/fixtures/call-context/options.json | 6 ++++++ .../fixtures/call-context/ts-as-class-field/input.ts | 7 +++++++ .../fixtures/call-context/ts-as-class-field/options.json | 0 .../fixtures/call-context/ts-as-class-field/output.js | 2 +- .../fixtures/call-context/ts-as-class-field/input.ts | 7 ------- 11 files changed, 38 insertions(+), 10 deletions(-) create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/input.ts create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/output.js create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/options.json create mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/input.ts rename packages/{babel-plugin-transform-spread => babel-plugin-proposal-private-methods}/test/fixtures/call-context/ts-as-class-field/options.json (100%) rename packages/{babel-plugin-transform-spread => babel-plugin-proposal-private-methods}/test/fixtures/call-context/ts-as-class-field/output.js (90%) delete mode 100644 packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/input.ts diff --git a/packages/babel-plugin-proposal-optional-chaining/package.json b/packages/babel-plugin-proposal-optional-chaining/package.json index f63745683fb1..f88d408cb460 100644 --- a/packages/babel-plugin-proposal-optional-chaining/package.json +++ b/packages/babel-plugin-proposal-optional-chaining/package.json @@ -21,6 +21,7 @@ "devDependencies": { "@babel/core": "^7.9.0", "@babel/helper-plugin-test-runner": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3" + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/helper-get-call-context": "7.9.6" } } diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index 2cfce5263b46..81c6272ed7ab 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -1,4 +1,5 @@ import { declare } from "@babel/helper-plugin-utils"; +import getCallContext from "@babel/helper-get-call-context"; import syntaxOptionalChaining from "@babel/plugin-syntax-optional-chaining"; import { types as t } from "@babel/core"; @@ -26,6 +27,7 @@ export default declare((api, options) => { const { parentPath, scope } = path; let isDeleteOperation = false; const optionals = []; + const chains = []; let optionalPath = path; while ( @@ -35,6 +37,11 @@ export default declare((api, options) => { const { node } = optionalPath; if (node.optional) { optionals.push(node); + chains.push( + optionalPath.isOptionalCallExpression() + ? getCallContext(optionalPath)["node"] + : node["object"], + ); } if (optionalPath.isOptionalMemberExpression()) { @@ -56,7 +63,7 @@ export default declare((api, options) => { const isCall = t.isCallExpression(node); const replaceKey = isCall ? "callee" : "object"; - const chain = node[replaceKey]; + const chain = chains[i]; let ref; let check; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/options.json new file mode 100644 index 000000000000..43d8f4d114cc --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/options.json @@ -0,0 +1,3 @@ +{ + "plugins": ["proposal-optional-chaining"] +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/input.ts new file mode 100644 index 000000000000..1944afdc78e4 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/input.ts @@ -0,0 +1 @@ +(a.b as any)?.() \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/options.json new file mode 100644 index 000000000000..ff8375299b8b --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/options.json @@ -0,0 +1,7 @@ +{ + "presets": [ + [ + "typescript" + ] + ] +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/output.js new file mode 100644 index 000000000000..ee2ed75956d5 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/output.js @@ -0,0 +1,3 @@ +var _a$b, _a; + +(_a$b = (_a = a).b) === null || _a$b === void 0 ? void 0 : _a$b.call(_a); diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/options.json new file mode 100644 index 000000000000..1999700a40f4 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "proposal-private-methods", + "proposal-class-properties" + ] +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/input.ts b/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/input.ts new file mode 100644 index 000000000000..ad1209c78c47 --- /dev/null +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/input.ts @@ -0,0 +1,7 @@ +class A { + #x; + + fn() { + (this.#x as any)(); + } +} diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/options.json similarity index 100% rename from packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/options.json rename to packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/options.json diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/output.js similarity index 90% rename from packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/output.js rename to packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/output.js index 7b70c5cdc052..86dffffaf751 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/output.js +++ b/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/output.js @@ -9,7 +9,7 @@ class A { } fn() { - _classPrivateFieldGet(this, _x)(...args); + _classPrivateFieldGet(this, _x)(); } } diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/input.ts b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/input.ts deleted file mode 100644 index e47087eb2535..000000000000 --- a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-as-class-field/input.ts +++ /dev/null @@ -1,7 +0,0 @@ -class A { - #x; - - fn() { - (this.#x as any)(...args); - } -} From 06d092f6110946e121eec115f2b1465b40bc7698 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Sat, 23 May 2020 13:01:05 +0100 Subject: [PATCH 05/23] Update package.json files --- packages/babel-helper-get-call-context/package.json | 2 +- packages/babel-plugin-proposal-optional-chaining/package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/babel-helper-get-call-context/package.json b/packages/babel-helper-get-call-context/package.json index 0c59a8d5692c..f5f7cb237c92 100644 --- a/packages/babel-helper-get-call-context/package.json +++ b/packages/babel-helper-get-call-context/package.json @@ -8,7 +8,7 @@ "access": "public" }, "main": "lib/index.js", - "dependencies": { + "devDependencies": { "@babel/traverse": "^7.9.6" } } diff --git a/packages/babel-plugin-proposal-optional-chaining/package.json b/packages/babel-plugin-proposal-optional-chaining/package.json index f88d408cb460..afcf85dfaf01 100644 --- a/packages/babel-plugin-proposal-optional-chaining/package.json +++ b/packages/babel-plugin-proposal-optional-chaining/package.json @@ -22,6 +22,6 @@ "@babel/core": "^7.9.0", "@babel/helper-plugin-test-runner": "^7.8.3", "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/helper-get-call-context": "7.9.6" + "@babel/helper-get-call-context": "^7.9.6" } } From ed10970ad8e9fc6bf2094330eebac3792a6aea31 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Sat, 23 May 2020 13:02:06 +0100 Subject: [PATCH 06/23] Use dot notation to access property --- packages/babel-plugin-proposal-optional-chaining/src/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index 81c6272ed7ab..12834eb321c2 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -39,8 +39,8 @@ export default declare((api, options) => { optionals.push(node); chains.push( optionalPath.isOptionalCallExpression() - ? getCallContext(optionalPath)["node"] - : node["object"], + ? getCallContext(optionalPath).node + : node.object, ); } From 1d957b3203c95150c8fc9980983e1f64c77e7d01 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Sat, 23 May 2020 13:05:55 +0100 Subject: [PATCH 07/23] Remove private method tests until future MR --- .../test/fixtures/call-context/options.json | 6 ------ .../call-context/ts-as-class-field/input.ts | 7 ------- .../call-context/ts-as-class-field/options.json | 12 ------------ .../call-context/ts-as-class-field/output.js | 17 ----------------- 4 files changed, 42 deletions(-) delete mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/options.json delete mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/input.ts delete mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/options.json delete mode 100644 packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/output.js diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/options.json deleted file mode 100644 index 1999700a40f4..000000000000 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/options.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "plugins": [ - "proposal-private-methods", - "proposal-class-properties" - ] -} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/input.ts b/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/input.ts deleted file mode 100644 index ad1209c78c47..000000000000 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/input.ts +++ /dev/null @@ -1,7 +0,0 @@ -class A { - #x; - - fn() { - (this.#x as any)(); - } -} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/options.json b/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/options.json deleted file mode 100644 index 26ba6c1902e1..000000000000 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/options.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "presets": [ - [ - "typescript" - ] - ], - "plugins": [ - [ - "proposal-class-properties" - ] - ] -} diff --git a/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/output.js b/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/output.js deleted file mode 100644 index 86dffffaf751..000000000000 --- a/packages/babel-plugin-proposal-private-methods/test/fixtures/call-context/ts-as-class-field/output.js +++ /dev/null @@ -1,17 +0,0 @@ -function _classPrivateFieldGet(receiver, privateMap) { var descriptor = privateMap.get(receiver); if (!descriptor) { throw new TypeError("attempted to get private field on non-instance"); } if (descriptor.get) { return descriptor.get.call(receiver); } return descriptor.value; } - -class A { - constructor() { - _x.set(this, { - writable: true, - value: void 0 - }); - } - - fn() { - _classPrivateFieldGet(this, _x)(); - } - -} - -var _x = new WeakMap(); From 5d7c306359bea4fbe820310f0ed726edd3cbdfe4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B2=20Ribaudo?= Date: Sat, 23 May 2020 23:46:21 +0200 Subject: [PATCH 08/23] Update packages/babel-plugin-transform-spread/package.json --- packages/babel-plugin-transform-spread/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-plugin-transform-spread/package.json b/packages/babel-plugin-transform-spread/package.json index 1ccb3a4ef1b6..8084f5a1e160 100644 --- a/packages/babel-plugin-transform-spread/package.json +++ b/packages/babel-plugin-transform-spread/package.json @@ -20,6 +20,6 @@ "devDependencies": { "@babel/core": "^7.8.3", "@babel/helper-plugin-test-runner": "^7.8.3", - "@babel/helper-get-call-context": "7.9.6" + "@babel/helper-get-call-context": "^7.9.6" } } From defdad1cc11b26ce29d3a817665d2d6cba91b6be Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Sat, 23 May 2020 22:11:36 +0100 Subject: [PATCH 09/23] Rename @babel/helper-get-call-context to @babel/helper-skip-transparent-expr-wrappers --- .../babel-helper-get-call-context/README.md | 17 ------------ .../src/index.js | 23 ---------------- .../.npmignore | 0 .../README.md | 17 ++++++++++++ .../package.json | 8 +++--- .../src/index.js | 26 +++++++++++++++++++ .../package.json | 2 +- .../src/index.js | 2 +- .../package.json | 2 +- .../src/index.js | 2 +- 10 files changed, 51 insertions(+), 48 deletions(-) delete mode 100644 packages/babel-helper-get-call-context/README.md delete mode 100644 packages/babel-helper-get-call-context/src/index.js rename packages/{babel-helper-get-call-context => babel-helper-skip-transparent-expr-wrappers}/.npmignore (100%) create mode 100644 packages/babel-helper-skip-transparent-expr-wrappers/README.md rename packages/{babel-helper-get-call-context => babel-helper-skip-transparent-expr-wrappers}/package.json (58%) create mode 100644 packages/babel-helper-skip-transparent-expr-wrappers/src/index.js diff --git a/packages/babel-helper-get-call-context/README.md b/packages/babel-helper-get-call-context/README.md deleted file mode 100644 index 53d6e67ea741..000000000000 --- a/packages/babel-helper-get-call-context/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# @babel/helper-get-call-context - -> Helper function to get the context of a CallExpression - -## Install - -Using npm: - -```sh -npm install --save-dev @babel/helper-get-call-context -``` - -or using yarn: - -```sh -yarn add @babel/helper-get-call-context --dev -``` diff --git a/packages/babel-helper-get-call-context/src/index.js b/packages/babel-helper-get-call-context/src/index.js deleted file mode 100644 index 1570a20f3053..000000000000 --- a/packages/babel-helper-get-call-context/src/index.js +++ /dev/null @@ -1,23 +0,0 @@ -import type { NodePath } from "@babel/traverse"; - -export default function(callPath: NodePath): NodePath { - if (!callPath.isCallExpression() && !callPath.isOptionalCallExpression()) { - throw new Error( - `Expected type "CallExpression" or "OptionalCallExpression" ` + - `but instead got "${callPath.type}".`, - ); - } - - let calleePath = callPath.get("callee"); - - while ( - calleePath.isTSAsExpression() || - calleePath.isTypeCastExpression() || - calleePath.isTSTypeAssertion() || - calleePath.isParenthesizedExpression() - ) { - calleePath = calleePath.get("expression"); - } - - return calleePath; -} diff --git a/packages/babel-helper-get-call-context/.npmignore b/packages/babel-helper-skip-transparent-expr-wrappers/.npmignore similarity index 100% rename from packages/babel-helper-get-call-context/.npmignore rename to packages/babel-helper-skip-transparent-expr-wrappers/.npmignore diff --git a/packages/babel-helper-skip-transparent-expr-wrappers/README.md b/packages/babel-helper-skip-transparent-expr-wrappers/README.md new file mode 100644 index 000000000000..7ec736e14617 --- /dev/null +++ b/packages/babel-helper-skip-transparent-expr-wrappers/README.md @@ -0,0 +1,17 @@ +# @babel/helper-skip-transparent-expr-wrappers + +> Helper which skips types and parentheses + +## Install + +Using npm: + +```sh +npm install --save-dev @babel/helper-skip-transparent-expr-wrappers +``` + +or using yarn: + +```sh +yarn add @babel/helper-skip-transparent-expr-wrappers --dev +``` diff --git a/packages/babel-helper-get-call-context/package.json b/packages/babel-helper-skip-transparent-expr-wrappers/package.json similarity index 58% rename from packages/babel-helper-get-call-context/package.json rename to packages/babel-helper-skip-transparent-expr-wrappers/package.json index f5f7cb237c92..4a076aca4ca1 100644 --- a/packages/babel-helper-get-call-context/package.json +++ b/packages/babel-helper-skip-transparent-expr-wrappers/package.json @@ -1,8 +1,8 @@ { - "name": "@babel/helper-get-call-context", + "name": "@babel/helper-skip-transparent-expr-wrappers", "version": "7.9.6", - "description": "Helper function to get call context", - "repository": "https://github.com/babel/babel/tree/master/packages/babel-helper-get-call-context", + "description": "Helper which skips types and parentheses", + "repository": "https://github.com/babel/babel/tree/master/packages/babel/helper-skip-transparent-expr-wrappers", "license": "MIT", "publishConfig": { "access": "public" @@ -11,4 +11,4 @@ "devDependencies": { "@babel/traverse": "^7.9.6" } -} +} \ No newline at end of file diff --git a/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js b/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js new file mode 100644 index 000000000000..f263ce9ed5f0 --- /dev/null +++ b/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js @@ -0,0 +1,26 @@ +import type { NodePath } from "@babel/traverse"; + +export function getCallContext(callPath: NodePath): NodePath { + if (!callPath.isCallExpression() && !callPath.isOptionalCallExpression()) { + throw new Error( + `Expected type "CallExpression" or "OptionalCallExpression" ` + + `but instead got "${callPath.type}".`, + ); + } + + const calleePath = callPath.get("callee"); + return skipTransparentExprWrappers(calleePath); +} + +export default function skipTransparentExprWrappers(path: NodePath): NodePath { + while ( + path.isTSAsExpression() || + path.isTypeCastExpression() || + path.isTSTypeAssertion() || + path.isParenthesizedExpression() + ) { + path = path.get("expression"); + } + + return path; +} diff --git a/packages/babel-plugin-proposal-optional-chaining/package.json b/packages/babel-plugin-proposal-optional-chaining/package.json index afcf85dfaf01..cfd3d3403e31 100644 --- a/packages/babel-plugin-proposal-optional-chaining/package.json +++ b/packages/babel-plugin-proposal-optional-chaining/package.json @@ -22,6 +22,6 @@ "@babel/core": "^7.9.0", "@babel/helper-plugin-test-runner": "^7.8.3", "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/helper-get-call-context": "^7.9.6" + "@babel/helper-skip-transparent-expr-wrappers": "^7.9.6" } } diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index 12834eb321c2..2f48434e3407 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -1,5 +1,5 @@ import { declare } from "@babel/helper-plugin-utils"; -import getCallContext from "@babel/helper-get-call-context"; +import { getCallContext } from "@babel/helper-skip-transparent-expr-wrappers"; import syntaxOptionalChaining from "@babel/plugin-syntax-optional-chaining"; import { types as t } from "@babel/core"; diff --git a/packages/babel-plugin-transform-spread/package.json b/packages/babel-plugin-transform-spread/package.json index 8084f5a1e160..91673a9eec3e 100644 --- a/packages/babel-plugin-transform-spread/package.json +++ b/packages/babel-plugin-transform-spread/package.json @@ -20,6 +20,6 @@ "devDependencies": { "@babel/core": "^7.8.3", "@babel/helper-plugin-test-runner": "^7.8.3", - "@babel/helper-get-call-context": "^7.9.6" + "@babel/helper-skip-transparent-expr-wrappers": "7.9.6" } } diff --git a/packages/babel-plugin-transform-spread/src/index.js b/packages/babel-plugin-transform-spread/src/index.js index ed5a1f08af4a..e8c93a614919 100644 --- a/packages/babel-plugin-transform-spread/src/index.js +++ b/packages/babel-plugin-transform-spread/src/index.js @@ -1,5 +1,5 @@ import { declare } from "@babel/helper-plugin-utils"; -import getCallContext from "@babel/helper-get-call-context"; +import { getCallContext } from "@babel/helper-skip-transparent-expr-wrappers"; import { types as t } from "@babel/core"; export default declare((api, options) => { From 8c3b44b81a0de8a46f10976f3d866f8d4bf546e6 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Sun, 24 May 2020 21:50:11 +0100 Subject: [PATCH 10/23] Handle typed OptionalMemberExpressions --- .../package.json | 3 ++ .../src/index.js | 17 +++++--- .../src/index.js | 39 ++++++++++++------- .../fixtures/call-context/ts-as/options.json | 7 ---- .../fixtures/call-context/ts-as/output.js | 3 -- .../options.json | 0 .../ts-as-call-context}/input.ts | 0 .../ts-as-call-context/options.json | 10 +++++ .../ts-as-call-context/output.js | 3 ++ .../ts-as-function-call-loose/input.ts | 1 + .../ts-as-function-call-loose/options.json | 13 +++++++ .../ts-as-function-call-loose/output.js | 3 ++ .../ts-as-member-expression/input.ts | 1 + .../ts-as-member-expression/options.json | 10 +++++ .../ts-as-member-expression/output.js | 3 ++ 15 files changed, 84 insertions(+), 29 deletions(-) delete mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/options.json delete mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/output.js rename packages/babel-plugin-proposal-optional-chaining/test/fixtures/{call-context => transparent-expr-wrappers}/options.json (100%) rename packages/babel-plugin-proposal-optional-chaining/test/fixtures/{call-context/ts-as => transparent-expr-wrappers/ts-as-call-context}/input.ts (100%) create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/output.js create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/input.ts create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/output.js create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/input.ts create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/output.js diff --git a/packages/babel-helper-skip-transparent-expr-wrappers/package.json b/packages/babel-helper-skip-transparent-expr-wrappers/package.json index 4a076aca4ca1..29703802884f 100644 --- a/packages/babel-helper-skip-transparent-expr-wrappers/package.json +++ b/packages/babel-helper-skip-transparent-expr-wrappers/package.json @@ -8,6 +8,9 @@ "access": "public" }, "main": "lib/index.js", + "dependencies": { + "@babel/types": "^7.9.6" + }, "devDependencies": { "@babel/traverse": "^7.9.6" } diff --git a/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js b/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js index f263ce9ed5f0..e99956ad41e9 100644 --- a/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js +++ b/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js @@ -1,3 +1,4 @@ +import * as t from "@babel/types"; import type { NodePath } from "@babel/traverse"; export function getCallContext(callPath: NodePath): NodePath { @@ -12,13 +13,17 @@ export function getCallContext(callPath: NodePath): NodePath { return skipTransparentExprWrappers(calleePath); } +export function isTransparentExprWrapper(node: Node) { + return ( + t.isTSAsExpression(node) || + t.isTypeCastExpression(node) || + t.isTSTypeAssertion(node) || + t.isParenthesizedExpression(node) + ); +} + export default function skipTransparentExprWrappers(path: NodePath): NodePath { - while ( - path.isTSAsExpression() || - path.isTypeCastExpression() || - path.isTSTypeAssertion() || - path.isParenthesizedExpression() - ) { + while (isTransparentExprWrapper(path.node)) { path = path.get("expression"); } diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index 2f48434e3407..44e18c623394 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -1,5 +1,7 @@ import { declare } from "@babel/helper-plugin-utils"; -import { getCallContext } from "@babel/helper-skip-transparent-expr-wrappers"; +import skipTransparentExprWrappers, { + getCallContext, +} from "@babel/helper-skip-transparent-expr-wrappers"; import syntaxOptionalChaining from "@babel/plugin-syntax-optional-chaining"; import { types as t } from "@babel/core"; @@ -37,19 +39,26 @@ export default declare((api, options) => { const { node } = optionalPath; if (node.optional) { optionals.push(node); + chains.push( optionalPath.isOptionalCallExpression() - ? getCallContext(optionalPath).node - : node.object, + ? [getCallContext(optionalPath).node, node.callee] + : [ + skipTransparentExprWrappers(optionalPath.get("object")) + .node, + node.object, + ], ); } if (optionalPath.isOptionalMemberExpression()) { optionalPath.node.type = "MemberExpression"; - optionalPath = optionalPath.get("object"); + optionalPath = skipTransparentExprWrappers( + optionalPath.get("object"), + ); } else if (optionalPath.isOptionalCallExpression()) { optionalPath.node.type = "CallExpression"; - optionalPath = optionalPath.get("callee"); + optionalPath = getCallContext(optionalPath); } } @@ -63,7 +72,7 @@ export default declare((api, options) => { const isCall = t.isCallExpression(node); const replaceKey = isCall ? "callee" : "object"; - const chain = chains[i]; + const [chain, chainWithTypes] = chains[i]; let ref; let check; @@ -71,20 +80,22 @@ export default declare((api, options) => { // If we are using a loose transform (avoiding a Function#call) and we are at the call, // we can avoid a needless memoize. We only do this if the callee is a simple member // expression, to avoid multiple calls to nested call expressions. - check = ref = chain; + check = ref = chainWithTypes; } else { ref = scope.maybeGenerateMemoised(chain); if (ref) { check = t.assignmentExpression( "=", t.cloneNode(ref), - // Here `chain` MUST NOT be cloned because it could be updated - // when generating the memoised context of a call espression - chain, + // Here `chainWithTypes` MUST NOT be cloned because it could be + // updated when generating the memoised context of a call + // expression + chainWithTypes, ); + node[replaceKey] = ref; } else { - check = ref = chain; + check = ref = chainWithTypes; } } @@ -94,7 +105,7 @@ export default declare((api, options) => { if (loose && isSimpleMemberExpression(chain)) { // To avoid a Function#call, we can instead re-grab the property from the context object. // `a.?b.?()` translates roughly to `_a.b != null && _a.b()` - node.callee = chain; + node.callee = chainWithTypes; } else { // Otherwise, we need to memoize the context object, and change the call into a Function#call. // `a.?b.?()` translates roughly to `(_b = _a.b) != null && _b.call(_a)` @@ -140,7 +151,9 @@ export default declare((api, options) => { ), ); - replacementPath = replacementPath.get("alternate"); + replacementPath = skipTransparentExprWrappers( + replacementPath.get("alternate"), + ); } }, }, diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/options.json deleted file mode 100644 index ff8375299b8b..000000000000 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/options.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "presets": [ - [ - "typescript" - ] - ] -} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/output.js deleted file mode 100644 index ee2ed75956d5..000000000000 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/output.js +++ /dev/null @@ -1,3 +0,0 @@ -var _a$b, _a; - -(_a$b = (_a = a).b) === null || _a$b === void 0 ? void 0 : _a$b.call(_a); diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/options.json similarity index 100% rename from packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/options.json rename to packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/options.json diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/input.ts similarity index 100% rename from packages/babel-plugin-proposal-optional-chaining/test/fixtures/call-context/ts-as/input.ts rename to packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/input.ts diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/options.json new file mode 100644 index 000000000000..e91812d3de0e --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + [ + "syntax-typescript" + ], + [ + "proposal-optional-chaining" + ] + ] +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/output.js new file mode 100644 index 000000000000..bbb88cd031aa --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/output.js @@ -0,0 +1,3 @@ +var _a$b, _a; + +(_a$b = ((_a = a).b as any)) === null || _a$b === void 0 ? void 0 : _a$b.call(_a); diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/input.ts new file mode 100644 index 000000000000..ca221a3ba660 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/input.ts @@ -0,0 +1 @@ +(((foo as A).bar) as B)?.(foo.bar, false) \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/options.json new file mode 100644 index 000000000000..0575c60b5c15 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/options.json @@ -0,0 +1,13 @@ +{ + "plugins": [ + [ + "syntax-typescript" + ], + [ + "proposal-optional-chaining", + { + "loose": true + } + ] + ] +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/output.js new file mode 100644 index 000000000000..93a8b5c45d88 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/output.js @@ -0,0 +1,3 @@ +var _bar, _ref; + +(_bar = ((_ref = (foo as A)).bar as B)) == null ? void 0 : _bar.call(_ref, foo.bar, false); diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/input.ts new file mode 100644 index 000000000000..6288bbd816a4 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/input.ts @@ -0,0 +1 @@ +(a?.b as ExampleType)?.c as ExampleType2 \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/options.json new file mode 100644 index 000000000000..e91812d3de0e --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + [ + "syntax-typescript" + ], + [ + "proposal-optional-chaining" + ] + ] +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/output.js new file mode 100644 index 000000000000..8839b068263f --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/output.js @@ -0,0 +1,3 @@ +var _a, _a$b; + +(((_a = a) === null || _a === void 0 ? void 0 : (_a$b = (_a.b as ExampleType)) === null || _a$b === void 0 ? void 0 : _a$b.c) as ExampleType2); From db8f8c326ac83399fce02d04c84a6ac481d59a79 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Sun, 24 May 2020 21:52:43 +0100 Subject: [PATCH 11/23] Make @babel/helper-skip-transparent-expr-wrappers a dependency --- .../babel-plugin-proposal-optional-chaining/package.json | 6 +++--- packages/babel-plugin-transform-spread/package.json | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/babel-plugin-proposal-optional-chaining/package.json b/packages/babel-plugin-proposal-optional-chaining/package.json index cfd3d3403e31..a1c2202069de 100644 --- a/packages/babel-plugin-proposal-optional-chaining/package.json +++ b/packages/babel-plugin-proposal-optional-chaining/package.json @@ -13,7 +13,8 @@ ], "dependencies": { "@babel/helper-plugin-utils": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.0" + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/helper-skip-transparent-expr-wrappers": "^7.9.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" @@ -21,7 +22,6 @@ "devDependencies": { "@babel/core": "^7.9.0", "@babel/helper-plugin-test-runner": "^7.8.3", - "@babel/plugin-transform-block-scoping": "^7.8.3", - "@babel/helper-skip-transparent-expr-wrappers": "^7.9.6" + "@babel/plugin-transform-block-scoping": "^7.8.3" } } diff --git a/packages/babel-plugin-transform-spread/package.json b/packages/babel-plugin-transform-spread/package.json index 91673a9eec3e..55dd69852fc9 100644 --- a/packages/babel-plugin-transform-spread/package.json +++ b/packages/babel-plugin-transform-spread/package.json @@ -12,14 +12,14 @@ "babel-plugin" ], "dependencies": { - "@babel/helper-plugin-utils": "^7.8.3" + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/helper-skip-transparent-expr-wrappers": "7.9.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" }, "devDependencies": { "@babel/core": "^7.8.3", - "@babel/helper-plugin-test-runner": "^7.8.3", - "@babel/helper-skip-transparent-expr-wrappers": "7.9.6" + "@babel/helper-plugin-test-runner": "^7.8.3" } } From c69c9219881586b37903a23bdb49f7dfc1488eb2 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Sun, 31 May 2020 21:46:28 +0100 Subject: [PATCH 12/23] Support TSNonNullExpressions --- .../babel-helper-skip-transparent-expr-wrappers/src/index.js | 3 ++- .../babel-plugin-proposal-optional-chaining/src/index.js | 5 ----- .../regression/10959-transform-optional-chaining/output.js | 4 ++-- .../10959-transform-ts-and-optional-chaining/output.js | 4 ++-- 4 files changed, 6 insertions(+), 10 deletions(-) diff --git a/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js b/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js index e99956ad41e9..27db35963277 100644 --- a/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js +++ b/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js @@ -16,8 +16,9 @@ export function getCallContext(callPath: NodePath): NodePath { export function isTransparentExprWrapper(node: Node) { return ( t.isTSAsExpression(node) || - t.isTypeCastExpression(node) || t.isTSTypeAssertion(node) || + t.isTSNonNullExpression(node) || + t.isTypeCastExpression(node) || t.isParenthesizedExpression(node) ); } diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index a07a06605708..44e18c623394 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -60,11 +60,6 @@ export default declare((api, options) => { optionalPath.node.type = "CallExpression"; optionalPath = getCallContext(optionalPath); } - - // unwrap a TSNonNullExpression if need - if (optionalPath.isTSNonNullExpression()) { - optionalPath = optionalPath.get("expression"); - } } let replacementPath = path; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-optional-chaining/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-optional-chaining/output.js index 5bcddf99c677..06ce1ed5c674 100644 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-optional-chaining/output.js +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-optional-chaining/output.js @@ -1,10 +1,10 @@ -var _a, _a2, _a3, _b, _a4, _ref, _a5, _c, _a6, _a7; +var _a, _a2, _a3, _b, _a4, _a4$b, _a5, _c, _a6, _a7; (_a = a) === null || _a === void 0 ? void 0 : _a.b!.c; (_a2 = a) === null || _a2 === void 0 ? void 0 : _a2.b!.c.d; (_a3 = a) === null || _a3 === void 0 ? void 0 : _a3.b.c!.d; (_b = a!.b) === null || _b === void 0 ? void 0 : _b.c; -(_a4 = a) === null || _a4 === void 0 ? void 0 : (_ref = _a4.b!) === null || _ref === void 0 ? void 0 : _ref.c; +(_a4 = a) === null || _a4 === void 0 ? void 0 : (_a4$b = _a4.b!) === null || _a4$b === void 0 ? void 0 : _a4$b.c; (_a5 = a) === null || _a5 === void 0 ? void 0 : (_c = _a5.b!.c) === null || _c === void 0 ? void 0 : _c.c; ((_a6 = a) === null || _a6 === void 0 ? void 0 : _a6.b)!.c; ((_a7 = a) === null || _a7 === void 0 ? void 0 : _a7.b)!.c; diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts-and-optional-chaining/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts-and-optional-chaining/output.js index 8af9f8dc0f23..56db11f31615 100644 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts-and-optional-chaining/output.js +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/regression/10959-transform-ts-and-optional-chaining/output.js @@ -1,10 +1,10 @@ -var _a, _a2, _a3, _b, _a4, _ref, _a5, _c, _a6, _a7; +var _a, _a2, _a3, _b, _a4, _a4$b, _a5, _c, _a6, _a7; (_a = a) === null || _a === void 0 ? void 0 : _a.b.c; (_a2 = a) === null || _a2 === void 0 ? void 0 : _a2.b.c.d; (_a3 = a) === null || _a3 === void 0 ? void 0 : _a3.b.c.d; (_b = a.b) === null || _b === void 0 ? void 0 : _b.c; -(_a4 = a) === null || _a4 === void 0 ? void 0 : (_ref = _a4.b) === null || _ref === void 0 ? void 0 : _ref.c; +(_a4 = a) === null || _a4 === void 0 ? void 0 : (_a4$b = _a4.b) === null || _a4$b === void 0 ? void 0 : _a4$b.c; (_a5 = a) === null || _a5 === void 0 ? void 0 : (_c = _a5.b.c) === null || _c === void 0 ? void 0 : _c.c; ((_a6 = a) === null || _a6 === void 0 ? void 0 : _a6.b).c; ((_a7 = a) === null || _a7 === void 0 ? void 0 : _a7.b).c; From db8f57a5e101b0495a49d4405893b6a27cc3204b Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Sun, 31 May 2020 21:48:24 +0100 Subject: [PATCH 13/23] Use named import instead of default --- .../babel-helper-skip-transparent-expr-wrappers/src/index.js | 2 +- packages/babel-plugin-proposal-optional-chaining/src/index.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js b/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js index 27db35963277..22817046cdfc 100644 --- a/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js +++ b/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js @@ -23,7 +23,7 @@ export function isTransparentExprWrapper(node: Node) { ); } -export default function skipTransparentExprWrappers(path: NodePath): NodePath { +export function skipTransparentExprWrappers(path: NodePath): NodePath { while (isTransparentExprWrapper(path.node)) { path = path.get("expression"); } diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index 44e18c623394..1b72dde682a5 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -1,5 +1,6 @@ import { declare } from "@babel/helper-plugin-utils"; -import skipTransparentExprWrappers, { +import { + skipTransparentExprWrappers, getCallContext, } from "@babel/helper-skip-transparent-expr-wrappers"; import syntaxOptionalChaining from "@babel/plugin-syntax-optional-chaining"; From 4e49c03e19107b8338345c9f3a32de28b023bc82 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Tue, 2 Jun 2020 00:05:55 +0100 Subject: [PATCH 14/23] Add test for call context when parenthesized call expression has type --- .../ts-parenthesized-expression-member-call/input.ts | 1 + .../options.json | 10 ++++++++++ .../ts-parenthesized-expression-member-call/output.js | 3 +++ 3 files changed, 14 insertions(+) create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/input.ts create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/options.json create mode 100644 packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/output.js diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/input.ts new file mode 100644 index 000000000000..c8dafc8b0c85 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/input.ts @@ -0,0 +1 @@ +((o?.Foo.m) as ExampleType)() \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/options.json new file mode 100644 index 000000000000..cf050c206707 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/options.json @@ -0,0 +1,10 @@ +{ + "plugins": [ + [ + "syntax-typescript" + ], + [ + "proposal-optional-chaining" + ] + ] +} \ No newline at end of file diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/output.js b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/output.js new file mode 100644 index 000000000000..ca86081c2b97 --- /dev/null +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/output.js @@ -0,0 +1,3 @@ +var _o, _o$Foo; + +(((_o = o) === null || _o === void 0 ? void 0 : (_o$Foo = _o.Foo).m.bind(_o$Foo)) as ExampleType)(); From e40676b68e590eb9d36fd7436090a5f44aff33d1 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Mon, 29 Jun 2020 23:14:09 +0100 Subject: [PATCH 15/23] Improve handling of member expressions inside transparent expression wrappers --- packages/babel-plugin-transform-spread/src/index.js | 6 +++--- .../call-context/parenthesized-expressions/output.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/babel-plugin-transform-spread/src/index.js b/packages/babel-plugin-transform-spread/src/index.js index 17f621acba2f..cdaeefea279e 100644 --- a/packages/babel-plugin-transform-spread/src/index.js +++ b/packages/babel-plugin-transform-spread/src/index.js @@ -132,11 +132,11 @@ export default declare((api, options) => { } else { contextLiteral = t.cloneNode(callee.object); } - t.appendToMemberExpression(callee, t.identifier("apply")); - } else { - node.callee = t.memberExpression(callee, t.identifier("apply")); } + // We use the original callee here, to preserve any types/parentheses + node.callee = t.memberExpression(node.callee, t.identifier("apply")); + if (t.isSuper(contextLiteral)) { contextLiteral = t.thisExpression(); } diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/output.js b/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/output.js index ab23369a541d..f0a0a9b7819f 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/output.js +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/output.js @@ -1,3 +1,3 @@ var _a; -((_a = a).b.apply)(_a, babelHelpers.toConsumableArray(args)); +((_a = a).b).apply(_a, babelHelpers.toConsumableArray(args)); From dd1b57d0407b08336ce222ac88b237aef31b13e9 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Mon, 29 Jun 2020 23:15:48 +0100 Subject: [PATCH 16/23] Add comment explaining what a transparent expression wrapper is --- .../babel-helper-skip-transparent-expr-wrappers/src/index.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js b/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js index 22817046cdfc..9235e02b4f54 100644 --- a/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js +++ b/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js @@ -13,6 +13,11 @@ export function getCallContext(callPath: NodePath): NodePath { return skipTransparentExprWrappers(calleePath); } +// A transparent expression wrapper is an AST node that most plugins will wish +// to skip, as its presence does not affect the behaviour of the code. This +// includes expressions used for types, and extra parenthesis. For example, in +// (a as any)(), this helper can be used to skip the TSAsExpression when +// determining the callee. export function isTransparentExprWrapper(node: Node) { return ( t.isTSAsExpression(node) || From 42504711d62ef86348ddbede061ad351af79d6c4 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Mon, 29 Jun 2020 23:25:07 +0100 Subject: [PATCH 17/23] Add newlines to test fixtures --- .../transparent-expr-wrappers/ts-as-call-context/input.ts | 2 +- .../transparent-expr-wrappers/ts-as-call-context/options.json | 2 +- .../ts-as-function-call-loose/input.ts | 2 +- .../ts-as-function-call-loose/options.json | 2 +- .../transparent-expr-wrappers/ts-as-member-expression/input.ts | 2 +- .../ts-as-member-expression/options.json | 2 +- .../ts-parenthesized-expression-member-call/input.ts | 2 +- .../ts-parenthesized-expression-member-call/options.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/input.ts index 1944afdc78e4..45e75935cbab 100644 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/input.ts +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/input.ts @@ -1 +1 @@ -(a.b as any)?.() \ No newline at end of file +(a.b as any)?.() diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/options.json index e91812d3de0e..3d509031920b 100644 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/options.json +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-call-context/options.json @@ -7,4 +7,4 @@ "proposal-optional-chaining" ] ] -} \ No newline at end of file +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/input.ts index ca221a3ba660..bbb299ce47a9 100644 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/input.ts +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/input.ts @@ -1 +1 @@ -(((foo as A).bar) as B)?.(foo.bar, false) \ No newline at end of file +(((foo as A).bar) as B)?.(foo.bar, false) diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/options.json index 0575c60b5c15..873ed97e39f7 100644 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/options.json +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-function-call-loose/options.json @@ -10,4 +10,4 @@ } ] ] -} \ No newline at end of file +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/input.ts index 6288bbd816a4..fe8740240481 100644 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/input.ts +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/input.ts @@ -1 +1 @@ -(a?.b as ExampleType)?.c as ExampleType2 \ No newline at end of file +(a?.b as ExampleType)?.c as ExampleType2 diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/options.json index e91812d3de0e..3d509031920b 100644 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/options.json +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-as-member-expression/options.json @@ -7,4 +7,4 @@ "proposal-optional-chaining" ] ] -} \ No newline at end of file +} diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/input.ts b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/input.ts index c8dafc8b0c85..db9e53a2762a 100644 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/input.ts +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/input.ts @@ -1 +1 @@ -((o?.Foo.m) as ExampleType)() \ No newline at end of file +((o?.Foo.m) as ExampleType)() diff --git a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/options.json b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/options.json index cf050c206707..00511863bbd0 100644 --- a/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/options.json +++ b/packages/babel-plugin-proposal-optional-chaining/test/fixtures/transparent-expr-wrappers/ts-parenthesized-expression-member-call/options.json @@ -7,4 +7,4 @@ "proposal-optional-chaining" ] ] -} \ No newline at end of file +} From 7069abe32b17fde245ac655189b9de83f09e7874 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Tue, 30 Jun 2020 22:24:58 +0100 Subject: [PATCH 18/23] Pass correct parameter type to skipTransparentExprWrappers --- .../src/index.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index 231b907059e3..51a659f7e03c 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -144,19 +144,19 @@ export default declare((api, options) => { // i.e. `?.b` in `(a?.b.c)()` if (i === 0 && parentIsCall) { // `(a?.b)()` to `(a == null ? undefined : a.b.bind(a))()` - const { object } = replacement; + const object = skipTransparentExprWrappers( + replacementPath.get("object"), + ).node; let baseRef; if (!loose || !isSimpleMemberExpression(object)) { // memoize the context object in non-loose mode // `(a?.b.c)()` to `(a == null ? undefined : (_a$b = a.b).c.bind(_a$b))()` - baseRef = scope.maybeGenerateMemoised( - skipTransparentExprWrappers(object), - ); + baseRef = scope.maybeGenerateMemoised(object); if (baseRef) { replacement.object = t.assignmentExpression( "=", baseRef, - skipTransparentExprWrappers(object), + object, ); } } From 0704742e65b7e8f9762056f421f1b379bb082223 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Fri, 3 Jul 2020 18:39:38 +0100 Subject: [PATCH 19/23] Rename to babel-helper-skip-transparent-expression-wrappers --- .../README.md | 17 ----------------- .../.npmignore | 0 .../README.md | 17 +++++++++++++++++ .../package.json | 4 ++-- .../src/index.js | 0 .../package.json | 2 +- .../src/index.js | 2 +- .../babel-plugin-transform-spread/package.json | 2 +- .../babel-plugin-transform-spread/src/index.js | 2 +- 9 files changed, 23 insertions(+), 23 deletions(-) delete mode 100644 packages/babel-helper-skip-transparent-expr-wrappers/README.md rename packages/{babel-helper-skip-transparent-expr-wrappers => babel-helper-skip-transparent-expression-wrappers}/.npmignore (100%) create mode 100644 packages/babel-helper-skip-transparent-expression-wrappers/README.md rename packages/{babel-helper-skip-transparent-expr-wrappers => babel-helper-skip-transparent-expression-wrappers}/package.json (74%) rename packages/{babel-helper-skip-transparent-expr-wrappers => babel-helper-skip-transparent-expression-wrappers}/src/index.js (100%) diff --git a/packages/babel-helper-skip-transparent-expr-wrappers/README.md b/packages/babel-helper-skip-transparent-expr-wrappers/README.md deleted file mode 100644 index 7ec736e14617..000000000000 --- a/packages/babel-helper-skip-transparent-expr-wrappers/README.md +++ /dev/null @@ -1,17 +0,0 @@ -# @babel/helper-skip-transparent-expr-wrappers - -> Helper which skips types and parentheses - -## Install - -Using npm: - -```sh -npm install --save-dev @babel/helper-skip-transparent-expr-wrappers -``` - -or using yarn: - -```sh -yarn add @babel/helper-skip-transparent-expr-wrappers --dev -``` diff --git a/packages/babel-helper-skip-transparent-expr-wrappers/.npmignore b/packages/babel-helper-skip-transparent-expression-wrappers/.npmignore similarity index 100% rename from packages/babel-helper-skip-transparent-expr-wrappers/.npmignore rename to packages/babel-helper-skip-transparent-expression-wrappers/.npmignore diff --git a/packages/babel-helper-skip-transparent-expression-wrappers/README.md b/packages/babel-helper-skip-transparent-expression-wrappers/README.md new file mode 100644 index 000000000000..ac89e026937c --- /dev/null +++ b/packages/babel-helper-skip-transparent-expression-wrappers/README.md @@ -0,0 +1,17 @@ +# @babel/helper-skip-transparent-expression-wrappers + +> Helper which skips types and parentheses + +## Install + +Using npm: + +```sh +npm install --save-dev @babel/helper-skip-transparent-expression-wrappers +``` + +or using yarn: + +```sh +yarn add @babel/helper-skip-transparent-expression-wrappers --dev +``` diff --git a/packages/babel-helper-skip-transparent-expr-wrappers/package.json b/packages/babel-helper-skip-transparent-expression-wrappers/package.json similarity index 74% rename from packages/babel-helper-skip-transparent-expr-wrappers/package.json rename to packages/babel-helper-skip-transparent-expression-wrappers/package.json index 29703802884f..7f159a86ff1e 100644 --- a/packages/babel-helper-skip-transparent-expr-wrappers/package.json +++ b/packages/babel-helper-skip-transparent-expression-wrappers/package.json @@ -1,8 +1,8 @@ { - "name": "@babel/helper-skip-transparent-expr-wrappers", + "name": "@babel/helper-skip-transparent-expression-wrappers", "version": "7.9.6", "description": "Helper which skips types and parentheses", - "repository": "https://github.com/babel/babel/tree/master/packages/babel/helper-skip-transparent-expr-wrappers", + "repository": "https://github.com/babel/babel/tree/master/packages/babel/helper-skip-transparent-expression-wrappers", "license": "MIT", "publishConfig": { "access": "public" diff --git a/packages/babel-helper-skip-transparent-expr-wrappers/src/index.js b/packages/babel-helper-skip-transparent-expression-wrappers/src/index.js similarity index 100% rename from packages/babel-helper-skip-transparent-expr-wrappers/src/index.js rename to packages/babel-helper-skip-transparent-expression-wrappers/src/index.js diff --git a/packages/babel-plugin-proposal-optional-chaining/package.json b/packages/babel-plugin-proposal-optional-chaining/package.json index f1fef3855724..a35674c09544 100644 --- a/packages/babel-plugin-proposal-optional-chaining/package.json +++ b/packages/babel-plugin-proposal-optional-chaining/package.json @@ -18,7 +18,7 @@ "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", "@babel/plugin-syntax-optional-chaining": "^7.8.0", - "@babel/helper-skip-transparent-expr-wrappers": "^7.9.6" + "@babel/helper-skip-transparent-expression-wrappers": "^7.9.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index 51a659f7e03c..fd7cf981ffc6 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -3,7 +3,7 @@ import { getCallContext, isTransparentExprWrapper, skipTransparentExprWrappers, -} from "@babel/helper-skip-transparent-expr-wrappers"; +} from "@babel/helper-skip-transparent-expression-wrappers"; import syntaxOptionalChaining from "@babel/plugin-syntax-optional-chaining"; import { types as t } from "@babel/core"; diff --git a/packages/babel-plugin-transform-spread/package.json b/packages/babel-plugin-transform-spread/package.json index 50ff9b9456a6..1f7be0623450 100644 --- a/packages/babel-plugin-transform-spread/package.json +++ b/packages/babel-plugin-transform-spread/package.json @@ -17,7 +17,7 @@ ], "dependencies": { "@babel/helper-plugin-utils": "^7.10.4", - "@babel/helper-skip-transparent-expr-wrappers": "7.9.6" + "@babel/helper-skip-transparent-expression-wrappers": "7.9.6" }, "peerDependencies": { "@babel/core": "^7.0.0-0" diff --git a/packages/babel-plugin-transform-spread/src/index.js b/packages/babel-plugin-transform-spread/src/index.js index cdaeefea279e..c1e6676aa66d 100644 --- a/packages/babel-plugin-transform-spread/src/index.js +++ b/packages/babel-plugin-transform-spread/src/index.js @@ -1,5 +1,5 @@ import { declare } from "@babel/helper-plugin-utils"; -import { getCallContext } from "@babel/helper-skip-transparent-expr-wrappers"; +import { getCallContext } from "@babel/helper-skip-transparent-expression-wrappers"; import { types as t } from "@babel/core"; export default declare((api, options) => { From f6cc6e2ae75c22db4e5d249f167dd02b50505f23 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Fri, 3 Jul 2020 20:37:11 +0100 Subject: [PATCH 20/23] Remove getCallContext helper --- .../package.json | 12 ++++++++++-- .../src/index.js | 14 ++------------ .../src/index.js | 5 +++-- .../babel-plugin-transform-spread/src/index.js | 4 ++-- 4 files changed, 17 insertions(+), 18 deletions(-) diff --git a/packages/babel-helper-skip-transparent-expression-wrappers/package.json b/packages/babel-helper-skip-transparent-expression-wrappers/package.json index 7f159a86ff1e..4b681fb442c8 100644 --- a/packages/babel-helper-skip-transparent-expression-wrappers/package.json +++ b/packages/babel-helper-skip-transparent-expression-wrappers/package.json @@ -2,12 +2,20 @@ "name": "@babel/helper-skip-transparent-expression-wrappers", "version": "7.9.6", "description": "Helper which skips types and parentheses", - "repository": "https://github.com/babel/babel/tree/master/packages/babel/helper-skip-transparent-expression-wrappers", + "repository": { + "type": "git", + "url": "https://github.com/babel/babel.git", + "directory": "packages/babel-helper-skip-transparent-expression-wrappers" + }, "license": "MIT", "publishConfig": { "access": "public" }, - "main": "lib/index.js", + "main": "./lib/index.js", + "exports": { + ".": "./lib/index.js", + "package.json": "./package.json" + }, "dependencies": { "@babel/types": "^7.9.6" }, diff --git a/packages/babel-helper-skip-transparent-expression-wrappers/src/index.js b/packages/babel-helper-skip-transparent-expression-wrappers/src/index.js index 9235e02b4f54..c218ac6c8fde 100644 --- a/packages/babel-helper-skip-transparent-expression-wrappers/src/index.js +++ b/packages/babel-helper-skip-transparent-expression-wrappers/src/index.js @@ -1,18 +1,8 @@ +// @flow + import * as t from "@babel/types"; import type { NodePath } from "@babel/traverse"; -export function getCallContext(callPath: NodePath): NodePath { - if (!callPath.isCallExpression() && !callPath.isOptionalCallExpression()) { - throw new Error( - `Expected type "CallExpression" or "OptionalCallExpression" ` + - `but instead got "${callPath.type}".`, - ); - } - - const calleePath = callPath.get("callee"); - return skipTransparentExprWrappers(calleePath); -} - // A transparent expression wrapper is an AST node that most plugins will wish // to skip, as its presence does not affect the behaviour of the code. This // includes expressions used for types, and extra parenthesis. For example, in diff --git a/packages/babel-plugin-proposal-optional-chaining/src/index.js b/packages/babel-plugin-proposal-optional-chaining/src/index.js index fd7cf981ffc6..136c424bc3c8 100644 --- a/packages/babel-plugin-proposal-optional-chaining/src/index.js +++ b/packages/babel-plugin-proposal-optional-chaining/src/index.js @@ -1,6 +1,5 @@ import { declare } from "@babel/helper-plugin-utils"; import { - getCallContext, isTransparentExprWrapper, skipTransparentExprWrappers, } from "@babel/helper-skip-transparent-expression-wrappers"; @@ -63,7 +62,9 @@ export default declare((api, options) => { ); } else if (optionalPath.isOptionalCallExpression()) { optionalPath.node.type = "CallExpression"; - optionalPath = getCallContext(optionalPath); + optionalPath = skipTransparentExprWrappers( + optionalPath.get("callee"), + ); } } diff --git a/packages/babel-plugin-transform-spread/src/index.js b/packages/babel-plugin-transform-spread/src/index.js index c1e6676aa66d..dcd933a1fa7e 100644 --- a/packages/babel-plugin-transform-spread/src/index.js +++ b/packages/babel-plugin-transform-spread/src/index.js @@ -1,5 +1,5 @@ import { declare } from "@babel/helper-plugin-utils"; -import { getCallContext } from "@babel/helper-skip-transparent-expression-wrappers"; +import { skipTransparentExprWrappers } from "@babel/helper-skip-transparent-expression-wrappers"; import { types as t } from "@babel/core"; export default declare((api, options) => { @@ -95,7 +95,7 @@ export default declare((api, options) => { const args = node.arguments; if (!hasSpread(args)) return; - const calleePath = getCallContext(path); + const calleePath = skipTransparentExprWrappers(path.get("callee")); if (calleePath.isSuper()) return; From cea347fbab20270e4daa2dafb361a6b97de11264 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Fri, 3 Jul 2020 20:46:52 +0100 Subject: [PATCH 21/23] Fixed exports key --- .../package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/babel-helper-skip-transparent-expression-wrappers/package.json b/packages/babel-helper-skip-transparent-expression-wrappers/package.json index 4b681fb442c8..428d428020fb 100644 --- a/packages/babel-helper-skip-transparent-expression-wrappers/package.json +++ b/packages/babel-helper-skip-transparent-expression-wrappers/package.json @@ -14,7 +14,7 @@ "main": "./lib/index.js", "exports": { ".": "./lib/index.js", - "package.json": "./package.json" + "./package.json": "./package.json" }, "dependencies": { "@babel/types": "^7.9.6" From d654efcc07606c2f300d956f6174f2079fffe435 Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Fri, 3 Jul 2020 21:53:35 +0100 Subject: [PATCH 22/23] Preserve types in babel-plugin-transform-spread tests --- .../call-context/flow-type-cast/options.json | 7 +++++-- .../fixtures/call-context/flow-type-cast/output.js | 14 +++++++++++++- .../call-context/ts-type-cast/options.json | 7 +++++-- .../fixtures/call-context/ts-type-cast/output.js | 14 +++++++++++++- 4 files changed, 36 insertions(+), 6 deletions(-) diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/options.json b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/options.json index 621ebc692798..e596be864508 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/options.json +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/options.json @@ -1,7 +1,10 @@ { - "presets": [ + "plugins": [ [ - "flow" + "transform-spread" + ], + [ + "syntax-flow" ] ] } diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/output.js b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/output.js index 721fb585e076..622730cf966f 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/output.js +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/output.js @@ -1,3 +1,15 @@ var _a; -(_a = a).b.apply(_a, babelHelpers.toConsumableArray(args)); +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } + +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } + +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } + +((_a = a).b: any).apply(_a, _toConsumableArray(args)); diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/options.json b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/options.json index 52dd0fd384e3..9493ed633a56 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/options.json +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/options.json @@ -1,7 +1,10 @@ { - "presets": [ + "plugins": [ [ - "typescript" + "transform-spread" + ], + [ + "syntax-typescript" ] ] } diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/output.js b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/output.js index 721fb585e076..7c226b70431f 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/output.js +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/output.js @@ -1,3 +1,15 @@ var _a; -(_a = a).b.apply(_a, babelHelpers.toConsumableArray(args)); +function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } + +function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } + +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } + +function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } + +function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } + +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } + +( (_a = a).b).apply(_a, _toConsumableArray(args)); From e6c3a4c5f0d381f2eeca881749efcd9eb56774db Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Wed, 22 Jul 2020 22:53:27 +0100 Subject: [PATCH 23/23] Use external-helpers to avoid inlining helper functions in tests --- .../call-context/flow-type-cast/options.json | 9 +-------- .../fixtures/call-context/flow-type-cast/output.js | 14 +------------- .../call-context/ts-type-cast/options.json | 9 +-------- .../fixtures/call-context/ts-type-cast/output.js | 14 +------------- 4 files changed, 4 insertions(+), 42 deletions(-) diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/options.json b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/options.json index e596be864508..34154ac6a6a5 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/options.json +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/options.json @@ -1,10 +1,3 @@ { - "plugins": [ - [ - "transform-spread" - ], - [ - "syntax-flow" - ] - ] + "plugins": ["external-helpers", "transform-spread", "syntax-flow"] } diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/output.js b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/output.js index 622730cf966f..c912da78ec7d 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/output.js +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/output.js @@ -1,15 +1,3 @@ var _a; -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } - -((_a = a).b: any).apply(_a, _toConsumableArray(args)); +((_a = a).b: any).apply(_a, babelHelpers.toConsumableArray(args)); diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/options.json b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/options.json index 9493ed633a56..32fc1d8b1569 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/options.json +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/options.json @@ -1,10 +1,3 @@ { - "plugins": [ - [ - "transform-spread" - ], - [ - "syntax-typescript" - ] - ] + "plugins": ["external-helpers", "transform-spread", "syntax-typescript"] } diff --git a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/output.js b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/output.js index 7c226b70431f..8644e7401390 100644 --- a/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/output.js +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/output.js @@ -1,15 +1,3 @@ var _a; -function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); } - -function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } - -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } - -function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && Symbol.iterator in Object(iter)) return Array.from(iter); } - -function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } - -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } - -( (_a = a).b).apply(_a, _toConsumableArray(args)); +( (_a = a).b).apply(_a, babelHelpers.toConsumableArray(args));