Improve comment handling around calls without arguments (#18615)

This commit is contained in:
fisker Cheung authored and GitHub committed 2026-01-13 21:40:22 +08:00
1 parent 78ff25b5cf
commit 7733de931e
12 files changed
+306 -14

No files matched your search

@@ -0,0 +1,53 @@
#### Improve comment handling around empty call argument list (#18615 by @fisker)
<!-- prettier-ignore -->
```jsx
// Input
call
// line comment
();
call(// line comment
);
call(
// line comment
);
call
/* block comment */
();
call(/* block comment */
);
call(
/* block comment */
);
// Prettier stable
call();
// line comment
call(); // line comment
call();
// line comment
call();
/* block comment */
call /* block comment */();
call();
/* block comment */
// Prettier main
call
// line comment
();
call(
// line comment
);
call(
// line comment
);
call
/* block comment */
();
call(/* block comment */);
call(/* block comment */);
```
@@ -0,0 +1,21 @@
#### Fix unstable comment in call expression (#18615 by @fisker)
<!-- prettier-ignore -->
```jsx
// Input
foo =
call(
/* call argument */);
// Prettier stable (First format)
foo =
call();
/* call argument */
// Prettier stable (Second format)
foo = call();
/* call argument */
// Prettier main
foo = call(/* call argument */);
```
+29
View File
@@ -0,0 +1,29 @@
#### Allow empty call expression argument list with long comments to break (#18615 by @fisker)
<!-- prettier-ignore -->
```jsx
// Input
call(/* a long long long long long long long long long long long long comment */);
array = [/* a long long long long long long long long long long long long comment */];
object = {/* a long long long long long long long long long long long long comment */};
// Prettier stable
call(/* a long long long long long long long long long long long long comment */);
array = [
/* a long long long long long long long long long long long long comment */
];
object = {
/* a long long long long long long long long long long long long comment */
};
// Prettier main
call(
/* a long long long long long long long long long long long long comment */
);
array = [
/* a long long long long long long long long long long long long comment */
];
object = {
/* a long long long long long long long long long long long long comment */
};
```
+8 -1
View File
@@ -82,6 +82,7 @@ function handleOwnLineComment(context) {
handleCommentsInDestructuringPattern,
handleTSMappedTypeComments,
handleBinaryCastExpressionComment,
handleCommentInEmptyParens,
].some((fn) => fn(context));
}
@@ -112,6 +113,7 @@ function handleEndOfLineComment(context) {
handleCommentAfterArrowExpression,
handlePropertySignatureComments,
handleBinaryCastExpressionComment,
handleCommentInEmptyParens,
].some((fn) => fn(context));
}
@@ -635,10 +637,14 @@ function handleCommentInEmptyParens({ comment, enclosingNode, options }) {
return false;
}
// This condition should be removed, but excluded for function parameters in #18615 to make PRs smaller
const isRemainingComment = comment.placement === "remaining";
// Only add dangling comments to fix the case when no params are present,
// i.e. a function without any argument.
if (
((isRealFunctionLikeNode(enclosingNode) &&
((isRemainingComment &&
isRealFunctionLikeNode(enclosingNode) &&
getFunctionParameters(enclosingNode).length === 0) ||
(isCallLikeExpression(enclosingNode) &&
getCallArguments(enclosingNode).length === 0)) &&
@@ -649,6 +655,7 @@ function handleCommentInEmptyParens({ comment, enclosingNode, options }) {
}
if (
isRemainingComment &&
(enclosingNode.type === "MethodDefinition" ||
enclosingNode.type === "TSAbstractMethodDefinition") &&
getFunctionParameters(enclosingNode.value).length === 0 &&
+16 -1
View File
@@ -49,8 +49,23 @@ function printCallArguments(path, options, print) {
const { node } = path;
const args = getCallArguments(node);
if (args.length === 0) {
return ["(", printDanglingComments(path, options), ")"];
return group([
"(",
hasComment(node, CommentCheckFlags.Dangling)
? [
indent([softline, printDanglingComments(path, options)]),
hasComment(
node,
CommentCheckFlags.Dangling | CommentCheckFlags.Line,
)
? hardline
: softline,
]
: [],
")",
]);
}
const lastArgIndex = args.length - 1;
+2 -1
View File
@@ -1,4 +1,4 @@
import { group, join } from "../../document/index.js";
import { group, join, lineSuffixBoundary } from "../../document/index.js";
import needsParentheses from "../parentheses/needs-parentheses.js";
import {
getCallArguments,
@@ -93,6 +93,7 @@ function printCallExpression(path, options, print) {
printCallee(path, print),
optional,
typeArgumentsDoc,
lineSuffixBoundary,
printCallArguments(path, options, print),
];
-1
View File
@@ -27,7 +27,6 @@ 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",
@@ -1,5 +1,112 @@
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`no-arguments.js format 1`] = `
====================================options=====================================
parsers: ["babel", "flow", "typescript"]
printWidth: 80
| printWidth
=====================================input======================================
call// 101
()
call
// 102
()
call(// 103
)
call
(// 104
)
call(
// 105
)
call// 106
?.(
)
call// 107
?.(
)
call?.// 108
(
)
call/* 201 */
()
call
/* 202 */
()
call/* 203 */()
call(/* 204 */
)
call(
/* 205 */
)
call/* 206 */?.
()
call/* 207 */
?.
()
call
/* 208 */?.
()
call/* 209 */
?.
()
call?./* 210 */
()
call
?./* 211 */
()
call
?.
/* 212 */
()
=====================================output=====================================
call // 101
();
call
// 102
();
call(
// 103
);
call(
// 104
);
call(
// 105
);
call?. // 106
();
call?. // 107
();
call?. // 108
();
call /* 201 */();
call
/* 202 */
();
call /* 203 */();
call(/* 204 */);
call(/* 205 */);
call /* 206 */?.();
call /* 207 */?.();
call?.
/* 208 */
();
call /* 209 */?.();
call /* 210 */?.();
call /* 211 */?.();
call?.
/* 212 */
();
================================================================================
`;
exports[`special-cases.js format 1`] = `
====================================options=====================================
parsers: ["babel", "flow", "typescript"]
@@ -0,0 +1,55 @@
call// 101
()
call
// 102
()
call(// 103
)
call
(// 104
)
call(
// 105
)
call// 106
?.(
)
call// 107
?.(
)
call?.// 108
(
)
call/* 201 */
()
call
/* 202 */
()
call/* 203 */()
call(/* 204 */
)
call(
/* 205 */
)
call/* 206 */?.
()
call/* 207 */
?.
()
call
/* 208 */?.
()
call/* 209 */
?.
()
call?./* 210 */
()
call
?./* 211 */
()
call
?.
/* 212 */
()
@@ -12,13 +12,13 @@ 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 */)
// TODO[@fisker]: fix this
fn = function(
/* function parameter */) {}
newFoo = new Foo
@@ -27,6 +27,7 @@ newFoo = new Foo
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 */)
// TODO[@fisker]: fix this
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 */)
@@ -37,12 +38,10 @@ 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 */
call = call(/* call argument */);
// TODO[@fisker]: fix this
fn = function () /* function parameter */ {};
newFoo = new Foo(/* new argument */);
@@ -53,11 +52,15 @@ 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 */);
call(
/* call argument long long long long long long long long long long long long long long */
);
// TODO[@fisker]: fix this
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 */);
newFoo = new Foo(
/* new argument long long long long long long long long long long long long long long */
);
================================================================================
`;
@@ -4,13 +4,13 @@ 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 */)
// TODO[@fisker]: fix this
fn = function(
/* function parameter */) {}
newFoo = new Foo
@@ -19,5 +19,6 @@ newFoo = new Foo
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 */)
// TODO[@fisker]: fix this
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 */)
@@ -1364,7 +1364,8 @@ interface Foo {
=====================================output=====================================
functionName<A /* A comment */>();
functionName<A>(); // comment
functionName<A> // comment
();
interface Foo {
<
A, // comment