From 29a11ae1ae417b8d0fa66d88d656001a6a90e297 Mon Sep 17 00:00:00 2001 From: fisker Cheung Date: Sat, 29 Nov 2025 00:00:52 +0800 Subject: [PATCH] Fix comment in empty type literal (#18364) --- changelog_unreleased/typescript/18364.md | 17 ++++ src/language-js/print/class-body.js | 18 ++-- .../__snapshots__/format.test.js.snap | 15 +++- .../classes/__snapshots__/format.test.js.snap | 20 ----- tests/format/js/classes/empty.js | 10 --- .../empty/__snapshots__/format.test.js.snap | 85 +++++++++++++++++++ tests/format/js/classes/empty/empty.js | 31 +++++++ tests/format/js/classes/empty/format.test.js | 1 + .../empty/__snapshots__/format.test.js.snap | 81 ++++++++++++++++++ .../class-and-interface/empty/empty.ts | 29 +++++++ .../class-and-interface/empty/format.test.js | 1 + 11 files changed, 267 insertions(+), 41 deletions(-) create mode 100644 changelog_unreleased/typescript/18364.md create mode 100644 tests/format/js/classes/empty/__snapshots__/format.test.js.snap create mode 100644 tests/format/js/classes/empty/empty.js create mode 100644 tests/format/js/classes/empty/format.test.js create mode 100644 tests/format/typescript/class-and-interface/empty/__snapshots__/format.test.js.snap create mode 100644 tests/format/typescript/class-and-interface/empty/empty.ts create mode 100644 tests/format/typescript/class-and-interface/empty/format.test.js diff --git a/changelog_unreleased/typescript/18364.md b/changelog_unreleased/typescript/18364.md new file mode 100644 index 000000000..9d1843b74 --- /dev/null +++ b/changelog_unreleased/typescript/18364.md @@ -0,0 +1,17 @@ +#### Fix comment in empty type literal (#18364 by @fisker) + + +```tsx +// Input +export type XXX = { + // tbd +}; + +// Prettier stable +export type XXX = { // tbd }; + +// Prettier main +export type XXX = { + // tbd +}; +``` diff --git a/src/language-js/print/class-body.js b/src/language-js/print/class-body.js index 299103f7e..34d5dd4c6 100644 --- a/src/language-js/print/class-body.js +++ b/src/language-js/print/class-body.js @@ -32,6 +32,7 @@ function printClassBody(path, options, print) { const isFlowTypeAnnotation = node.type === "ObjectTypeAnnotation"; const isObjectType = !isClassBody(path); const separator = isObjectType ? line : hardline; + const hasDanglingComments = hasComment(node, CommentCheckFlags.Dangling); const [openingBrace, closingBrace] = isFlowTypeAnnotation && node.exact ? ["{|", "|}"] : "{}"; @@ -68,7 +69,7 @@ function printClassBody(path, options, print) { } }); - if (hasComment(node, CommentCheckFlags.Dangling)) { + if (hasDanglingComments) { parts.push(printDanglingComments(path, options)); } @@ -92,13 +93,14 @@ function printClassBody(path, options, print) { if (isObjectType) { const shouldBreak = - options.objectWrap === "preserve" && - firstMember && - hasNewlineInRange( - options.originalText, - locStart(node), - locStart(firstMember), - ); + hasDanglingComments || + (options.objectWrap === "preserve" && + firstMember && + hasNewlineInRange( + options.originalText, + locStart(node), + locStart(firstMember), + )); let content; if (parts.length === 0) { diff --git a/tests/format/flow/object-inexact/__snapshots__/format.test.js.snap b/tests/format/flow/object-inexact/__snapshots__/format.test.js.snap index 2bb2e0ddf..4efdb4766 100644 --- a/tests/format/flow/object-inexact/__snapshots__/format.test.js.snap +++ b/tests/format/flow/object-inexact/__snapshots__/format.test.js.snap @@ -81,7 +81,10 @@ type Foo = { ... }; -type Foo = { /* comment */ ... }; +type Foo = { + /* comment */ + ... +}; type Foo = { /* comment */ @@ -216,7 +219,10 @@ type Foo = { ... }; -type Foo = { /* comment */ ... }; +type Foo = { + /* comment */ + ... +}; type Foo = { /* comment */ @@ -351,7 +357,10 @@ type Foo = { ... }; -type Foo = { /* comment */ ... }; +type Foo = { + /* comment */ + ... +}; type Foo = { /* comment */ diff --git a/tests/format/js/classes/__snapshots__/format.test.js.snap b/tests/format/js/classes/__snapshots__/format.test.js.snap index 9b3b0b22b..816bb379b 100644 --- a/tests/format/js/classes/__snapshots__/format.test.js.snap +++ b/tests/format/js/classes/__snapshots__/format.test.js.snap @@ -239,31 +239,11 @@ parsers: ["babel", "flow", "typescript"] printWidth: 80 | printWidth =====================================input====================================== -class A1 { - // comment -} - -class A2 { // comment -} - -class A3 { -} - class A4 { m() {} } =====================================output===================================== -class A1 { - // comment -} - -class A2 { - // comment -} - -class A3 {} - class A4 { m() {} } diff --git a/tests/format/js/classes/empty.js b/tests/format/js/classes/empty.js index c6ddbf97b..d23b87011 100644 --- a/tests/format/js/classes/empty.js +++ b/tests/format/js/classes/empty.js @@ -1,13 +1,3 @@ -class A1 { - // comment -} - -class A2 { // comment -} - -class A3 { -} - class A4 { m() {} } diff --git a/tests/format/js/classes/empty/__snapshots__/format.test.js.snap b/tests/format/js/classes/empty/__snapshots__/format.test.js.snap new file mode 100644 index 000000000..74e45ad04 --- /dev/null +++ b/tests/format/js/classes/empty/__snapshots__/format.test.js.snap @@ -0,0 +1,85 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`empty.js format 1`] = ` +====================================options===================================== +parsers: ["babel", "flow", "typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +class C1 {} +class C2 {//comment +} +class C3 { +//comment +} +class C4 {/*comment*/} +class C5 {/*comment*/ +} +class C6 { +/*comment*/} +class C7 { +/*comment*/ +} + +[ +class C1 {}, +class C2 {//comment +}, +class C3 { +//comment +}, +class C4 {/*comment*/}, +class C5 {/*comment*/ +}, +class C6 { +/*comment*/}, +class C7 { +/*comment*/ +}, +]; + +=====================================output===================================== +class C1 {} +class C2 { + //comment +} +class C3 { + //comment +} +class C4 { + /*comment*/ +} +class C5 { + /*comment*/ +} +class C6 { + /*comment*/ +} +class C7 { + /*comment*/ +} + +[ + class C1 {}, + class C2 { + //comment + }, + class C3 { + //comment + }, + class C4 { + /*comment*/ + }, + class C5 { + /*comment*/ + }, + class C6 { + /*comment*/ + }, + class C7 { + /*comment*/ + }, +]; + +================================================================================ +`; diff --git a/tests/format/js/classes/empty/empty.js b/tests/format/js/classes/empty/empty.js new file mode 100644 index 000000000..3202a7a30 --- /dev/null +++ b/tests/format/js/classes/empty/empty.js @@ -0,0 +1,31 @@ +class C1 {} +class C2 {//comment +} +class C3 { +//comment +} +class C4 {/*comment*/} +class C5 {/*comment*/ +} +class C6 { +/*comment*/} +class C7 { +/*comment*/ +} + +[ +class C1 {}, +class C2 {//comment +}, +class C3 { +//comment +}, +class C4 {/*comment*/}, +class C5 {/*comment*/ +}, +class C6 { +/*comment*/}, +class C7 { +/*comment*/ +}, +]; diff --git a/tests/format/js/classes/empty/format.test.js b/tests/format/js/classes/empty/format.test.js new file mode 100644 index 000000000..67c251cce --- /dev/null +++ b/tests/format/js/classes/empty/format.test.js @@ -0,0 +1 @@ +runFormatTest(import.meta, ["babel", "flow", "typescript"]); diff --git a/tests/format/typescript/class-and-interface/empty/__snapshots__/format.test.js.snap b/tests/format/typescript/class-and-interface/empty/__snapshots__/format.test.js.snap new file mode 100644 index 000000000..b9b015572 --- /dev/null +++ b/tests/format/typescript/class-and-interface/empty/__snapshots__/format.test.js.snap @@ -0,0 +1,81 @@ +// Jest Snapshot v1, https://jestjs.io/docs/snapshot-testing + +exports[`empty.ts format 1`] = ` +====================================options===================================== +parsers: ["typescript"] +printWidth: 80 + | printWidth +=====================================input====================================== +interface I1 {} +interface I2 {//comment +} +interface I3 { +//comment +} +interface I4 {/*comment*/} +interface I5 {/*comment*/ +} +interface I6 { +/*comment*/} +interface I7 { +/*comment*/ +} + +type T1 = {} +type T2 = {//comment +} +type T3 = { +//comment +} +type T4 = {/*comment*/} +type T5 = {/*comment*/ +} +type T6 = { +/*comment*/} +type T7 = { +/*comment*/ +} + +=====================================output===================================== +interface I1 {} +interface I2 { + //comment +} +interface I3 { + //comment +} +interface I4 { + /*comment*/ +} +interface I5 { + /*comment*/ +} +interface I6 { + /*comment*/ +} +interface I7 { + /*comment*/ +} + +type T1 = {}; +type T2 = { + //comment +}; +type T3 = { + //comment +}; +type T4 = { + /*comment*/ +}; +type T5 = { + /*comment*/ +}; +type T6 = { + /*comment*/ +}; +type T7 = { + /*comment*/ +}; + +================================================================================ +`; diff --git a/tests/format/typescript/class-and-interface/empty/empty.ts b/tests/format/typescript/class-and-interface/empty/empty.ts new file mode 100644 index 000000000..aa3a64e56 --- /dev/null +++ b/tests/format/typescript/class-and-interface/empty/empty.ts @@ -0,0 +1,29 @@ +interface I1 {} +interface I2 {//comment +} +interface I3 { +//comment +} +interface I4 {/*comment*/} +interface I5 {/*comment*/ +} +interface I6 { +/*comment*/} +interface I7 { +/*comment*/ +} + +type T1 = {} +type T2 = {//comment +} +type T3 = { +//comment +} +type T4 = {/*comment*/} +type T5 = {/*comment*/ +} +type T6 = { +/*comment*/} +type T7 = { +/*comment*/ +} diff --git a/tests/format/typescript/class-and-interface/empty/format.test.js b/tests/format/typescript/class-and-interface/empty/format.test.js new file mode 100644 index 000000000..116dcbd78 --- /dev/null +++ b/tests/format/typescript/class-and-interface/empty/format.test.js @@ -0,0 +1 @@ +runFormatTest(import.meta, ["typescript"]);