diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params-2/actual.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params-2/actual.js new file mode 100644 index 0000000000..f0b8be5f0b --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params-2/actual.js @@ -0,0 +1,5 @@ +function render(title= '') { + return () => ( + + ); +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params-2/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params-2/expected.js new file mode 100644 index 0000000000..e03efdea64 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params-2/expected.js @@ -0,0 +1,7 @@ +function render() { + var title = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; + + var _ref = ; + + return () => _ref; +} \ No newline at end of file diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params-2/options.json b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params-2/options.json new file mode 100644 index 0000000000..9f24ed8416 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params-2/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "transform-es2015-parameters", + "transform-react-constant-elements", + "transform-es2015-block-scoping", + "syntax-jsx" + ] +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params/actual.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params/actual.js new file mode 100644 index 0000000000..edf957a002 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params/actual.js @@ -0,0 +1,5 @@ +function render(Component, text = '') { + return function() { + return ; + } +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params/expected.js b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params/expected.js new file mode 100644 index 0000000000..a11f2f892a --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params/expected.js @@ -0,0 +1,9 @@ +function render(Component) { + var text = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : ''; + + var _ref = ; + + return function () { + return _ref; + }; +} diff --git a/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params/options.json b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params/options.json new file mode 100644 index 0000000000..9f24ed8416 --- /dev/null +++ b/packages/babel-plugin-transform-react-constant-elements/test/fixtures/constant-elements/dont-hoist-before-default-params/options.json @@ -0,0 +1,8 @@ +{ + "plugins": [ + "transform-es2015-parameters", + "transform-react-constant-elements", + "transform-es2015-block-scoping", + "syntax-jsx" + ] +} diff --git a/packages/babel-traverse/src/path/lib/hoister.js b/packages/babel-traverse/src/path/lib/hoister.js index 0a942ecc10..b2a02c1a96 100644 --- a/packages/babel-traverse/src/path/lib/hoister.js +++ b/packages/babel-traverse/src/path/lib/hoister.js @@ -133,7 +133,14 @@ export default class PathHoister { if (this.scope === scope) return; // needs to be attached to the body - return scope.path.get("body").get("body")[0]; + const bodies = scope.path.get("body").get("body"); + for (let i = 0; i < bodies.length; i++) { + // Don't attach to something that's going to get hoisted, + // like a default parameter + if (bodies[i].node._blockHoist) continue; + return bodies[i]; + } + // deopt: If here, no attachment path found } else { // doesn't need to be be attached to this scope return this.getNextScopeAttachmentParent();