From 78ff25b5cfed91e047ac7776b95f7108579f00bc Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Tue, 13 Jan 2026 20:47:40 +0800 Subject: [PATCH] Don't force array/object with short block comment to break (#18617) --- changelog_unreleased/javascript/18617.md | 20 ++++++ src/language-js/print/array.js | 30 ++++----- src/language-js/print/object.js | 17 +++-- tests/config/run-format-test.js | 1 + .../enums/__snapshots__/format.test.js.snap | 4 +- .../__snapshots__/format.test.js.snap | 16 ++--- .../in-list/__snapshots__/format.test.js.snap | 63 +++++++++++++++++++ .../in-list/dangling-comment-in-list.js | 23 +++++++ .../format/js/comments/in-list/format.test.js | 1 + .../tuple/__snapshots__/format.test.js.snap | 24 ++----- 10 files changed, 145 insertions(+), 54 deletions(-) create mode 100644 changelog_unreleased/javascript/18617.md create mode 100644 tests/format/js/comments/in-list/__snapshots__/format.test.js.snap create mode 100644 tests/format/js/comments/in-list/dangling-comment-in-list.js create mode 100644 tests/format/js/comments/in-list/format.test.js diff --git a/changelog_unreleased/javascript/18617.md b/changelog_unreleased/javascript/18617.md new file mode 100644 index 000000000..400979305 --- /dev/null +++ b/changelog_unreleased/javascript/18617.md @@ -0,0 +1,20 @@ +#### Don't force empty array and object with short comments to break (#18617 by @fisker) + + +```jsx +// Input +const array = [/* comment */] +const object = {/* comment */} + +// Prettier stable +const array = [ + /* comment */ +]; +const object = { + /* comment */ +}; + +// Prettier main +const array = [/* comment */]; +const object = {/* comment */}; +``` diff --git a/src/language-js/print/array.js b/src/language-js/print/array.js index e02bd6683..b0d60bc8e 100644 --- a/src/language-js/print/array.js +++ b/src/language-js/print/array.js @@ -28,16 +28,20 @@ import { printTypeAnnotationProperty } from "./type-annotation.js"; /** @import {Doc} from "../../document/index.js" */ -function printEmptyArrayElements(path, options, openBracket, closeBracket) { +function printEmptyArrayElements(path, options) { const { node } = path; - if (!hasComment(node, CommentCheckFlags.Dangling)) { - return [openBracket, closeBracket]; - } + return group([ - openBracket, - printDanglingComments(path, options, { indent: true }), - softline, - closeBracket, + "[", + hasComment(node, CommentCheckFlags.Dangling) + ? [ + indent([softline, printDanglingComments(path, options)]), + hasComment(node, CommentCheckFlags.Dangling | CommentCheckFlags.Line) + ? hardline + : softline, + ] + : [], + "]", ]); } @@ -52,14 +56,10 @@ function printArray(path, options, print) { /** @type{Doc[]} */ const parts = []; - const openBracket = "["; - const closeBracket = "]"; const elementsProperty = isTupleType(node) ? "elementTypes" : "elements"; const elements = node[elementsProperty]; if (elements.length === 0 && !node.inexact) { - parts.push( - printEmptyArrayElements(path, options, openBracket, closeBracket), - ); + parts.push(printEmptyArrayElements(path, options)); } else { const lastElem = elements.at(-1); const canHaveTrailingComma = @@ -116,7 +116,7 @@ function printArray(path, options, print) { parts.push( group( [ - openBracket, + "[", indent([ softline, shouldUseConciseFormatting @@ -134,7 +134,7 @@ function printArray(path, options, print) { printDanglingComments(path, options), ]), softline, - closeBracket, + "]", ], { shouldBreak, id: groupId }, ), diff --git a/src/language-js/print/object.js b/src/language-js/print/object.js index ce93bca21..3e0ab1334 100644 --- a/src/language-js/print/object.js +++ b/src/language-js/print/object.js @@ -134,14 +134,19 @@ function printObject(path, options, print) { let content; if (parts.length === 0) { - if (!hasComment(node, CommentCheckFlags.Dangling)) { - return ["{}", printTypeAnnotationProperty(path, print)]; - } - content = group([ "{", - printDanglingComments(path, options, { indent: true }), - softline, + hasComment(node, CommentCheckFlags.Dangling) + ? [ + indent([softline, printDanglingComments(path, options)]), + hasComment( + node, + CommentCheckFlags.Dangling | CommentCheckFlags.Line, + ) + ? hardline + : softline, + ] + : [], "}", printOptionalToken(path), printTypeAnnotationProperty(path, print), diff --git a/tests/config/run-format-test.js b/tests/config/run-format-test.js index 921b00d63..780c39142 100644 --- a/tests/config/run-format-test.js +++ b/tests/config/run-format-test.js @@ -27,6 +27,7 @@ const unstableTests = new Map( "js/comments/return-statement.js", "js/comments/tagged-template-literal.js", "js/for/9812-unstable.js", + "js/comments/in-list/dangling-comment-in-list.js", [ "js/multiparser-markdown/codeblock.js", (options) => options.proseWrap === "always", diff --git a/tests/format/flow/enums/__snapshots__/format.test.js.snap b/tests/format/flow/enums/__snapshots__/format.test.js.snap index db6cd6c3d..91fe51a01 100644 --- a/tests/format/flow/enums/__snapshots__/format.test.js.snap +++ b/tests/format/flow/enums/__snapshots__/format.test.js.snap @@ -148,9 +148,7 @@ enum E2 of number { // D = 100 } -enum E3 { - /*Q*/ -} +enum E3 {/*Q*/} enum E4 of string { /*Q*/ Foo = "foo", diff --git a/tests/format/js/comments/__snapshots__/format.test.js.snap b/tests/format/js/comments/__snapshots__/format.test.js.snap index 69c5002ac..52bb23f5a 100644 --- a/tests/format/js/comments/__snapshots__/format.test.js.snap +++ b/tests/format/js/comments/__snapshots__/format.test.js.snap @@ -1580,15 +1580,11 @@ Thing(/* dangling */); export /* dangling */{}; =====================================output===================================== -var a = { - /* dangling */ -} +var a = {/* dangling */} var b = { // dangling } -var b = [ - /* dangling */ -] +var b = [/* dangling */] function d() { /* dangling */ } @@ -1618,15 +1614,11 @@ Thing(/* dangling */); export /* dangling */{}; =====================================output===================================== -var a = { - /* dangling */ -}; +var a = {/* dangling */}; var b = { // dangling }; -var b = [ - /* dangling */ -]; +var b = [/* dangling */]; function d() { /* dangling */ } diff --git a/tests/format/js/comments/in-list/__snapshots__/format.test.js.snap b/tests/format/js/comments/in-list/__snapshots__/format.test.js.snap new file mode 100644 index 000000000..4a973e97c --- /dev/null +++ b/tests/format/js/comments/in-list/__snapshots__/format.test.js.snap @@ -0,0 +1,63 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`dangling-comment-in-list.js format 1`] = ` +====================================options===================================== +parsers: ["babel", "flow", "typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +array = [/* array */] +object = {/* object */} +call = call(/* call argument */) +fn = function(/* function parameter */) {} +newFoo = new Foo(/* new argument */) + +// TODO[@fisker]: fix the following +array = [ +/* array */] +object = { +/* object */} +call = call( +/* call argument */) +fn = function( +/* function parameter */) {} +newFoo = new Foo +(/* new argument */) + +array = [/* array long long long long long long long long long long long long long long */] +object = {/* object long long long long long long long long long long long long long long */} +call = call(/* call argument long long long long long long long long long long long long long long */) +fn = function (/* function long parameter long long long long long long long long long long long long long */) {} +newFoo = new Foo(/* new argument long long long long long long long long long long long long long long */) + +=====================================output===================================== +array = [/* array */]; +object = {/* object */}; +call = call(/* call argument */); +fn = function (/* function parameter */) {}; +newFoo = new Foo(/* new argument */); + +// TODO[@fisker]: fix the following +array = [/* array */]; +object = {/* object */}; +call = + call(); + /* call argument */ +fn = function () /* function parameter */ {}; +newFoo = new Foo(/* new argument */); + +array = [ + /* array long long long long long long long long long long long long long long */ +]; +object = { + /* object long long long long long long long long long long long long long long */ +}; +call = + call(/* call argument long long long long long long long long long long long long long long */); +fn = + function (/* function long parameter long long long long long long long long long long long long long */) {}; +newFoo = + new Foo(/* new argument long long long long long long long long long long long long long long */); + +================================================================================ +`; diff --git a/tests/format/js/comments/in-list/dangling-comment-in-list.js b/tests/format/js/comments/in-list/dangling-comment-in-list.js new file mode 100644 index 000000000..46c665cf1 --- /dev/null +++ b/tests/format/js/comments/in-list/dangling-comment-in-list.js @@ -0,0 +1,23 @@ +array = [/* array */] +object = {/* object */} +call = call(/* call argument */) +fn = function(/* function parameter */) {} +newFoo = new Foo(/* new argument */) + +// TODO[@fisker]: fix the following +array = [ +/* array */] +object = { +/* object */} +call = call( +/* call argument */) +fn = function( +/* function parameter */) {} +newFoo = new Foo +(/* new argument */) + +array = [/* array long long long long long long long long long long long long long long */] +object = {/* object long long long long long long long long long long long long long long */} +call = call(/* call argument long long long long long long long long long long long long long long */) +fn = function (/* function long parameter long long long long long long long long long long long long long */) {} +newFoo = new Foo(/* new argument long long long long long long long long long long long long long long */) diff --git a/tests/format/js/comments/in-list/format.test.js b/tests/format/js/comments/in-list/format.test.js new file mode 100644 index 000000000..67c251cce --- /dev/null +++ b/tests/format/js/comments/in-list/format.test.js @@ -0,0 +1 @@ +runFormatTest(import.meta, ["babel", "flow", "typescript"]); diff --git a/tests/format/typescript/tuple/__snapshots__/format.test.js.snap b/tests/format/typescript/tuple/__snapshots__/format.test.js.snap index c28c7dae0..0f7368aa9 100644 --- a/tests/format/typescript/tuple/__snapshots__/format.test.js.snap +++ b/tests/format/typescript/tuple/__snapshots__/format.test.js.snap @@ -36,9 +36,7 @@ type Foo6 = [ =====================================output===================================== -type Foo1 = [ - /* comment */ -]; +type Foo1 = [/* comment */]; type Foo2 = [ // comment @@ -54,9 +52,7 @@ type Foo4 = [ // comment2 ]; -type Foo5 = [ - /* comment1 */ -]; +type Foo5 = [/* comment1 */]; type Foo6 = [ /* comment1 */ @@ -102,9 +98,7 @@ type Foo6 = [ =====================================output===================================== -type Foo1 = [ - /* comment */ -]; +type Foo1 = [/* comment */]; type Foo2 = [ // comment @@ -120,9 +114,7 @@ type Foo4 = [ // comment2 ]; -type Foo5 = [ - /* comment1 */ -]; +type Foo5 = [/* comment1 */]; type Foo6 = [ /* comment1 */ @@ -168,9 +160,7 @@ type Foo6 = [ =====================================output===================================== -type Foo1 = [ - /* comment */ -]; +type Foo1 = [/* comment */]; type Foo2 = [ // comment @@ -186,9 +176,7 @@ type Foo4 = [ // comment2 ]; -type Foo5 = [ - /* comment1 */ -]; +type Foo5 = [/* comment1 */]; type Foo6 = [ /* comment1 */