Don't force array/object with short block comment to break (#18617)

This commit is contained in:
fisker Cheung authored and GitHub committed 2026-01-13 20:47:40 +08:00
1 parent 3b9ecca4d9
commit 78ff25b5cf
10 files changed
+145 -54

No files matched your search

+20
View File
@@ -0,0 +1,20 @@
#### Don't force empty array and object with short comments to break (#18617 by @fisker)
<!-- prettier-ignore -->
```jsx
// Input
const array = [/* comment */]
const object = {/* comment */}
// Prettier stable
const array = [
/* comment */
];
const object = {
/* comment */
};
// Prettier main
const array = [/* comment */];
const object = {/* comment */};
```
+15 -15
View File
@@ -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 },
),
+11 -6
View File
@@ -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),
+1
View File
@@ -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",
@@ -148,9 +148,7 @@ enum E2 of number {
// D = 100
}
enum E3 {
/*Q*/
}
enum E3 {/*Q*/}
enum E4 of string {
/*Q*/ Foo = "foo",
@@ -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 */
}
@@ -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 */);
================================================================================
`;
@@ -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 */)
@@ -0,0 +1 @@
runFormatTest(import.meta, ["babel", "flow", "typescript"]);
@@ -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 */