From 44027e1dbe84c015f36e03dd58b0cce6071cf19c Mon Sep 17 00:00:00 2001 From: Oliver Dunk Date: Sun, 3 May 2020 23:27:28 +0100 Subject: [PATCH] Create @babel/helper-get-call-context package --- .../babel-helper-get-call-context/.npmignore | 3 +++ .../babel-helper-get-call-context/README.md | 19 +++++++++++++++++++ .../package.json | 14 ++++++++++++++ .../src/index.js | 18 ++++++++++++++++++ .../package.json | 5 +++-- .../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 +++ .../fixtures/regression/11400/options.json | 8 ++++---- 20 files changed, 133 insertions(+), 13 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..075da66c7281 --- /dev/null +++ b/packages/babel-helper-get-call-context/README.md @@ -0,0 +1,19 @@ +# @babel/helper-explode-class + +> Helper function to explode class + +See our website [@babel/helper-explode-class](https://babeljs.io/docs/en/next/babel-helper-explode-class.html) for more information. + +## Install + +Using npm: + +```sh +npm install --save-dev @babel/helper-explode-class +``` + +or using yarn: + +```sh +yarn add @babel/helper-explode-class --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..5ddd3ba9b654 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" } -} +} \ No newline at end of file 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..5d17ec40f6d4 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/input.ts @@ -0,0 +1 @@ +(a.b: any)(...args) \ No newline at end of file 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..0837a305339d --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/flow-type-cast/options.json @@ -0,0 +1,7 @@ +{ + "presets": [ + [ + "flow" + ] + ] +} \ No newline at end of file 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..65628389320e --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/input.js @@ -0,0 +1 @@ +(a.b)(...args) \ No newline at end of file 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..4e2630366d55 --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/parenthesized-expressions/options.json @@ -0,0 +1,5 @@ +{ + "parserOpts": { + "createParenthesizedExpressions": true + } +} \ No newline at end of file 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..b42aa096137a --- /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); + } +} \ No newline at end of file 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..8edf5c081de2 --- /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" + ] + ] +} \ No newline at end of file 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..207aec683b0c --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/input.ts @@ -0,0 +1 @@ +( a.b)(...args) \ No newline at end of file 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..ff8375299b8b --- /dev/null +++ b/packages/babel-plugin-transform-spread/test/fixtures/call-context/ts-type-cast/options.json @@ -0,0 +1,7 @@ +{ + "presets": [ + [ + "typescript" + ] + ] +} \ No newline at end of file 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/options.json b/packages/babel-plugin-transform-spread/test/fixtures/regression/11400/options.json index 7f73c527c1c2..ff8375299b8b 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