From 9b0d6b8de05bba57eabda6280b934a8138626651 Mon Sep 17 00:00:00 2001 From: Lucas Duailibe Date: Wed, 20 Sep 2017 12:07:51 -0300 Subject: [PATCH] Fix different precedence binary expression when inlining (#2827) --- src/printer.js | 5 +- .../__snapshots__/jsfmt.spec.js.snap | 138 ++++++++++++++++++ tests/binary-expressions/inline-jsx.js | 7 + .../binary-expressions/inline-object-array.js | 45 ++++++ tests/binary-expressions/jsx_parent.js | 5 + 5 files changed, 198 insertions(+), 2 deletions(-) create mode 100644 tests/binary-expressions/inline-jsx.js diff --git a/src/printer.js b/src/printer.js index a8c930ec..1006d8f5 100644 --- a/src/printer.js +++ b/src/printer.js @@ -355,11 +355,12 @@ function genericPrintNoParens(path, options, print, args) { parent.type === "ObjectProperty" || parent.type === "Property"; - const logicalSubExpression = n.left.type === "LogicalExpression"; + const samePrecedenceSubExpression = + isBinaryish(n.left) && util.shouldFlatten(n.operator, n.left.operator); if ( shouldNotIdent || - (shouldInlineLogicalExpression(n) && !logicalSubExpression) || + (shouldInlineLogicalExpression(n) && !samePrecedenceSubExpression) || (!shouldInlineLogicalExpression(n) && shouldIdentIfInlining) ) { return group(concat(parts)); diff --git a/tests/binary-expressions/__snapshots__/jsfmt.spec.js.snap b/tests/binary-expressions/__snapshots__/jsfmt.spec.js.snap index 5c4ba464..2c04ad01 100644 --- a/tests/binary-expressions/__snapshots__/jsfmt.spec.js.snap +++ b/tests/binary-expressions/__snapshots__/jsfmt.spec.js.snap @@ -145,6 +145,37 @@ if ( `; +exports[`inline-jsx.js 1`] = ` +const user = renderedUser ||
; + +const user = renderedUser || shouldRenderUser &&
; + +const avatar = hasAvatar && ; + +const avatar = (hasAvatar || showPlaceholder) && ; +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +const user = renderedUser || ( +
+ +
+); + +const user = + renderedUser || + (shouldRenderUser && ( +
+ +
+ )); + +const avatar = hasAvatar && ; + +const avatar = (hasAvatar || showPlaceholder) && ( + +); + +`; + exports[`inline-object-array.js 1`] = ` prevState = prevState || { catalogs: [], @@ -163,6 +194,23 @@ prevState = prevState || selectedCatalog: null, }; +prevState = prevState || + defaultState && { + catalogs: [], + loadState: LOADED, + opened: false, + searchQuery: '', + selectedCatalog: null, + }; + +prevState = prevState || useDefault && defaultState || { + catalogs: [], + loadState: LOADED, + opened: false, + searchQuery: '', + selectedCatalog: null, + }; + this.steps = steps || [ { name: 'mock-module', @@ -170,6 +218,20 @@ this.steps = steps || [ }, ]; +this.steps = steps || checkStep && [ + { + name: 'mock-module', + path: '/nux/mock-module', + }, +]; + +this.steps = steps && checkStep || [ + { + name: 'mock-module', + path: '/nux/mock-module', + }, +]; + const create = () => { const result = doSomething(); return ( @@ -182,12 +244,26 @@ const create = () => { ); } +const create = () => { + const result = doSomething(); + return ( + shouldReturn && result.ok && result || { + status: "ok", + createdAt: result.createdAt, + updatedAt: result.updatedAt + } + ); +} + const obj = { state: shouldHaveState && stateIsOK && { loadState: LOADED, opened: false }, + loadNext: stateIsOK && hasNext || { + skipNext: true + }, loaded: true } ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -208,6 +284,25 @@ prevState = prevState || selectedCatalog: null }; +prevState = + prevState || + (defaultState && { + catalogs: [], + loadState: LOADED, + opened: false, + searchQuery: "", + selectedCatalog: null + }); + +prevState = prevState || + (useDefault && defaultState) || { + catalogs: [], + loadState: LOADED, + opened: false, + searchQuery: "", + selectedCatalog: null + }; + this.steps = steps || [ { name: "mock-module", @@ -215,6 +310,22 @@ this.steps = steps || [ } ]; +this.steps = + steps || + (checkStep && [ + { + name: "mock-module", + path: "/nux/mock-module" + } + ]); + +this.steps = (steps && checkStep) || [ + { + name: "mock-module", + path: "/nux/mock-module" + } +]; + const create = () => { const result = doSomething(); return ( @@ -227,12 +338,26 @@ const create = () => { ); }; +const create = () => { + const result = doSomething(); + return ( + (shouldReturn && result.ok && result) || { + status: "ok", + createdAt: result.createdAt, + updatedAt: result.updatedAt + } + ); +}; + const obj = { state: shouldHaveState && stateIsOK && { loadState: LOADED, opened: false }, + loadNext: (stateIsOK && hasNext) || { + skipNext: true + }, loaded: true }; @@ -267,6 +392,11 @@ exports[`jsx_parent.js 1`] = ` {!isJellyfishEnabled && diffUpdateMessageInput != null &&
Text
} ; + +
+ {!isJellyfishEnabled && + diffUpdateMessageInput != null && child ||
Text
} +
; ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
; +
+ {(!isJellyfishEnabled && diffUpdateMessageInput != null && child) || ( +
+ Text +
+ )} +
; + `; exports[`math.js 1`] = ` diff --git a/tests/binary-expressions/inline-jsx.js b/tests/binary-expressions/inline-jsx.js new file mode 100644 index 00000000..b8b2f1a9 --- /dev/null +++ b/tests/binary-expressions/inline-jsx.js @@ -0,0 +1,7 @@ +const user = renderedUser ||
; + +const user = renderedUser || shouldRenderUser &&
; + +const avatar = hasAvatar && ; + +const avatar = (hasAvatar || showPlaceholder) && ; diff --git a/tests/binary-expressions/inline-object-array.js b/tests/binary-expressions/inline-object-array.js index 4aa40348..1a576462 100644 --- a/tests/binary-expressions/inline-object-array.js +++ b/tests/binary-expressions/inline-object-array.js @@ -15,6 +15,23 @@ prevState = prevState || selectedCatalog: null, }; +prevState = prevState || + defaultState && { + catalogs: [], + loadState: LOADED, + opened: false, + searchQuery: '', + selectedCatalog: null, + }; + +prevState = prevState || useDefault && defaultState || { + catalogs: [], + loadState: LOADED, + opened: false, + searchQuery: '', + selectedCatalog: null, + }; + this.steps = steps || [ { name: 'mock-module', @@ -22,6 +39,20 @@ this.steps = steps || [ }, ]; +this.steps = steps || checkStep && [ + { + name: 'mock-module', + path: '/nux/mock-module', + }, +]; + +this.steps = steps && checkStep || [ + { + name: 'mock-module', + path: '/nux/mock-module', + }, +]; + const create = () => { const result = doSomething(); return ( @@ -34,11 +65,25 @@ const create = () => { ); } +const create = () => { + const result = doSomething(); + return ( + shouldReturn && result.ok && result || { + status: "ok", + createdAt: result.createdAt, + updatedAt: result.updatedAt + } + ); +} + const obj = { state: shouldHaveState && stateIsOK && { loadState: LOADED, opened: false }, + loadNext: stateIsOK && hasNext || { + skipNext: true + }, loaded: true } diff --git a/tests/binary-expressions/jsx_parent.js b/tests/binary-expressions/jsx_parent.js index 9340fcf6..fbc0f425 100644 --- a/tests/binary-expressions/jsx_parent.js +++ b/tests/binary-expressions/jsx_parent.js @@ -26,3 +26,8 @@ {!isJellyfishEnabled && diffUpdateMessageInput != null &&
Text
}
; + +
+ {!isJellyfishEnabled && + diffUpdateMessageInput != null && child ||
Text
} +
;