diff --git a/changelog_unreleased/javascript/12177.md b/changelog_unreleased/javascript/12177.md new file mode 100644 index 000000000..79295954a --- /dev/null +++ b/changelog_unreleased/javascript/12177.md @@ -0,0 +1,40 @@ +#### Keep comments after `default` cases in the same line (#12177 by @duailibe) + +Keep comments right after `default` cases (in switch statements) in the same line, when possible. + + +```jsx +// Input +function read_statement() { + switch (peek_keyword()) { + case Keyword.impl: // impl Growling for Wolf {} + return ImplDeclaration.read(); + + default: // expression; + return ExpressionStatement.read(); + } +} + +// Prettier stable +function read_statement() { + switch (peek_keyword()) { + case Keyword.impl: // impl Growling for Wolf {} + return ImplDeclaration.read(); + + default: + // expression; + return ExpressionStatement.read(); + } +} + +// Prettier main +function read_statement() { + switch (peek_keyword()) { + case Keyword.impl: // impl Growling for Wolf {} + return ImplDeclaration.read(); + + default: // expression; + return ExpressionStatement.read(); + } +} +``` diff --git a/src/language-js/comments.js b/src/language-js/comments.js index 8cc724148..8bc225aad 100644 --- a/src/language-js/comments.js +++ b/src/language-js/comments.js @@ -24,6 +24,7 @@ const { isCallExpression, isMemberExpression, isObjectProperty, + isLineComment, getComments, CommentCheckFlags, markerForIfWithoutBlockAndSameLineComment, @@ -93,6 +94,7 @@ function handleEndOfLineComment(context) { handleTypeAliasComments, handleVariableDeclaratorComments, handleBreakAndContinueStatementComments, + handleSwitchDefaultCaseComments, ].some((fn) => fn(context)); } @@ -897,6 +899,28 @@ function handleTSMappedTypeComments({ return false; } +function handleSwitchDefaultCaseComments({ + comment, + enclosingNode, + followingNode, +}) { + if ( + !enclosingNode || + enclosingNode.type !== "SwitchCase" || + enclosingNode.test + ) { + return false; + } + + if (followingNode.type === "BlockStatement" && isLineComment(comment)) { + addBlockStatementFirstComment(followingNode, comment); + } else { + addDanglingComment(enclosingNode, comment); + } + + return true; +} + /** * @param {Node} node * @returns {boolean} diff --git a/src/language-js/printer-estree.js b/src/language-js/printer-estree.js index ddb529f6b..4decdd780 100644 --- a/src/language-js/printer-estree.js +++ b/src/language-js/printer-estree.js @@ -696,6 +696,10 @@ function printPathNoParens(path, options, print, args) { parts.push("default:"); } + if (hasComment(node, CommentCheckFlags.Dangling)) { + parts.push(" ", printDanglingComments(path, options, true)); + } + const consequent = node.consequent.filter( (node) => node.type !== "EmptyStatement" ); diff --git a/tests/format/js/switch/__snapshots__/jsfmt.spec.js.snap b/tests/format/js/switch/__snapshots__/jsfmt.spec.js.snap index de7eb2171..9a4cf4dca 100644 --- a/tests/format/js/switch/__snapshots__/jsfmt.spec.js.snap +++ b/tests/format/js/switch/__snapshots__/jsfmt.spec.js.snap @@ -30,6 +30,41 @@ switch(x) { } } +switch(x) { + default: // comment + break; +} + +switch(x) { + default: // comment + {break;} +} + +switch(x) { + default: {// comment + break;} +} + +switch(x) { + default: /* comment */ + break; +} + +switch(x) { + default: /* comment */ + {break;} +} + +switch(x) { + default: {/* comment */ + break;} +} + +switch(x) { + default: /* comment */ { + break;} +} + =====================================output===================================== switch (true) { case true: @@ -55,6 +90,49 @@ switch (x) { } } +switch (x) { + default: // comment + break; +} + +switch (x) { + default: { + // comment + break; + } +} + +switch (x) { + default: { + // comment + break; + } +} + +switch (x) { + default: /* comment */ + break; +} + +switch (x) { + default: /* comment */ { + break; + } +} + +switch (x) { + default: { + /* comment */ + break; + } +} + +switch (x) { + default: /* comment */ { + break; + } +} + ================================================================================ `; diff --git a/tests/format/js/switch/comments.js b/tests/format/js/switch/comments.js index d91b1e9ed..42dceadbb 100644 --- a/tests/format/js/switch/comments.js +++ b/tests/format/js/switch/comments.js @@ -21,3 +21,38 @@ switch(x) { case y: { } } + +switch(x) { + default: // comment + break; +} + +switch(x) { + default: // comment + {break;} +} + +switch(x) { + default: {// comment + break;} +} + +switch(x) { + default: /* comment */ + break; +} + +switch(x) { + default: /* comment */ + {break;} +} + +switch(x) { + default: {/* comment */ + break;} +} + +switch(x) { + default: /* comment */ { + break;} +}