diff --git a/changelog_unreleased/javascript/pr-7709.md b/changelog_unreleased/javascript/pr-7709.md new file mode 100644 index 000000000..9ffff8eec --- /dev/null +++ b/changelog_unreleased/javascript/pr-7709.md @@ -0,0 +1,14 @@ +#### Keep comments position for assignments/variables ([#7709](https://github.com/prettier/prettier/pull/7709) by [@sosukesuzuki](https://github.com/sosukesuzuki)) + + +```jsx +// Input +const foo = /* comments */ + bar; + +// Prettier stable +const foo /* comments */ = bar; + +// Prettier master +const foo = /* comments */ bar; +``` diff --git a/src/language-js/comments.js b/src/language-js/comments.js index e619d04af..31fb59fd3 100644 --- a/src/language-js/comments.js +++ b/src/language-js/comments.js @@ -818,7 +818,8 @@ function handleVariableDeclaratorComments( (followingNode.type === "ObjectExpression" || followingNode.type === "ArrayExpression" || followingNode.type === "TemplateLiteral" || - followingNode.type === "TaggedTemplateExpression") + followingNode.type === "TaggedTemplateExpression" || + isBlockComment(comment)) ) { addLeadingComment(followingNode, comment); return true; diff --git a/src/language-js/printer-estree.js b/src/language-js/printer-estree.js index 87a825c03..8ee3608f1 100644 --- a/src/language-js/printer-estree.js +++ b/src/language-js/printer-estree.js @@ -5750,7 +5750,7 @@ function printBinaryishExpressions( function printAssignmentRight(leftNode, rightNode, printedRight, options) { if (hasLeadingOwnLineComment(options.originalText, rightNode, options)) { - return indent(concat([hardline, printedRight])); + return indent(concat([line, printedRight])); } const canBreak = diff --git a/src/main/comments.js b/src/main/comments.js index 60fbe5a8d..1c1758d93 100644 --- a/src/main/comments.js +++ b/src/main/comments.js @@ -3,6 +3,7 @@ const assert = require("assert"); const { concat, + line, hardline, breakParent, indent, @@ -387,10 +388,15 @@ function printLeadingComment(commentPath, print, options) { // Leading block comments should see if they need to stay on the // same line or not. if (isBlock) { - return concat([ - contents, - hasNewline(options.originalText, options.locEnd(comment)) ? hardline : " " - ]); + const lineBreak = hasNewline(options.originalText, options.locEnd(comment)) + ? hasNewline(options.originalText, options.locStart(comment), { + backwards: true + }) + ? hardline + : line + : " "; + + return concat([contents, lineBreak]); } return concat([contents, hardline]); diff --git a/tests/assignment_comments/__snapshots__/jsfmt.spec.js.snap b/tests/assignment_comments/__snapshots__/jsfmt.spec.js.snap index c30a57fd0..08130fb90 100644 --- a/tests/assignment_comments/__snapshots__/jsfmt.spec.js.snap +++ b/tests/assignment_comments/__snapshots__/jsfmt.spec.js.snap @@ -1,6 +1,253 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`assignment_comments.js 1`] = ` +exports[`function.js 1`] = ` +====================================options===================================== +parsers: ["flow", "typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +f1 = ( + a = + //comment + b +) => {}; + +f2 = ( + a = //comment + b +) => {}; + +f3 = ( + a = + b //comment +) => {}; + +f4 = // Comment + () => {}; + +f5 = + + // Comment + + () => {} + +f6 = /* comment */ + + // Comment + + () => {} + +let f1 = ( + a = + //comment + b +) => {}; + +let f2 = ( + a = //comment + b +) => {}; + +let f3 = ( + a = + b //comment +) => {}; + +let f4 = // Comment + () => {}; + +let f5 = + + // Comment + + () => {} + +let f6 = /* comment */ + + // Comment + + () => {} + +=====================================output===================================== +f1 = ( + //comment + a = b +) => {}; + +f2 = ( + a = b //comment +) => {}; + +f3 = ( + a = b //comment +) => {}; + +f4 = () => {}; // Comment + +f5 = + // Comment + + () => {}; + +f6 = + /* comment */ + + // Comment + + () => {}; + +let f1 = ( + //comment + a = b +) => {}; + +let f2 = ( + a = b //comment +) => {}; + +let f3 = ( + a = b //comment +) => {}; + +let f4 = () => {}; // Comment + +let f5 = + // Comment + + () => {}; + +let f6 = + /* comment */ + + // Comment + + () => {}; + +================================================================================ +`; + +exports[`identifier.js 1`] = ` +====================================options===================================== +parsers: ["flow", "typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +const kochabCooieGameOnOboleUnweave = // ??? + annularCooeedSplicesWalksWayWay; + +const bifornCringerMoshedPerplexSawder = // !!! + glimseGlyphsHazardNoopsTieTie + + averredBathersBoxroomBuggyNurl - + anodyneCondosMalateOverateRetinol; + +=====================================output===================================== +const kochabCooieGameOnOboleUnweave = annularCooeedSplicesWalksWayWay; // ??? + +const bifornCringerMoshedPerplexSawder = // !!! + glimseGlyphsHazardNoopsTieTie + + averredBathersBoxroomBuggyNurl - + anodyneCondosMalateOverateRetinol; + +================================================================================ +`; + +exports[`number.js 1`] = ` +====================================options===================================== +parsers: ["flow", "typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +fnNumber = + // Comment + 3; + +fnNumber = + + // Comment + + 3; + +fnNumber = + // Comment0 + // Comment1 + 3; + +fnNumber = /* comment */ + 3; + +fnNumber = /* comments0 */ + /* comments1 */ + 3; + +fnNumber = + // Comment + 3; + +var fnNumber = + + // Comment + + 3; + +var fnNumber = + // Comment0 + // Comment1 + 3; + +var fnNumber = /* comment */ + 3; + +var fnNumber = /* comments0 */ + /* comments1 */ + 3; + +=====================================output===================================== +fnNumber = + // Comment + 3; + +fnNumber = + // Comment + + 3; + +fnNumber = + // Comment0 + // Comment1 + 3; + +fnNumber = /* comment */ 3; + +fnNumber = + /* comments0 */ + /* comments1 */ + 3; + +fnNumber = + // Comment + 3; + +var fnNumber = + // Comment + + 3; + +var fnNumber = + // Comment0 + // Comment1 + 3; + +var fnNumber = /* comment */ 3; + +var fnNumber = + /* comments0 */ + /* comments1 */ + 3; + +================================================================================ +`; + +exports[`string.js 1`] = ` ====================================options===================================== parsers: ["flow", "typescript"] printWidth: 80 @@ -10,7 +257,38 @@ fnString = // Comment 'some' + 'long' + 'string'; -var fnString = +fnString = + // Comment + + 'some' + 'long' + 'string'; + +fnString = + + // Comment + + 'some' + 'long' + 'string'; + +fnString = + /* comment */ + 'some' + 'long' + 'string'; + +fnString = + /** + * multi-line + */ + 'some' + 'long' + 'string'; + +fnString = + /* inline */ 'some' + 'long' + 'string' + 'some' + 'long' + 'string' + 'some' + 'long' + 'string' + 'some' + 'long' + 'string'; + +fnString = // Comment0 + // Comment1 + 'some' + 'long' + 'string'; + +fnString = // Comment + 'some' + 'long' + 'string'; + +fnString = // Comment 'some' + 'long' + 'string'; @@ -38,35 +316,59 @@ var fnString = var fnString = /* inline */ 'some' + 'long' + 'string' + 'some' + 'long' + 'string' + 'some' + 'long' + 'string' + 'some' + 'long' + 'string'; -var fnString = // Comment - // Comment +var fnString = // Comment0 + // Comment1 'some' + 'long' + 'string'; var fnString = // Comment 'some' + 'long' + 'string'; -let f1 = ( - a = - //comment - b -) => {}; - -let f2 = ( - a = //comment - b -) => {}; - -let f3 = ( - a = - b //comment -) => {}; - =====================================output===================================== fnString = // Comment "some" + "long" + "string"; -var fnString = +fnString = + // Comment + + "some" + "long" + "string"; + +fnString = + // Comment + + "some" + "long" + "string"; + +fnString = + /* comment */ + "some" + "long" + "string"; + +fnString = + /** + * multi-line + */ + "some" + "long" + "string"; + +fnString = + /* inline */ "some" + + "long" + + "string" + + "some" + + "long" + + "string" + + "some" + + "long" + + "string" + + "some" + + "long" + + "string"; + +fnString = // Comment0 + // Comment1 + "some" + "long" + "string"; + +fnString = "some" + "long" + "string"; // Comment + +fnString = // Comment "some" + "long" + "string"; @@ -104,24 +406,11 @@ var fnString = "long" + "string"; -var fnString = // Comment - // Comment +var fnString = // Comment0 + // Comment1 "some" + "long" + "string"; var fnString = "some" + "long" + "string"; // Comment -let f1 = ( - //comment - a = b -) => {}; - -let f2 = ( - a = b //comment -) => {}; - -let f3 = ( - a = b //comment -) => {}; - ================================================================================ `; diff --git a/tests/assignment_comments/function.js b/tests/assignment_comments/function.js new file mode 100644 index 000000000..791193b7c --- /dev/null +++ b/tests/assignment_comments/function.js @@ -0,0 +1,61 @@ +f1 = ( + a = + //comment + b +) => {}; + +f2 = ( + a = //comment + b +) => {}; + +f3 = ( + a = + b //comment +) => {}; + +f4 = // Comment + () => {}; + +f5 = + + // Comment + + () => {} + +f6 = /* comment */ + + // Comment + + () => {} + +let f1 = ( + a = + //comment + b +) => {}; + +let f2 = ( + a = //comment + b +) => {}; + +let f3 = ( + a = + b //comment +) => {}; + +let f4 = // Comment + () => {}; + +let f5 = + + // Comment + + () => {} + +let f6 = /* comment */ + + // Comment + + () => {} diff --git a/tests/assignment_comments/identifier.js b/tests/assignment_comments/identifier.js new file mode 100644 index 000000000..e900cea7c --- /dev/null +++ b/tests/assignment_comments/identifier.js @@ -0,0 +1,7 @@ +const kochabCooieGameOnOboleUnweave = // ??? + annularCooeedSplicesWalksWayWay; + +const bifornCringerMoshedPerplexSawder = // !!! + glimseGlyphsHazardNoopsTieTie + + averredBathersBoxroomBuggyNurl - + anodyneCondosMalateOverateRetinol; diff --git a/tests/assignment_comments/number.js b/tests/assignment_comments/number.js new file mode 100644 index 000000000..24ed9f43a --- /dev/null +++ b/tests/assignment_comments/number.js @@ -0,0 +1,43 @@ +fnNumber = + // Comment + 3; + +fnNumber = + + // Comment + + 3; + +fnNumber = + // Comment0 + // Comment1 + 3; + +fnNumber = /* comment */ + 3; + +fnNumber = /* comments0 */ + /* comments1 */ + 3; + +fnNumber = + // Comment + 3; + +var fnNumber = + + // Comment + + 3; + +var fnNumber = + // Comment0 + // Comment1 + 3; + +var fnNumber = /* comment */ + 3; + +var fnNumber = /* comments0 */ + /* comments1 */ + 3; diff --git a/tests/assignment_comments/assignment_comments.js b/tests/assignment_comments/string.js similarity index 52% rename from tests/assignment_comments/assignment_comments.js rename to tests/assignment_comments/string.js index 29ac7b4d3..489a018d0 100644 --- a/tests/assignment_comments/assignment_comments.js +++ b/tests/assignment_comments/string.js @@ -2,7 +2,38 @@ fnString = // Comment 'some' + 'long' + 'string'; -var fnString = +fnString = + // Comment + + 'some' + 'long' + 'string'; + +fnString = + + // Comment + + 'some' + 'long' + 'string'; + +fnString = + /* comment */ + 'some' + 'long' + 'string'; + +fnString = + /** + * multi-line + */ + 'some' + 'long' + 'string'; + +fnString = + /* inline */ 'some' + 'long' + 'string' + 'some' + 'long' + 'string' + 'some' + 'long' + 'string' + 'some' + 'long' + 'string'; + +fnString = // Comment0 + // Comment1 + 'some' + 'long' + 'string'; + +fnString = // Comment + 'some' + 'long' + 'string'; + +fnString = // Comment 'some' + 'long' + 'string'; @@ -30,25 +61,9 @@ var fnString = var fnString = /* inline */ 'some' + 'long' + 'string' + 'some' + 'long' + 'string' + 'some' + 'long' + 'string' + 'some' + 'long' + 'string'; -var fnString = // Comment - // Comment +var fnString = // Comment0 + // Comment1 'some' + 'long' + 'string'; var fnString = // Comment 'some' + 'long' + 'string'; - -let f1 = ( - a = - //comment - b -) => {}; - -let f2 = ( - a = //comment - b -) => {}; - -let f3 = ( - a = - b //comment -) => {}; diff --git a/tests/comments/__snapshots__/jsfmt.spec.js.snap b/tests/comments/__snapshots__/jsfmt.spec.js.snap index 56209f896..685f6f170 100644 --- a/tests/comments/__snapshots__/jsfmt.spec.js.snap +++ b/tests/comments/__snapshots__/jsfmt.spec.js.snap @@ -929,12 +929,7 @@ import( /* Hello */ ); -wrap( - import( - /* Hello */ - "something" - ) -); +wrap(import(/* Hello */ "something")); ================================================================================ `; @@ -981,12 +976,7 @@ import( /* Hello */ ) -wrap( - import( - /* Hello */ - "something" - ) -) +wrap(import(/* Hello */ "something")) ================================================================================ `; @@ -1572,9 +1562,7 @@ else { if (10) { /* comment */ // comment true; -} else if (11) - /* comment */ - true; +} else if (11) /* comment */ true; else if (12) // comment /* comment */ // comment true; @@ -1721,9 +1709,7 @@ else { if (10) { /* comment */ // comment true -} else if (11) - /* comment */ - true +} else if (11) /* comment */ true else if (12) // comment /* comment */ // comment true diff --git a/tests/comments_closure_typecast/__snapshots__/jsfmt.spec.js.snap b/tests/comments_closure_typecast/__snapshots__/jsfmt.spec.js.snap index 3fcc5c771..dd6c8517e 100644 --- a/tests/comments_closure_typecast/__snapshots__/jsfmt.spec.js.snap +++ b/tests/comments_closure_typecast/__snapshots__/jsfmt.spec.js.snap @@ -78,6 +78,9 @@ const v6 = /**@type {string} */(value); const v7 = /** @type{string} */(value); const v8 = /**@type{string} */(value); +const v9 = /** @type {string} */ + (value); + =====================================output===================================== // test to make sure comments are attached correctly let inlineComment = /* some comment */ someReallyLongFunctionCall( @@ -154,6 +157,8 @@ const v6 = /**@type {string} */ (value); const v7 = /** @type{string} */ (value); const v8 = /**@type{string} */ (value); +const v9 = /** @type {string} */ (value); + ================================================================================ `; diff --git a/tests/comments_closure_typecast/closure-compiler-type-cast.js b/tests/comments_closure_typecast/closure-compiler-type-cast.js index 585e92b0f..c84833dc5 100644 --- a/tests/comments_closure_typecast/closure-compiler-type-cast.js +++ b/tests/comments_closure_typecast/closure-compiler-type-cast.js @@ -69,3 +69,6 @@ const style2 =/** const v6 = /**@type {string} */(value); const v7 = /** @type{string} */(value); const v8 = /**@type{string} */(value); + +const v9 = /** @type {string} */ + (value); diff --git a/tests/if/__snapshots__/jsfmt.spec.js.snap b/tests/if/__snapshots__/jsfmt.spec.js.snap index a9885f619..859bd5b94 100644 --- a/tests/if/__snapshots__/jsfmt.spec.js.snap +++ b/tests/if/__snapshots__/jsfmt.spec.js.snap @@ -162,15 +162,9 @@ async function f1() { } async function f2() { - if (untrackedChoice === 0) - /* Cancel */ - null; - else if (untrackedChoice === 1) - /* Add */ - shouldAmend = true; - else if (untrackedChoice === 2) - /* Allow Untracked */ - allowUntracked = true; + if (untrackedChoice === 0) /* Cancel */ null; + else if (untrackedChoice === 1) /* Add */ shouldAmend = true; + else if (untrackedChoice === 2) /* Allow Untracked */ allowUntracked = true; } async function f3() {