diff --git a/packages/babel-plugin-minify-mangle-names/__tests__/mangle-names-test.js b/packages/babel-plugin-minify-mangle-names/__tests__/mangle-names-test.js index b572b0d09..0eab4a8cc 100644 --- a/packages/babel-plugin-minify-mangle-names/__tests__/mangle-names-test.js +++ b/packages/babel-plugin-minify-mangle-names/__tests__/mangle-names-test.js @@ -1105,4 +1105,28 @@ describe("mangle-names", () => { `); expect(transform(source)).toBe(expected); }); + + it("should rename binding.identifier - issue#411", () => { + const source = unpad(` + !function () { + function e(e) { + foo(e); + } + return function () { + return e(); + }; + }(); + `); + const expected = unpad(` + !function () { + function a(b) { + foo(b); + } + return function () { + return a(); + }; + }(); + `); + expect(transform(source)).toBe(expected); + }); }); diff --git a/packages/babel-plugin-minify-mangle-names/src/index.js b/packages/babel-plugin-minify-mangle-names/src/index.js index 7561e4e87..26e650bf6 100644 --- a/packages/babel-plugin-minify-mangle-names/src/index.js +++ b/packages/babel-plugin-minify-mangle-names/src/index.js @@ -186,16 +186,20 @@ module.exports = ({ types: t, traverse }) => { const binding = scope.getBinding(oldName); // rename at the declaration level - const bindingPaths = binding.path.getBindingIdentifierPaths(); - - Object - .keys(bindingPaths) - .map((b) => { - if (b === oldName && !bindingPaths[b][PATH_RENAME_MARKER]) { - bindingPaths[b].replaceWith(t.identifier(newName)); - bindingPaths[b][PATH_RENAME_MARKER] = true; + const bindingPaths = binding.path.getBindingIdentifierPaths(true, false); + + // we traverse through all bindingPaths because, + // there is no binding.identifierPath in babel + for (const name in bindingPaths) { + if (name !== oldName) continue; + for (const idPath of bindingPaths[name]) { + if (binding.identifier === idPath.node) { + idPath.replaceWith(t.identifier(newName)); + binding.identifier = idPath.node; + idPath[PATH_RENAME_MARKER] = true; } - }); + } + } const {bindings} = scope; bindings[newName] = binding;