diff --git a/changelog_unreleased/javascript/20211.md b/changelog_unreleased/javascript/20211.md new file mode 100644 index 000000000..0e7e10f53 --- /dev/null +++ b/changelog_unreleased/javascript/20211.md @@ -0,0 +1,16 @@ +#### Fix duplicated comments on JSX super classes (#20211 by @fisker) + + +```jsx +// Input +class A extends (/* c */
) {} +class B extends (
/* c */) {} + +// Prettier stable +class A extends /* c */ (/* c */
) {} +class B extends (
/* c */) /* c */ {} + +// Prettier main +class A extends (/* c */
) {} +class B extends (
/* c */) {} +``` diff --git a/src/language-js/print/class.js b/src/language-js/print/class.js index 13dc2df92..57221ca1d 100644 --- a/src/language-js/print/class.js +++ b/src/language-js/print/class.js @@ -19,7 +19,8 @@ import needsParentheses from "../parentheses/needs-parentheses.js"; import { isNonEmptyClassBody } from "../utilities/class-members.js"; import { CommentCheckFlags, hasComment } from "../utilities/comments.js"; import { createTypeCheckFunction } from "../utilities/create-type-check-function.js"; -import { isMemberExpression } from "../utilities/node-types.js"; +import { hasNodeIgnoreComment } from "../utilities/has-node-ignore-comment.js"; +import { isJsxElement, isMemberExpression } from "../utilities/node-types.js"; import { stripChainElementWrappers } from "../utilities/strip-chain-element-wrappers.js"; import { printAssignment } from "./assignment.js"; import { printClassMemberDecorators, printDecorators } from "./decorators.js"; @@ -111,18 +112,20 @@ function printClassWithoutDecorators(path, options, print) { } if (node.superClass) { - const printed = [ + let printed = [ printSuperClass(path, options, print), print("superTypeArguments"), ]; - const printedWithComments = path.call( - () => ["extends ", printComments(path, printed, options)], - "superClass", - ); + printed = [ + "extends ", + isJsxElement(node.superClass) && !hasNodeIgnoreComment(node.superClass) + ? printed + : path.call(() => printComments(path, printed, options), "superClass"), + ]; if (groupMode) { - extendsParts.push(line, group(printedWithComments)); + extendsParts.push(line, group(printed)); } else { - extendsParts.push(" ", printedWithComments); + extendsParts.push(" ", printed); } } else { extendsParts.push(printHeritageClauses(path, options, print, "extends")); diff --git a/tests/format/js/class-comment/__snapshots__/format.test.js.snap b/tests/format/js/class-comment/__snapshots__/format.test.js.snap index 2e302bf20..20d8ab4a5 100644 --- a/tests/format/js/class-comment/__snapshots__/format.test.js.snap +++ b/tests/format/js/class-comment/__snapshots__/format.test.js.snap @@ -147,3 +147,22 @@ class A10 extends /* a */ /* prettier-ignore */ B {} ================================================================================ `; + +exports[`superclass-2.js format 1`] = ` +====================================options===================================== +parsers: ["babel", "flow", "typescript"] + printWidth: 80 (default) | +=====================================input====================================== +class A11 extends (/* c */
) {} +class A12 extends (/* c *//* prettier-ignore */
) {} +class A13 extends (/* c */ <>) {} +class A14 extends (
/* c */) {} + +=====================================output===================================== +class A11 extends (/* c */
) {} +class A12 extends /* c */ /* prettier-ignore */ (
) {} +class A13 extends (/* c */ <>) {} +class A14 extends (
/* c */) {} + +================================================================================ +`; diff --git a/tests/format/js/class-comment/superclass-2.js b/tests/format/js/class-comment/superclass-2.js new file mode 100644 index 000000000..81caed4b3 --- /dev/null +++ b/tests/format/js/class-comment/superclass-2.js @@ -0,0 +1,4 @@ +class A11 extends (/* c */
) {} +class A12 extends (/* c *//* prettier-ignore */
) {} +class A13 extends (/* c */ <>) {} +class A14 extends (
/* c */) {}