From d1d0ed901ee4b74ae18a17c62e1be3bc188bfb81 Mon Sep 17 00:00:00 2001 From: Sebastian McKenzie Date: Mon, 2 Nov 2015 19:24:23 +0000 Subject: [PATCH] fix export of parameters when renaming the binding of exported functions - fixes #2753 --- .../spec.function-name/modules-4/actual.js | 9 +++++++++ .../spec.function-name/modules-4/expected.js | 8 ++++++++ packages/babel-traverse/src/path/family.js | 4 ++++ .../babel-traverse/src/scope/lib/renamer.js | 4 ++-- packages/babel-types/src/retrievers.js | 18 ++++++++++++++++++ 5 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 packages/babel-core/test/fixtures/transformation/spec.function-name/modules-4/actual.js create mode 100644 packages/babel-core/test/fixtures/transformation/spec.function-name/modules-4/expected.js diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-4/actual.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-4/actual.js new file mode 100644 index 0000000000..e9f4b928de --- /dev/null +++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-4/actual.js @@ -0,0 +1,9 @@ +export function foo(bar) { + +} + +var bar = { + foo: function () { + foo; + } +}; diff --git a/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-4/expected.js b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-4/expected.js new file mode 100644 index 0000000000..f8ec7bb06d --- /dev/null +++ b/packages/babel-core/test/fixtures/transformation/spec.function-name/modules-4/expected.js @@ -0,0 +1,8 @@ +export { _foo as foo }; +function _foo(bar) {} + +var bar = { + foo: function foo() { + _foo; + } +}; diff --git a/packages/babel-traverse/src/path/family.js b/packages/babel-traverse/src/path/family.js index 02e862ed49..a4c6f5621f 100644 --- a/packages/babel-traverse/src/path/family.js +++ b/packages/babel-traverse/src/path/family.js @@ -123,3 +123,7 @@ export function _getPattern(parts, context) { export function getBindingIdentifiers(duplicates?) { return t.getBindingIdentifiers(this.node, duplicates); } + +export function getOuterBindingIdentifiers(duplicates?) { + return t.getOuterBindingIdentifiers(this.node, duplicates); +} diff --git a/packages/babel-traverse/src/scope/lib/renamer.js b/packages/babel-traverse/src/scope/lib/renamer.js index 4e0bb608bb..e3a60935d8 100644 --- a/packages/babel-traverse/src/scope/lib/renamer.js +++ b/packages/babel-traverse/src/scope/lib/renamer.js @@ -42,7 +42,7 @@ export default class Renamer { // build specifiers that point back to this export declaration let isDefault = exportDeclar.isExportDefaultDeclaration(); - let bindingIdentifiers = parentDeclar.getBindingIdentifiers(); + let bindingIdentifiers = parentDeclar.getOuterBindingIdentifiers(); let specifiers = []; for (let name in bindingIdentifiers) { @@ -80,7 +80,7 @@ export default class Renamer { maybeConvertFromClassFunctionExpression(path) { return; // TODO - + // retain the `name` of a class/function expression if (!path.isFunctionExpression() && !path.isClassExpression()) return; diff --git a/packages/babel-types/src/retrievers.js b/packages/babel-types/src/retrievers.js index 15dfc5a86d..c2cfdc4955 100644 --- a/packages/babel-types/src/retrievers.js +++ b/packages/babel-types/src/retrievers.js @@ -91,3 +91,21 @@ getBindingIdentifiers.keys = { VariableDeclaration: ["declarations"], VariableDeclarator: ["id"] }; + +export function getOuterBindingIdentifiers( + node: Object, + duplicates?: boolean, +): Object { + if (t.isFunction(node)) { + let id = node.id; + if (id) { + return { + [id.name]: duplicates ? [id] : id + }; + } else { + return {}; + } + } else { + return getBindingIdentifiers(node, duplicates); + } +}