diff --git a/changelog_unreleased/typescript/19939-2.md b/changelog_unreleased/typescript/19939-2.md new file mode 100644 index 000000000..a44c3f91f --- /dev/null +++ b/changelog_unreleased/typescript/19939-2.md @@ -0,0 +1,33 @@ +#### Fix misaligned jsdoc comment before a `satisfies` or `as` type (#19939 by @Kjubikstronk) + + +```tsx +// Input +const foo = { + bar: 1, +} as + /** + * comment line 1 + * comment line 2 + */ + Foo; + +// Prettier stable +const foo = { + bar: 1, +} as /** + * comment line 1 + * comment line 2 + */ +Foo; + +// Prettier main +const foo = { + bar: 1, +} as + /** + * comment line 1 + * comment line 2 + */ + Foo; +``` diff --git a/changelog_unreleased/typescript/19939.md b/changelog_unreleased/typescript/19939.md new file mode 100644 index 000000000..159aae676 --- /dev/null +++ b/changelog_unreleased/typescript/19939.md @@ -0,0 +1,29 @@ +#### Keep an own-line comment before a `satisfies` or `as` type on its own line (#19939 by @Kjubikstronk) + + +```tsx +// Input +const foo = { + bar: 1, +} as + // Comment + Record; + +// Prettier stable (first format) +const foo = { + bar: 1, +} as // Comment +Record; + +// Prettier stable (second format) +const foo = { + bar: 1, +} as Record; // Comment + +// Prettier main +const foo = { + bar: 1, +} as + // Comment + Record; +``` diff --git a/src/language-js/print/binary-cast-expression.js b/src/language-js/print/binary-cast-expression.js index ff78ff9a6..859926a11 100644 --- a/src/language-js/print/binary-cast-expression.js +++ b/src/language-js/print/binary-cast-expression.js @@ -1,8 +1,10 @@ -import { group, indent, softline } from "../../document/index.js"; +import { group, hardline, indent, softline } from "../../document/index.js"; +import { hasLeadingOwnLineComment } from "../utilities/has-leading-own-line-comment.js"; import { isCallOrNewExpression, isMemberExpression, isSatisfiesExpression, + isUnionType, } from "../utilities/node-types.js"; function printBinaryCastExpression(path, options, print) { @@ -16,10 +18,18 @@ function printBinaryCastExpression(path, options, print) { print("expression"), " ", isSatisfiesExpression(node) ? "satisfies" : "as", - " ", - typeAnnotationDoc, ]; + if ( + // Union type already indented + !isUnionType(node.typeAnnotation) && + hasLeadingOwnLineComment(options.originalText, node.typeAnnotation) + ) { + parts.push(indent([hardline, typeAnnotationDoc])); + } else { + parts.push(" ", typeAnnotationDoc); + } + if ( (key === "callee" && isCallOrNewExpression(parent)) || (key === "object" && isMemberExpression(parent)) diff --git a/tests/config/format-test/failed-format-tests.js b/tests/config/format-test/failed-format-tests.js index 6089b33aa..7105e0db7 100644 --- a/tests/config/format-test/failed-format-tests.js +++ b/tests/config/format-test/failed-format-tests.js @@ -20,7 +20,6 @@ const unstableTests = new Map( "typescript/prettier-ignore/mapped-types.ts", "typescript/prettier-ignore/issue-14238.ts", "js/for-of/comments.js", - "typescript/satisfies-operators/comments-unstable.ts", "jsx/comments/in-attributes.js", "typescript/import-type/long-module-name/long-module-name4.ts", [ diff --git a/tests/format/typescript/as/comments/18160.ts b/tests/format/typescript/as/comments/18160.ts index cae8affff..9ef910e43 100644 --- a/tests/format/typescript/as/comments/18160.ts +++ b/tests/format/typescript/as/comments/18160.ts @@ -56,3 +56,19 @@ const; Foo; 1 satisfies // comment Foo; + +1 as +/** + * jsdoc + */ +const; +1 as +/** + * jsdoc + */ +Foo; +1 satisfies +/** + * jsdoc + */ +Foo; diff --git a/tests/format/typescript/as/comments/__snapshots__/format.test.js.snap b/tests/format/typescript/as/comments/__snapshots__/format.test.js.snap index f3eb56530..dd57b843c 100644 --- a/tests/format/typescript/as/comments/__snapshots__/format.test.js.snap +++ b/tests/format/typescript/as/comments/__snapshots__/format.test.js.snap @@ -91,6 +91,22 @@ Foo; 1 satisfies // comment Foo; +1 as +/** + * jsdoc + */ +const; +1 as +/** + * jsdoc + */ +Foo; +1 satisfies +/** + * jsdoc + */ +Foo; + =====================================output===================================== 1 as const /* comment @@ -116,32 +132,51 @@ comment 1 as const /* comment */; -1 as /* +1 as + /* comment */ -Foo; -1 satisfies /* + Foo; +1 satisfies + /* comment */ -Foo; + Foo; 1 as const; /* comment */ -1 as /* +1 as + /* comment */ -Foo; -1 satisfies /* + Foo; +1 satisfies + /* comment */ -Foo; + Foo; 1 as const; // comment 1 as Foo; // comment 1 satisfies Foo; // comment +1 as const; +/** + * jsdoc + */ +1 as + /** + * jsdoc + */ + Foo; +1 satisfies + /** + * jsdoc + */ + Foo; + ================================================================================ `; diff --git a/tests/format/typescript/satisfies-operators/__snapshots__/format.test.js.snap b/tests/format/typescript/satisfies-operators/__snapshots__/format.test.js.snap index b6e907382..822d095bc 100644 --- a/tests/format/typescript/satisfies-operators/__snapshots__/format.test.js.snap +++ b/tests/format/typescript/satisfies-operators/__snapshots__/format.test.js.snap @@ -381,11 +381,25 @@ parsers: ["typescript"] semi: false printWidth: 80 (default) | =====================================input====================================== +const t1 = { + prop1: 1, + prop2: 2, + prop3: 3 +} satisfies +// Comment +Record; const t2 = {} /* comment */ satisfies {}; const t3 = {} satisfies /* comment */ {}; const t4 = {} /* comment1 */ satisfies /* comment2 */ {}; =====================================output===================================== +const t1 = { + prop1: 1, + prop2: 2, + prop3: 3, +} satisfies + // Comment + Record const t2 = {} /* comment */ satisfies {} const t3 = {} satisfies /* comment */ {} const t4 = {} /* comment1 */ satisfies /* comment2 */ {} @@ -398,24 +412,6 @@ exports[`comments.ts format 1`] = ` parsers: ["typescript"] printWidth: 80 (default) | =====================================input====================================== -const t2 = {} /* comment */ satisfies {}; -const t3 = {} satisfies /* comment */ {}; -const t4 = {} /* comment1 */ satisfies /* comment2 */ {}; - -=====================================output===================================== -const t2 = {} /* comment */ satisfies {}; -const t3 = {} satisfies /* comment */ {}; -const t4 = {} /* comment1 */ satisfies /* comment2 */ {}; - -================================================================================ -`; - -exports[`comments-unstable.ts - {"semi":false} format 1`] = ` -====================================options===================================== -parsers: ["typescript"] -semi: false - printWidth: 80 (default) | -=====================================input====================================== const t1 = { prop1: 1, prop2: 2, @@ -423,38 +419,21 @@ const t1 = { } satisfies // Comment Record; +const t2 = {} /* comment */ satisfies {}; +const t3 = {} satisfies /* comment */ {}; +const t4 = {} /* comment1 */ satisfies /* comment2 */ {}; =====================================output===================================== const t1 = { prop1: 1, prop2: 2, prop3: 3, -} satisfies // Comment -Record - -================================================================================ -`; - -exports[`comments-unstable.ts format 1`] = ` -====================================options===================================== -parsers: ["typescript"] - printWidth: 80 (default) | -=====================================input====================================== -const t1 = { - prop1: 1, - prop2: 2, - prop3: 3 } satisfies -// Comment -Record; - -=====================================output===================================== -const t1 = { - prop1: 1, - prop2: 2, - prop3: 3, -} satisfies // Comment -Record; + // Comment + Record; +const t2 = {} /* comment */ satisfies {}; +const t3 = {} satisfies /* comment */ {}; +const t4 = {} /* comment1 */ satisfies /* comment2 */ {}; ================================================================================ `; diff --git a/tests/format/typescript/satisfies-operators/comments-unstable.ts b/tests/format/typescript/satisfies-operators/comments-unstable.ts deleted file mode 100644 index 0f658aa54..000000000 --- a/tests/format/typescript/satisfies-operators/comments-unstable.ts +++ /dev/null @@ -1,7 +0,0 @@ -const t1 = { - prop1: 1, - prop2: 2, - prop3: 3 -} satisfies -// Comment -Record; diff --git a/tests/format/typescript/satisfies-operators/comments.ts b/tests/format/typescript/satisfies-operators/comments.ts index 9ab0ae58c..14b280d2d 100644 --- a/tests/format/typescript/satisfies-operators/comments.ts +++ b/tests/format/typescript/satisfies-operators/comments.ts @@ -1,3 +1,10 @@ +const t1 = { + prop1: 1, + prop2: 2, + prop3: 3 +} satisfies +// Comment +Record; const t2 = {} /* comment */ satisfies {}; const t3 = {} satisfies /* comment */ {}; const t4 = {} /* comment1 */ satisfies /* comment2 */ {};