diff --git a/packages/babel-plugin-proposal-object-rest-spread/src/index.js b/packages/babel-plugin-proposal-object-rest-spread/src/index.js index 66867887d8..ca8e53b24f 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/src/index.js +++ b/packages/babel-plugin-proposal-object-rest-spread/src/index.js @@ -92,6 +92,17 @@ export default declare((api, opts) => { return impureComputedPropertyDeclarators; } + function removeUnusedExcludedKeys(path) { + const bindings = path.getOuterBindingIdentifierPaths(); + + Object.keys(bindings).forEach(bindingName => { + if (path.scope.getBinding(bindingName).references > 1) { + return; + } + bindings[bindingName].parentPath.remove(); + }); + } + //expects path to an object pattern function createObjectSpread(path, file, objRef) { const props = path.get("properties"); @@ -241,12 +252,17 @@ export default declare((api, opts) => { const objectPatternPath = path.findParent(path => path.isObjectPattern(), ); + const [ impureComputedPropertyDeclarators, argument, callExpression, ] = createObjectSpread(objectPatternPath, file, ref); + if (loose) { + removeUnusedExcludedKeys(objectPatternPath); + } + t.assertIdentifier(argument); insertionPath.insertBefore(impureComputedPropertyDeclarators); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/remove-unused-excluded-keys-loose/input.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/remove-unused-excluded-keys-loose/input.js new file mode 100644 index 0000000000..91a6dc9eea --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/remove-unused-excluded-keys-loose/input.js @@ -0,0 +1,22 @@ +// should not remove when destructuring into existing bindings +({ a2, ...b2 } = c2); + +class Comp extends React.Component { + render() { + const { + excluded, + excluded2: excludedRenamed, + used, + used2: usedRenamed, + ...props + } = this.props; + + console.log(used, usedRenamed); + + return React.createElement("input", props); + } +} + +function smth({ unused, ...rest }) { + call(rest); +} diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/remove-unused-excluded-keys-loose/options.json b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/remove-unused-excluded-keys-loose/options.json new file mode 100644 index 0000000000..3211139d6e --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/remove-unused-excluded-keys-loose/options.json @@ -0,0 +1,6 @@ +{ + "plugins": [ + "external-helpers", + ["proposal-object-rest-spread", { "loose": true }] + ] +} diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/remove-unused-excluded-keys-loose/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/remove-unused-excluded-keys-loose/output.js new file mode 100644 index 0000000000..7837d62104 --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-rest/remove-unused-excluded-keys-loose/output.js @@ -0,0 +1,26 @@ +// should not remove when destructuring into existing bindings +var _c = c2; +({ + a2 +} = _c); +b2 = babelHelpers.objectWithoutProperties(_c, ["a2"]); +_c; + +class Comp extends React.Component { + render() { + const _this$props = this.props, + { + used, + used2: usedRenamed + } = _this$props, + props = babelHelpers.objectWithoutProperties(_this$props, ["excluded", "excluded2", "used", "used2"]); + console.log(used, usedRenamed); + return React.createElement("input", props); + } + +} + +function smth(_ref) { + let rest = babelHelpers.objectWithoutProperties(_ref, ["unused"]); + call(rest); +}