Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix comments print in IfStatement #15076

Merged
merged 5 commits into from
Jul 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
18 changes: 18 additions & 0 deletions changelog_unreleased/javascript/15076.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#### Fix comments print in `IfStatement` (#15076 by @fisker)

<!-- prettier-ignore -->
```js
function a(b) {
if (b) return 1; // comment
else return 2;
}

/* Prettier stable */
Error: Comment "comment" was not printed. Please report this error!

/* Prettier main */
function a(b) {
if (b) return 1; // comment
else return 2;
}
```
4 changes: 3 additions & 1 deletion src/language-js/comments/handle-comments.js
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,9 @@ function handleIfStatementComments({
addDanglingComment(
precedingNode,
comment,
markerForIfWithoutBlockAndSameLineComment,
precedingNode.type === "ExpressionStatement"
? markerForIfWithoutBlockAndSameLineComment
: undefined,
);
} else {
addDanglingComment(enclosingNode, comment);
Expand Down
47 changes: 42 additions & 5 deletions tests/format/js/if/__snapshots__/jsfmt.spec.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -93,26 +93,44 @@ parsers: ["babel", "flow", "typescript"]
printWidth: 80
| printWidth
=====================================input======================================
if (a === 0) doSomething(); // comment A1
if (a === 0) doSomething(); // comment A1
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Where does this extra spacing come from? Not sure if i is expected in output, but maybe I am missing something.

Copy link
Member Author

@fisker fisker Jul 11, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

else if (a === 1) doSomethingElse(); // comment B1
else if (a === 2) doSomethingElse(); // comment C1

if (a === 0) doSomething(); /* comment A2 */
if (a === 0) doSomething(); /* comment A2 */
else if (a === 1) doSomethingElse(); /* comment B2 */
else if (a === 2) doSomethingElse(); /* comment C2 */

if (a === 0) expr; // comment A3
if (a === 0) expr; // comment A3
else if (a === 1) expr; // comment B3
else if (a === 2) expr; // comment C3

if (a === 0) expr; /* comment A4 */
if (a === 0) expr; /* comment A4 */
else if (a === 1) expr; /* comment B4 */
else if (a === 2) expr; /* comment C4 */

if (a === 0) looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong; // comment A5
if (a === 0) looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong; // comment A5
else if (a === 1) looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong; // comment B5
else if (a === 2) looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong; // comment C5

function a() {
if (a) return; /* comment 6a */
else return 2;

if (a) return 1; /* comment 6b */
else return 2;

if (a) throw e; /* comment 6d */
else return 2;

// TODO[@fisker]: fix this
// if (a) var a = 1; /* comment 6e */
// else return 2;
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@sosukesuzuki

markerForIfWithoutBlockAndSameLineComment was introduced in #12017, do you remember why we attach the comment as dangling instead of trailing comment?

Many nodes can be a child of IfStatement, though this code is not reasonable, but still valid, the comment is not printed.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I forget... but I tried to run tests in local with:

-        addDanglingComment(
-          precedingNode,
-          comment,
-          markerForIfWithoutBlockAndSameLineComment,
-        );
+        addTrailingComment(precedingNode, comment);

then I got the spanpshot diffs like this:

- if (a === 0) expr; // comment A3
- else if (a === 1) expr; // comment B3
+ if (a === 0)
+   expr; // comment A3
+ else if (a === 1)
+   expr; // comment B3

At the time, I may have wanted to avoid this line break.


if (a) if (b); /* comment 6f */
else return 2;
}

=====================================output=====================================
if (a === 0) doSomething(); // comment A1
else if (a === 1) doSomethingElse(); // comment B1
Expand All @@ -137,6 +155,25 @@ else if (a === 1)
else if (a === 2)
looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong; // comment C5

function a() {
if (a) return /* comment 6a */;
else return 2;

if (a) return 1 /* comment 6b */;
else return 2;

if (a) throw e /* comment 6d */;
else return 2;

// TODO[@fisker]: fix this
// if (a) var a = 1; /* comment 6e */
// else return 2;

if (a)
if (b /* comment 6f */);
else return 2;
}

================================================================================
`;

Expand Down
28 changes: 23 additions & 5 deletions tests/format/js/if/expr_and_same_line_comments.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,37 @@
if (a === 0) doSomething(); // comment A1
if (a === 0) doSomething(); // comment A1
else if (a === 1) doSomethingElse(); // comment B1
else if (a === 2) doSomethingElse(); // comment C1

if (a === 0) doSomething(); /* comment A2 */
if (a === 0) doSomething(); /* comment A2 */
else if (a === 1) doSomethingElse(); /* comment B2 */
else if (a === 2) doSomethingElse(); /* comment C2 */

if (a === 0) expr; // comment A3
if (a === 0) expr; // comment A3
else if (a === 1) expr; // comment B3
else if (a === 2) expr; // comment C3

if (a === 0) expr; /* comment A4 */
if (a === 0) expr; /* comment A4 */
else if (a === 1) expr; /* comment B4 */
else if (a === 2) expr; /* comment C4 */

if (a === 0) looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong; // comment A5
if (a === 0) looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong; // comment A5
else if (a === 1) looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong; // comment B5
else if (a === 2) looooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong; // comment C5

function a() {
if (a) return; /* comment 6a */
else return 2;

if (a) return 1; /* comment 6b */
else return 2;

if (a) throw e; /* comment 6d */
else return 2;

// TODO[@fisker]: fix this
// if (a) var a = 1; /* comment 6e */
// else return 2;

if (a) if (b); /* comment 6f */
else return 2;
}