fix the identification of a block comment.

Block comments like below were not properly supported:

    /*
       something here but it doesn't start with a star
     */

because of the line that didn't start with a star.
This commit is contained in:
Stéphane Campinas 2018-08-16 19:55:15 +02:00
parent 7c1ad96e9f
commit f23e6aaaf9
No known key found for this signature in database
GPG key ID: 6D5620D908210133
5 changed files with 65 additions and 27 deletions

View file

@ -96,21 +96,6 @@ impl<'a> CommentStyle<'a> {
pub fn to_str_tuplet(&self) -> (&'a str, &'a str, &'a str) { pub fn to_str_tuplet(&self) -> (&'a str, &'a str, &'a str) {
(self.opener(), self.closer(), self.line_start()) (self.opener(), self.closer(), self.line_start())
} }
pub fn line_with_same_comment_style(&self, line: &str, normalize_comments: bool) -> bool {
match *self {
CommentStyle::DoubleSlash | CommentStyle::TripleSlash | CommentStyle::Doc => {
line.trim_left().starts_with(self.line_start().trim_left())
|| comment_style(line, normalize_comments) == *self
}
CommentStyle::DoubleBullet | CommentStyle::SingleBullet | CommentStyle::Exclamation => {
line.trim_left().starts_with(self.closer().trim_left())
|| line.trim_left().starts_with(self.line_start().trim_left())
|| comment_style(line, normalize_comments) == *self
}
CommentStyle::Custom(opener) => line.trim_left().starts_with(opener.trim_right()),
}
}
} }
fn comment_style(orig: &str, normalize_comments: bool) -> CommentStyle { fn comment_style(orig: &str, normalize_comments: bool) -> CommentStyle {
@ -273,19 +258,56 @@ fn identify_comment(
is_doc_comment: bool, is_doc_comment: bool,
) -> Option<String> { ) -> Option<String> {
let style = comment_style(orig, false); let style = comment_style(orig, false);
let first_group = orig let mut first_group_ending = 0;
.lines()
.take_while(|l| style.line_with_same_comment_style(l, false))
.collect::<Vec<_>>()
.join("\n");
let rest = orig
.lines()
.skip(first_group.lines().count())
.collect::<Vec<_>>()
.join("\n");
fn compute_len(orig: &str, line: &str) -> usize {
if orig.len() > line.len() {
if orig.as_bytes()[line.len()] == b'\r' {
line.len() + 2
} else {
line.len() + 1
}
} else {
line.len()
}
}
match style {
CommentStyle::DoubleSlash | CommentStyle::TripleSlash | CommentStyle::Doc => {
let line_start = style.line_start().trim_left();
for line in orig.lines() {
if line.trim_left().starts_with(line_start) || comment_style(line, false) == style {
first_group_ending += compute_len(&orig[first_group_ending..], line);
} else {
break;
}
}
}
CommentStyle::Custom(opener) => {
let trimmed_opener = opener.trim_right();
for line in orig.lines() {
if line.trim_left().starts_with(trimmed_opener) {
first_group_ending += compute_len(&orig[first_group_ending..], line);
} else {
break;
}
}
}
// for a block comment, search for the closing symbol
CommentStyle::DoubleBullet | CommentStyle::SingleBullet | CommentStyle::Exclamation => {
let closer = style.closer().trim_left();
for line in orig.lines() {
first_group_ending += compute_len(&orig[first_group_ending..], line);
if line.trim_left().ends_with(closer) {
break;
}
}
}
}
let (first_group, rest) = orig.split_at(first_group_ending);
let first_group_str = rewrite_comment_inner( let first_group_str = rewrite_comment_inner(
&first_group, first_group,
block_style, block_style,
style, style,
shape, shape,
@ -295,7 +317,7 @@ fn identify_comment(
if rest.is_empty() { if rest.is_empty() {
Some(first_group_str) Some(first_group_str)
} else { } else {
identify_comment(&rest, block_style, shape, config, is_doc_comment).map(|rest_str| { identify_comment(rest, block_style, shape, config, is_doc_comment).map(|rest_str| {
format!( format!(
"{}\n{}{}", "{}\n{}{}",
first_group_str, first_group_str,

View file

@ -0,0 +1,5 @@
// rustfmt-normalize_comments: true
/*
FIXME (#3300): Should allow items to be anonymous. Right now
we just use dummy names for anon items.
*/

View file

@ -0,0 +1,5 @@
// rustfmt-normalize_comments: true
/*
* FIXME (#3300): Should allow items to be anonymous. Right now
* we just use dummy names for anon items.
*/

View file

@ -0,0 +1,3 @@
// rustfmt-normalize_comments: true
// FIXME (#3300): Should allow items to be anonymous. Right now
// we just use dummy names for anon items.

View file

@ -0,0 +1,3 @@
// rustfmt-normalize_comments: true
// FIXME (#3300): Should allow items to be anonymous. Right now
// we just use dummy names for anon items.