Fix comment around as/satisfies expression (#18162)

This commit is contained in:
fisker Cheung authored and GitHub committed 2025-10-31 02:43:23 +08:00
1 parent 062ab10601
commit 7d3ff5d2fc
7 files changed
+249 -56

No files matched your search

+28
View File
@@ -0,0 +1,28 @@
#### Fix comment around `as`/`satisfies` expression (#18162 by @fisker)
<!-- prettier-ignore -->
```tsx
// Input
1 as /*
comment
*/
const;
// Prettier stable (First format)
1 /*
comment
*/ as const;
// Prettier stable (Second format)
SyntaxError: Unexpected keyword or identifier. (3:4)
1 | 1 /*
2 | comment
> 3 | */ as const;
| ^
4 |
// Prettier main
1 as const /*
comment
*/;
```
@@ -13,6 +13,7 @@ import {
createTypeCheckFunction, createTypeCheckFunction,
getCallArguments, getCallArguments,
getFunctionParameters, getFunctionParameters,
isBinaryCastExpression,
isCallExpression, isCallExpression,
isCallLikeExpression, isCallLikeExpression,
isConditionalType, isConditionalType,
@@ -71,6 +72,7 @@ function handleOwnLineComment(context) {
handleNestedConditionalExpressionComments, handleNestedConditionalExpressionComments,
handleCommentsInDestructuringPattern, handleCommentsInDestructuringPattern,
handleTSMappedTypeComments, handleTSMappedTypeComments,
handleBinaryCastExpressionComment,
].some((fn) => fn(context)); ].some((fn) => fn(context));
} }
@@ -99,6 +101,7 @@ function handleEndOfLineComment(context) {
handleLastBinaryOperatorOperand, handleLastBinaryOperatorOperand,
handleTSMappedTypeComments, handleTSMappedTypeComments,
handlePropertySignatureComments, handlePropertySignatureComments,
handleBinaryCastExpressionComment,
].some((fn) => fn(context)); ].some((fn) => fn(context));
} }
@@ -118,6 +121,7 @@ function handleRemainingComment(context) {
handleFunctionNameComments, handleFunctionNameComments,
handleBreakAndContinueStatementComments, handleBreakAndContinueStatementComments,
handleTSFunctionTrailingComments, handleTSFunctionTrailingComments,
handleBinaryCastExpressionComment,
].some((fn) => fn(context)); ].some((fn) => fn(context));
} }
@@ -1121,6 +1125,28 @@ function handlePropertySignatureComments({
} }
} }
function handleBinaryCastExpressionComment({
enclosingNode,
precedingNode,
followingNode,
comment,
text,
}) {
// Avoid break before `as` and `satisfies`
if (
isBinaryCastExpression(enclosingNode) &&
precedingNode === enclosingNode.expression &&
!isSingleLineComment(comment, text)
) {
if (followingNode) {
addLeadingComment(followingNode, comment);
} else {
addTrailingComment(enclosingNode, comment);
}
return true;
}
}
/** /**
* @param {Node} node * @param {Node} node
* @returns {boolean} * @returns {boolean}
@@ -21,25 +21,6 @@ const;
1 as /* comment */ not_const; 1 as /* comment */ not_const;
// https://github.com/prettier/prettier/issues/18160
// 1 as /*
// 1
// */ const;
1 as
/*
2
*/ const;
// https://github.com/prettier/prettier/issues/18160
// 1 as /*
// 3
// */
// const;
1 as
/*
4
*/
const;
=====================================output===================================== =====================================output=====================================
1 /* comment */ as const; 1 /* comment */ as const;
1 /* comment */ as const; 1 /* comment */ as const;
@@ -53,23 +34,5 @@ const;
1 as /* comment */ not_const; 1 as /* comment */ not_const;
// https://github.com/prettier/prettier/issues/18160
// 1 as /*
// 1
// */ const;
1 as const;
/*
2
*/
// https://github.com/prettier/prettier/issues/18160
// 1 as /*
// 3
// */
// const;
1 as const;
/*
4
*/
================================================================================ ================================================================================
`; `;
@@ -12,22 +12,3 @@ const;
1 as const; // comment 1 as const; // comment
1 as /* comment */ not_const; 1 as /* comment */ not_const;
// https://github.com/prettier/prettier/issues/18160
// 1 as /*
// 1
// */ const;
1 as
/*
2
*/ const;
// https://github.com/prettier/prettier/issues/18160
// 1 as /*
// 3
// */
// const;
1 as
/*
4
*/
const;
@@ -0,0 +1,58 @@
1 as /*
comment
*/const;
1 as /*
comment
*/Foo;
1 satisfies /*
comment
*/Foo;
1 as
/*
comment
*/const;
1 as
/*
comment
*/Foo;
1 satisfies
/*
comment
*/Foo;
1 as /*
comment
*/
const;
1 as /*
comment
*/
Foo;
1 satisfies /*
comment
*/
Foo;
1 as
/*
comment
*/
const;
1 as
/*
comment
*/
Foo;
1 satisfies
/*
comment
*/
Foo;
1 as // comment
const;
1 as // comment
Foo;
1 satisfies // comment
Foo;
@@ -0,0 +1,134 @@
// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing
exports[`18160.ts [hermes] format 1`] = `
"';' expected (7:2)
5 | comment
6 | */Foo;
> 7 | 1 satisfies /*
| ^
8 | comment
9 | */Foo;
10 |
Cause: ';' expected (7:2)
1 satisfies /*
^"
`;
exports[`18160.ts format 1`] = `
====================================options=====================================
parsers: ["typescript", "flow"]
printWidth: 80
| printWidth
=====================================input======================================
1 as /*
comment
*/const;
1 as /*
comment
*/Foo;
1 satisfies /*
comment
*/Foo;
1 as
/*
comment
*/const;
1 as
/*
comment
*/Foo;
1 satisfies
/*
comment
*/Foo;
1 as /*
comment
*/
const;
1 as /*
comment
*/
Foo;
1 satisfies /*
comment
*/
Foo;
1 as
/*
comment
*/
const;
1 as
/*
comment
*/
Foo;
1 satisfies
/*
comment
*/
Foo;
1 as // comment
const;
1 as // comment
Foo;
1 satisfies // comment
Foo;
=====================================output=====================================
1 as const /*
comment
*/;
1 as /*
comment
*/ Foo;
1 satisfies /*
comment
*/ Foo;
1 as const;
/*
comment
*/
1 as /*
comment
*/ Foo;
1 satisfies /*
comment
*/ Foo;
1 as const /*
comment
*/;
1 as /*
comment
*/
Foo;
1 satisfies /*
comment
*/
Foo;
1 as const;
/*
comment
*/
1 as /*
comment
*/
Foo;
1 satisfies /*
comment
*/
Foo;
1 as const; // comment
1 as Foo; // comment
1 satisfies Foo; // comment
================================================================================
`;
@@ -0,0 +1,3 @@
runFormatTest(import.meta, ["typescript", "flow"], {
errors: { hermes: ["18160.ts"] },
});