From 8b524f42b277762e20d68aa38d428fe895cf705b Mon Sep 17 00:00:00 2001 From: Zzzen <843968788@qq.com> Date: Mon, 13 Apr 2020 00:23:11 +0800 Subject: [PATCH 1/4] Fix object spread runtime semantics --- .../src/index.js | 25 +++++++++++++++++-- .../object-spread/expression/output.js | 10 ++++---- .../object-spread/side-effect/exec.js | 4 +++ .../object-spread/side-effect/input.js | 2 ++ .../object-spread/side-effect/output.js | 16 ++++++++++++ 5 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/exec.js create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/input.js create mode 100644 packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/output.js 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 7c25ac399242..51df6bfb20ef 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/src/index.js +++ b/packages/babel-plugin-proposal-object-rest-spread/src/index.js @@ -541,6 +541,7 @@ export default declare((api, opts) => { ObjectExpression(path, file) { if (!hasSpread(path.node)) return; + // a non-SpreadElement and SpreadElement striped array const args = []; let props = []; @@ -579,8 +580,28 @@ export default declare((api, opts) => { helper = file.addHelper("objectSpread"); } } - - path.replaceWith(t.callExpression(helper, args)); + // We cannot call _objectSpread with more than two elements directly, since any element could cause side effects. For + // example: + // var k = { a: 1, b: 2 }; + // var o = { a: 3, ...k, b: k.a++ }; + // // expected: { a: 1, b: 1 } + // If we translate the above to `_objectSpread({ a: 3 }, k, { b: k.a++ })`, the `k.a++` will evaluate before + // `k` is spread and we end up with `{ a: 2, b: 1 }`. + // adapted from https://github.com/microsoft/TypeScript/blob/eb105efdcd6db8a73f5b983bf329cb7a5eee55e1/src/compiler/transformers/es2018.ts#L272 + let exp = args[0]; + for (let i = 1; i < args.length; i++) { + // reference: packages/babel-helpers/src/helpers.js#objectSpread2 + if (i % 2) { + exp = t.callExpression(helper, [exp, args[i]]); + } else { + exp = t.callExpression(helper, [ + exp, + t.objectExpression([]), + args[i], + ]); + } + } + path.replaceWith(exp); }, }, }; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js index a172df60bd16..8f993eedf735 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js @@ -4,11 +4,11 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -_objectSpread({ +_objectSpread(_objectSpread(_objectSpread(_objectSpread({ x -}, y, { +}, y), {}, { a -}, b, { +}), b), {}, { c }); @@ -18,9 +18,9 @@ _objectSpread({}, { foo: 'bar' }); -_objectSpread({}, { +_objectSpread(_objectSpread(_objectSpread({}, { foo: 'bar' -}, {}, { +}), {}, {}), { bar: 'baz' }); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/exec.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/exec.js new file mode 100644 index 000000000000..efb73e7a98ca --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/exec.js @@ -0,0 +1,4 @@ +var k = { a: 1, b: 2 }; +var o = { a: 3, ...k, b: k.a++ }; + +expect(o).toEqual({a: 1, b: 1}); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/input.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/input.js new file mode 100644 index 000000000000..2a39f42f62cf --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/input.js @@ -0,0 +1,2 @@ +var k = { a: 1, b: 2 }; +var o = { a: 3, ...k, b: k.a++ }; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/output.js new file mode 100644 index 000000000000..d23ec370de81 --- /dev/null +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/output.js @@ -0,0 +1,16 @@ +function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } + +function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } + +function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } + +var k = { + a: 1, + b: 2 +}; + +var o = _objectSpread(_objectSpread({ + a: 3 +}, k), {}, { + b: k.a++ +}); From 032a7640a812e2c1a5112c4c132636709893c567 Mon Sep 17 00:00:00 2001 From: Zzzen <843968788@qq.com> Date: Fri, 17 Apr 2020 00:08:43 +0800 Subject: [PATCH 2/4] limit this deoptimization --- .../src/index.js | 32 ++++++++++++++++--- .../object-spread/assignment/output.js | 6 ++-- .../object-spread/expression/output.js | 12 +++---- .../loose-mode-builtins/output.js | 6 ++-- .../object-spread/loose-mode/output.js | 6 ++-- .../object-spread/side-effect/input.js | 14 ++++++++ .../object-spread/side-effect/output.js | 23 +++++++++++++ .../variable-declaration/output.js | 2 +- 8 files changed, 80 insertions(+), 21 deletions(-) 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 51df6bfb20ef..63e3d3e5296a 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/src/index.js +++ b/packages/babel-plugin-proposal-object-rest-spread/src/index.js @@ -541,6 +541,8 @@ export default declare((api, opts) => { ObjectExpression(path, file) { if (!hasSpread(path.node)) return; + const { scope } = path; + // a non-SpreadElement and SpreadElement striped array const args = []; let props = []; @@ -588,19 +590,39 @@ export default declare((api, opts) => { // If we translate the above to `_objectSpread({ a: 3 }, k, { b: k.a++ })`, the `k.a++` will evaluate before // `k` is spread and we end up with `{ a: 2, b: 1 }`. // adapted from https://github.com/microsoft/TypeScript/blob/eb105efdcd6db8a73f5b983bf329cb7a5eee55e1/src/compiler/transformers/es2018.ts#L272 - let exp = args[0]; - for (let i = 1; i < args.length; i++) { + const chunks = []; + let currentChunk = []; + for (let i = 0; i < args.length; i++) { + currentChunk.push(args[i]); + // prevent current chunk from pollution + if (i < args.length - 1 && !scope.isPure(args[i + 1])) { + chunks.push(currentChunk); + currentChunk = []; + } + } + + if (currentChunk.length) { + chunks.push(currentChunk); + currentChunk = []; + } + + let exp = t.callExpression(helper, chunks[0]); + let nthArg = chunks[0].length; + for (let i = 1; i < chunks.length; i++) { // reference: packages/babel-helpers/src/helpers.js#objectSpread2 - if (i % 2) { - exp = t.callExpression(helper, [exp, args[i]]); + if (nthArg % 2) { + exp = t.callExpression(helper, [exp, ...chunks[i]]); } else { exp = t.callExpression(helper, [ exp, t.objectExpression([]), - args[i], + ...chunks[i], ]); } + + nthArg += chunks[i].length; } + path.replaceWith(exp); }, }, diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/output.js index a1f2970a3264..59230da9dac1 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/output.js @@ -4,10 +4,10 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -z = _objectSpread({ +z = _objectSpread(_objectSpread({ x -}, y); +}), y); z = { x, - w: _objectSpread({}, y) + w: _objectSpread(_objectSpread({}), y) }; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js index 8f993eedf735..52727e0506ca 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js @@ -4,27 +4,27 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -_objectSpread(_objectSpread(_objectSpread(_objectSpread({ +_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({ x -}, y), {}, { +}), y), {}, { a }), b), {}, { c }); -_objectSpread({}, Object.prototype); +_objectSpread(_objectSpread({}), Object.prototype); _objectSpread({}, { foo: 'bar' }); -_objectSpread(_objectSpread(_objectSpread({}, { +_objectSpread({}, { foo: 'bar' -}), {}, {}), { +}, {}, { bar: 'baz' }); -_objectSpread({}, { +_objectSpread(_objectSpread({}), { get foo() { return 'foo'; } diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/output.js index 457fa6a6069d..09f770b930a7 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/output.js @@ -1,7 +1,7 @@ -z = Object.assign({ +z = Object.assign(Object.assign({ x -}, y); +}), y); z = { x, - w: Object.assign({}, y) + w: Object.assign(Object.assign({}), y) }; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/output.js index 1d477e3f1bb8..ce56f3ffa659 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/output.js @@ -2,12 +2,12 @@ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) r function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } -z = _extends({ +z = _extends(_extends({ x -}, y); +}), y); z = { x, - w: _extends({}, y) + w: _extends(_extends({}), y) }; const rest = _objectWithoutPropertiesLoose(z, ["q"]); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/input.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/input.js index 2a39f42f62cf..f2c856b9fcd4 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/input.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/input.js @@ -1,2 +1,16 @@ var k = { a: 1, b: 2 }; var o = { a: 3, ...k, b: k.a++ }; + +var pureA = {}; +var pureB = {}; +var pureC = {}; +var pureD = {}; +var pureE = {}; + +function impureFunc() { + console.log('hello') +} + +var output = { ...pureA, get foo() {}, get bar() {}, ...pureB, ...pureC, ...impureFunc(), ...pureD, pureD } + +var simpleOutput = { ...pureA, test: '1', ...pureB, } \ No newline at end of file diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/output.js index d23ec370de81..19ec3bc08cbe 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/side-effect/output.js @@ -14,3 +14,26 @@ var o = _objectSpread(_objectSpread({ }, k), {}, { b: k.a++ }); + +var pureA = {}; +var pureB = {}; +var pureC = {}; +var pureD = {}; +var pureE = {}; + +function impureFunc() { + console.log('hello'); +} + +var output = _objectSpread(_objectSpread(_objectSpread({}, pureA), {}, { + get foo() {}, + + get bar() {} + +}, pureB, {}, pureC, {}), impureFunc(), {}, pureD, { + pureD +}); + +var simpleOutput = _objectSpread({}, pureA, { + test: '1' +}, pureB); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/variable-declaration/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/variable-declaration/output.js index 9fabf3047b3d..72cd13228ca6 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/variable-declaration/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/variable-declaration/output.js @@ -4,4 +4,4 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -var z = _objectSpread({}, x); +var z = _objectSpread(_objectSpread({}), x); From 8356f4a95f90e2180da1578debb013f1caa38222 Mon Sep 17 00:00:00 2001 From: Zzzen <843968788@qq.com> Date: Sat, 18 Apr 2020 12:44:18 +0800 Subject: [PATCH 3/4] optimize empty objects --- .../src/index.js | 10 ++++++++-- .../test/fixtures/object-spread/assignment/output.js | 2 +- .../test/fixtures/object-spread/expression/output.js | 4 ++-- .../object-spread/loose-mode-builtins/output.js | 2 +- .../test/fixtures/object-spread/loose-mode/output.js | 2 +- .../object-spread/variable-declaration/output.js | 2 +- 6 files changed, 14 insertions(+), 8 deletions(-) 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 63e3d3e5296a..5899233567c4 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/src/index.js +++ b/packages/babel-plugin-proposal-object-rest-spread/src/index.js @@ -594,8 +594,14 @@ export default declare((api, opts) => { let currentChunk = []; for (let i = 0; i < args.length; i++) { currentChunk.push(args[i]); - // prevent current chunk from pollution - if (i < args.length - 1 && !scope.isPure(args[i + 1])) { + const isCurrentChunkEmptyObject = + currentChunk.length === 1 && + t.isObjectExpression(args[i]) && + args[i].properties.length === 0; + const isNextArgEffectful = + i < args.length - 1 && !scope.isPure(args[i + 1]); + // prevent current chunk from pollution unless current chunk is an empty object + if (!isCurrentChunkEmptyObject && isNextArgEffectful) { chunks.push(currentChunk); currentChunk = []; } diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/output.js index 59230da9dac1..32a2109c8164 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/output.js @@ -9,5 +9,5 @@ z = _objectSpread(_objectSpread({ }), y); z = { x, - w: _objectSpread(_objectSpread({}), y) + w: _objectSpread({}, y) }; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js index 52727e0506ca..c9c21e4d9abc 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js @@ -12,7 +12,7 @@ _objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({ c }); -_objectSpread(_objectSpread({}), Object.prototype); +_objectSpread({}, Object.prototype); _objectSpread({}, { foo: 'bar' @@ -24,7 +24,7 @@ _objectSpread({}, { bar: 'baz' }); -_objectSpread(_objectSpread({}), { +_objectSpread({}, { get foo() { return 'foo'; } diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/output.js index 09f770b930a7..cc2b1d128d61 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/output.js @@ -3,5 +3,5 @@ z = Object.assign(Object.assign({ }), y); z = { x, - w: Object.assign(Object.assign({}), y) + w: Object.assign({}, y) }; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/output.js index ce56f3ffa659..a8b3fba4d12b 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/output.js @@ -7,7 +7,7 @@ z = _extends(_extends({ }), y); z = { x, - w: _extends(_extends({}), y) + w: _extends({}, y) }; const rest = _objectWithoutPropertiesLoose(z, ["q"]); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/variable-declaration/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/variable-declaration/output.js index 72cd13228ca6..9fabf3047b3d 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/variable-declaration/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/variable-declaration/output.js @@ -4,4 +4,4 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -var z = _objectSpread(_objectSpread({}), x); +var z = _objectSpread({}, x); From ed8067d576fd60befc34fb292ea6fdcdc323b1bd Mon Sep 17 00:00:00 2001 From: Zzzen <843968788@qq.com> Date: Sat, 18 Apr 2020 16:56:15 +0800 Subject: [PATCH 4/4] declare variables --- .../test/fixtures/object-spread/assignment/input.js | 4 ++++ .../fixtures/object-spread/assignment/output.js | 7 +++++-- .../test/fixtures/object-spread/expression/input.js | 7 +++++++ .../fixtures/object-spread/expression/output.js | 13 ++++++++++--- .../object-spread/loose-mode-builtins/input.js | 4 ++++ .../object-spread/loose-mode-builtins/output.js | 7 +++++-- .../test/fixtures/object-spread/loose-mode/input.js | 4 ++++ .../fixtures/object-spread/loose-mode/output.js | 7 +++++-- 8 files changed, 44 insertions(+), 9 deletions(-) diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/input.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/input.js index 6f0367fb7c70..093a8e9f9351 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/input.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/input.js @@ -1,3 +1,7 @@ +var x; +var y; +var z; + z = { x, ...y }; z = { x, w: { ...y } }; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/output.js index 32a2109c8164..9f13316b8658 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/assignment/output.js @@ -4,9 +4,12 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -z = _objectSpread(_objectSpread({ +var x; +var y; +var z; +z = _objectSpread({ x -}), y); +}, y); z = { x, w: _objectSpread({}, y) diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/input.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/input.js index a20f61241b3c..da4e7b689505 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/input.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/input.js @@ -1,3 +1,10 @@ +var a; +var b; +var c; +var d; +var x; +var y; + ({ x, ...y, a, ...b, c }); ({ ...Object.prototype }); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js index c9c21e4d9abc..b846f4badffe 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/expression/output.js @@ -4,11 +4,18 @@ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { va function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } -_objectSpread(_objectSpread(_objectSpread(_objectSpread(_objectSpread({ +var a; +var b; +var c; +var d; +var x; +var y; + +_objectSpread({ x -}), y), {}, { +}, y, { a -}), b), {}, { +}, b, { c }); diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/input.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/input.js index 6f0367fb7c70..093a8e9f9351 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/input.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/input.js @@ -1,3 +1,7 @@ +var x; +var y; +var z; + z = { x, ...y }; z = { x, w: { ...y } }; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/output.js index cc2b1d128d61..8e9602898ed6 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode-builtins/output.js @@ -1,6 +1,9 @@ -z = Object.assign(Object.assign({ +var x; +var y; +var z; +z = Object.assign({ x -}), y); +}, y); z = { x, w: Object.assign({}, y) diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/input.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/input.js index 07beed075a6c..f05d6d6b8917 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/input.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/input.js @@ -1,3 +1,7 @@ +var x; +var y; +var z; + z = { x, ...y }; z = { x, w: { ...y } }; diff --git a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/output.js b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/output.js index a8b3fba4d12b..d33583d41054 100644 --- a/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/output.js +++ b/packages/babel-plugin-proposal-object-rest-spread/test/fixtures/object-spread/loose-mode/output.js @@ -2,9 +2,12 @@ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) r function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } -z = _extends(_extends({ +var x; +var y; +var z; +z = _extends({ x -}), y); +}, y); z = { x, w: _extends({}, y)