From cc9735f8897df40a6c79343cbb6a77123b1df9ad Mon Sep 17 00:00:00 2001 From: Ben Alpert Date: Sat, 30 Aug 2014 01:04:19 -0700 Subject: [PATCH] Add newline before JSX spread when appropriate Previously, we were losing the newline before a JSX spread attribute which would cause the lines to not match up; this fixes the problem. --- .../transforms/__tests__/react-test.js | 15 ++++++++++++++- vendor/fbtransform/transforms/react.js | 7 ++++--- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/vendor/fbtransform/transforms/__tests__/react-test.js b/vendor/fbtransform/transforms/__tests__/react-test.js index 82f7856904..772acc9706 100644 --- a/vendor/fbtransform/transforms/__tests__/react-test.js +++ b/vendor/fbtransform/transforms/__tests__/react-test.js @@ -379,12 +379,25 @@ describe('react jsx', function() { ''; var result = - 'React.createElement(Component, Object.assign({}, x , {y: \n' + + 'React.createElement(Component, Object.assign({}, x , {y: \n' + '2, z: true}))'; expect(transform(code).code).toBe(result); }); + it('adds appropriate newlines when using spread attribute', function() { + var code = + ''; + var result = + 'React.createElement(Component, Object.assign({}, \n' + + ' this.props, \n' + + ' {sound: "moo"}))'; + + expect(transform(code).code).toBe(result); + }); + it('should transform known hyphenated tags', function() { var code = [ '/**', diff --git a/vendor/fbtransform/transforms/react.js b/vendor/fbtransform/transforms/react.js index a99e552ce1..11ed7a8f28 100644 --- a/vendor/fbtransform/transforms/react.js +++ b/vendor/fbtransform/transforms/react.js @@ -142,16 +142,17 @@ function visitReactTag(traverse, object, path, state) { var isLast = index === attributesObject.length - 1; if (attr.type === Syntax.XJSSpreadAttribute) { - // Plus 1 to skip `{`. - utils.move(attr.range[0] + 1, state); - // Close the previous object or initial object if (!previousWasSpread) { utils.append('}, ', state); } + // Move to the expression start, ignoring everything except parenthesis // and whitespace. + utils.catchup(attr.range[0], state, stripNonWhiteParen); + // Plus 1 to skip `{`. + utils.move(attr.range[0] + 1, state); utils.catchup(attr.argument.range[0], state, stripNonWhiteParen); traverse(attr.argument, path, state);