From baa5d4bb7567014dc7349b43c2e54933568cacde Mon Sep 17 00:00:00 2001 From: liuxingbaoyu <30521560+liuxingbaoyu@users.noreply.github.com> Date: Wed, 12 Mar 2025 04:55:20 +0800 Subject: [PATCH] fix --- .../src/utils.ts | 31 +++++++++++++++---- .../usage-pure/indirect-binding-2/input.mjs | 2 ++ .../indirect-binding-2/options.json | 11 +++++++ .../usage-pure/indirect-binding-2/output.mjs | 2 ++ .../usage-pure/indirect-binding/input.js | 2 ++ .../usage-pure/indirect-binding/options.json | 11 +++++++ .../usage-pure/indirect-binding/output.js | 3 ++ 7 files changed, 56 insertions(+), 6 deletions(-) create mode 100644 packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding-2/input.mjs create mode 100644 packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding-2/options.json create mode 100644 packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding-2/output.mjs create mode 100644 packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding/input.js create mode 100644 packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding/options.json create mode 100644 packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding/output.js diff --git a/packages/babel-helper-define-polyfill-provider/src/utils.ts b/packages/babel-helper-define-polyfill-provider/src/utils.ts index 0b3647bc..5160c64b 100644 --- a/packages/babel-helper-define-polyfill-provider/src/utils.ts +++ b/packages/babel-helper-define-polyfill-provider/src/utils.ts @@ -13,7 +13,27 @@ export function has(object: any, key: string) { return Object.prototype.hasOwnProperty.call(object, key); } -function resolveId(path): string { +function resolve( + path: NodePath, + resolved: Set = new Set(), +): NodePath | undefined { + if (resolved.has(path)) return; + resolved.add(path); + + if (path.isVariableDeclarator()) { + if (path.get("id").isIdentifier()) { + return resolve(path.get("init"), resolved); + } + } else if (path.isReferencedIdentifier()) { + const binding = path.scope.getBinding(path.node.name); + if (!binding) return path; + if (!binding.constant) return; + return resolve(binding.path, resolved); + } + return path; +} + +function resolveId(path: NodePath): string { if ( path.isIdentifier() && !path.scope.hasBinding(path.node.name, /* noGlobals */ true) @@ -21,8 +41,8 @@ function resolveId(path): string { return path.node.name; } - const resolved = path.resolve(); - if (resolved.isIdentifier()) { + const resolved = resolve(path); + if (resolved?.isIdentifier()) { return resolved.node.name; } } @@ -82,9 +102,8 @@ export function resolveSource(obj: NodePath): { return { id, placement: "static" }; } - // @ts-expect-error no type for resolve - const path = obj.resolve() as NodePath; - switch (path.type) { + const path = resolve(obj); + switch (path?.type) { case "RegExpLiteral": return { id: "RegExp", placement: "prototype" }; case "FunctionExpression": diff --git a/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding-2/input.mjs b/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding-2/input.mjs new file mode 100644 index 00000000..f92b95d7 --- /dev/null +++ b/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding-2/input.mjs @@ -0,0 +1,2 @@ +import Math from './math'; +Math.f16round(foo); \ No newline at end of file diff --git a/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding-2/options.json b/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding-2/options.json new file mode 100644 index 00000000..ab92503c --- /dev/null +++ b/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding-2/options.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + [ + "@@/polyfill-corejs3", + { + "method": "usage-pure", + "version": "3.41" + } + ] + ] +} \ No newline at end of file diff --git a/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding-2/output.mjs b/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding-2/output.mjs new file mode 100644 index 00000000..9bb21636 --- /dev/null +++ b/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding-2/output.mjs @@ -0,0 +1,2 @@ +import Math from './math'; +Math.f16round(foo); diff --git a/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding/input.js b/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding/input.js new file mode 100644 index 00000000..dce9ae1e --- /dev/null +++ b/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding/input.js @@ -0,0 +1,2 @@ +var math = Math; +math.f16round(foo); \ No newline at end of file diff --git a/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding/options.json b/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding/options.json new file mode 100644 index 00000000..ab92503c --- /dev/null +++ b/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding/options.json @@ -0,0 +1,11 @@ +{ + "plugins": [ + [ + "@@/polyfill-corejs3", + { + "method": "usage-pure", + "version": "3.41" + } + ] + ] +} \ No newline at end of file diff --git a/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding/output.js b/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding/output.js new file mode 100644 index 00000000..a7133c36 --- /dev/null +++ b/packages/babel-plugin-polyfill-corejs3/test/fixtures/usage-pure/indirect-binding/output.js @@ -0,0 +1,3 @@ +var _Math$f16round = require("core-js-pure/stable/math/f16round.js"); +var math = Math; +_Math$f16round(foo);