Skip to content

Commit

Permalink
lists: Detect block comment by starting from the end.
Browse files Browse the repository at this point in the history
The issue with the current code is that comments are collapsed, so comments like
the one from the test end up in a string like:

```
"// this is a single line comment\n/* block = */"
```

I chose to fix it by detecting whether we're in a block comment starting from
the end instead, and tested a single-line comment ended in `*/` just for sanity,
ensuring line breaks are not removed in that case, which would break the
formatting.

The right fix eventually is probably to lex the comments properly, but this does
the work for now, I guess :)

Fixes #3025
  • Loading branch information
emilio committed Sep 22, 2018
1 parent 4568c1a commit 66c15e4
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 7 deletions.
14 changes: 7 additions & 7 deletions src/lists.rs
Expand Up @@ -566,14 +566,9 @@ where

pub fn extract_pre_comment(pre_snippet: &str) -> (Option<String>, ListItemCommentStyle) {
let trimmed_pre_snippet = pre_snippet.trim();
let has_block_comment = trimmed_pre_snippet.ends_with("*/");
let has_single_line_comment = trimmed_pre_snippet.starts_with("//");
let has_block_comment = trimmed_pre_snippet.starts_with("/*");
if has_single_line_comment {
(
Some(trimmed_pre_snippet.to_owned()),
ListItemCommentStyle::DifferentLine,
)
} else if has_block_comment {
if has_block_comment {
let comment_end = pre_snippet.chars().rev().position(|c| c == '/').unwrap();
if pre_snippet
.chars()
Expand All @@ -591,6 +586,11 @@ pub fn extract_pre_comment(pre_snippet: &str) -> (Option<String>, ListItemCommen
ListItemCommentStyle::SameLine,
)
}
} else if has_single_line_comment {
(
Some(trimmed_pre_snippet.to_owned()),
ListItemCommentStyle::DifferentLine,
)
} else {
(None, ListItemCommentStyle::None)
}
Expand Down
15 changes: 15 additions & 0 deletions tests/source/expr-block.rs
Expand Up @@ -280,6 +280,21 @@ fn issue_1862() {
)
}

fn issue_3025() {
foo(
// This describes the argument below.
/* bar = */ None ,
// This describes the argument below.
something_something,
// This describes the argument below. */
None ,
// This describes the argument below.
/* This comment waaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaay too long to be kept on the same line */ None ,
// This describes the argument below.
/* com */ this_last_arg_is_tooooooooooooooooooooooooooooooooo_long_to_be_kept_with_the_pre_comment ,
)
}

fn issue_1878() {
let channel: &str = seq.next_element()?.ok_or_else(|| de::Error::invalid_length(2, &self))?;
}
17 changes: 17 additions & 0 deletions tests/target/expr-block.rs
Expand Up @@ -281,6 +281,23 @@ fn issue_1862() {
)
}

fn issue_3025() {
foo(
// This describes the argument below.
/* bar = */ None,
// This describes the argument below.
something_something,
// This describes the argument below. */
None,
// This describes the argument below.
/* This comment waaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaay too long to be kept on the same line */
None,
// This describes the argument below.
/* com */
this_last_arg_is_tooooooooooooooooooooooooooooooooo_long_to_be_kept_with_the_pre_comment,
)
}

fn issue_1878() {
let channel: &str = seq
.next_element()?
Expand Down

0 comments on commit 66c15e4

Please sign in to comment.