lists: Detect block comment by starting from the end.

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
This commit is contained in:
Emilio Cobos Álvarez 2018-09-22 12:03:33 +02:00
parent 4568c1a70f
commit 66c15e46ba
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
3 changed files with 39 additions and 7 deletions

View file

@ -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()
@ -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)
}

View file

@ -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))?;
}

View file

@ -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()?