From bba196abc80f055b801ae6b2f55e0041237c1008 Mon Sep 17 00:00:00 2001 From: Sosuke Suzuki Date: Thu, 8 Oct 2020 20:11:15 +0900 Subject: [PATCH] Improve formatting for AssignmentExpression with ClassExpression that has long superClass (#9341) * Improve formatting for AssignmentExpression with ClassExpression that has long superClass Fix by prettier * Add changelog * Remove unnecesary concat call * Mention abount Google Closure Library in changelog --- changelog_unreleased/javascript/pr-9341.md | 33 +++++++++ src/language-js/printer-estree.js | 15 +++- .../classes/__snapshots__/jsfmt.spec.js.snap | 68 +++++++++++++++++++ tests/js/classes/assignment.js | 25 +++++++ 4 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 changelog_unreleased/javascript/pr-9341.md create mode 100644 tests/js/classes/assignment.js diff --git a/changelog_unreleased/javascript/pr-9341.md b/changelog_unreleased/javascript/pr-9341.md new file mode 100644 index 000000000..e7a38b91c --- /dev/null +++ b/changelog_unreleased/javascript/pr-9341.md @@ -0,0 +1,33 @@ +#### Improve formatting for `AssignmentExpression` with `ClassExpression` that has a long super class (#9341 by @sosukesuzuki) + +This improves the formatting for [Google Closure Library Namespace](https://developers.google.com/closure/library/docs/introduction#names). + + +```js +// Input +aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 = class extends ( + aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg1 +) { + method () { + console.log("foo"); + } +}; + +// Prettier stable +aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 = class extends aaaaaaaa + .bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg1 { + method() { + console.log("foo"); + } +}; + +// Prettier master +aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 = class extends ( + aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg1 +) { + method() { + console.log("foo"); + } +}; + +``` diff --git a/src/language-js/printer-estree.js b/src/language-js/printer-estree.js index d511eac14..e303d3cf2 100644 --- a/src/language-js/printer-estree.js +++ b/src/language-js/printer-estree.js @@ -4322,9 +4322,22 @@ function printClass(path, options, print) { } if (n.superClass) { + const printSuperClass = (path) => { + const printed = path.call(print, "superClass"); + const parent = path.getParentNode(); + if (parent && parent.type === "AssignmentExpression") { + return concat([ + ifBreak("("), + indent(concat([softline, printed])), + softline, + ifBreak(")"), + ]); + } + return printed; + }; const printed = concat([ "extends ", - path.call(print, "superClass"), + printSuperClass(path), path.call(print, "superTypeParameters"), ]); const printedWithComments = path.call( diff --git a/tests/js/classes/__snapshots__/jsfmt.spec.js.snap b/tests/js/classes/__snapshots__/jsfmt.spec.js.snap index d073c79fa..d2dc7033b 100644 --- a/tests/js/classes/__snapshots__/jsfmt.spec.js.snap +++ b/tests/js/classes/__snapshots__/jsfmt.spec.js.snap @@ -1,5 +1,73 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`assignment.js format 1`] = ` +====================================options===================================== +parsers: ["babel", "flow", "typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 = class extends ( + aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg1 +) { + method () { + console.log("foo"); + } +}; + +foo = class extends bar { + method() { + console.log("foo"); + } +}; + +aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 = class extends bar { + method() { + console.log("foo"); + } +}; + +foo = class extends aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 { + method() { + console.log("foo"); + } +}; + +=====================================output===================================== +aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 = class extends ( + aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg1 +) { + method() { + console.log("foo"); + } +}; + +foo = class extends ( + bar +) { + method() { + console.log("foo"); + } +}; + +aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 = class extends ( + bar +) { + method() { + console.log("foo"); + } +}; + +foo = class extends ( + aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 +) { + method() { + console.log("foo"); + } +}; + +================================================================================ +`; + exports[`binary.js format 1`] = ` ====================================options===================================== parsers: ["babel", "flow", "typescript"] diff --git a/tests/js/classes/assignment.js b/tests/js/classes/assignment.js new file mode 100644 index 000000000..dc0f6c4b6 --- /dev/null +++ b/tests/js/classes/assignment.js @@ -0,0 +1,25 @@ +aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 = class extends ( + aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg1 +) { + method () { + console.log("foo"); + } +}; + +foo = class extends bar { + method() { + console.log("foo"); + } +}; + +aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 = class extends bar { + method() { + console.log("foo"); + } +}; + +foo = class extends aaaaaaaa.bbbbbbbb.cccccccc.dddddddd.eeeeeeee.ffffffff.gggggggg2 { + method() { + console.log("foo"); + } +};