parent
3cc1f5ed5b
commit
c65ba14d69
@ -796,7 +796,7 @@ impl<'a> CommentRewrite<'a> {
|
||||
// 1) wrap_comments = true is configured
|
||||
// 2) The comment is not the start of a markdown header doc comment
|
||||
// 3) The comment width exceeds the shape's width
|
||||
// 4) No URLS were found in the commnet
|
||||
// 4) No URLS were found in the comment
|
||||
let should_wrap_comment = self.fmt.config.wrap_comments()
|
||||
&& !is_markdown_header_doc_comment
|
||||
&& unicode_str_width(line) > self.fmt.shape.width
|
||||
|
@ -315,20 +315,21 @@ fn break_string(max_width: usize, trim_end: bool, line_end: &str, input: &[&str]
|
||||
// Found a whitespace and what is on its left side is big enough.
|
||||
Some(index) if index >= MIN_STRING => break_at(index),
|
||||
// No whitespace found, try looking for a punctuation instead
|
||||
_ => match input[0..max_width_index_in_input]
|
||||
.iter()
|
||||
.rposition(|grapheme| is_punctuation(grapheme))
|
||||
_ => match (0..max_width_index_in_input)
|
||||
.rev()
|
||||
.skip_while(|pos| !is_valid_linebreak(input, *pos))
|
||||
.next()
|
||||
{
|
||||
// Found a punctuation and what is on its left side is big enough.
|
||||
Some(index) if index >= MIN_STRING => break_at(index),
|
||||
// Either no boundary character was found to the left of `input[max_chars]`, or the line
|
||||
// got too small. We try searching for a boundary character to the right.
|
||||
_ => match input[max_width_index_in_input..]
|
||||
.iter()
|
||||
.position(|grapheme| is_whitespace(grapheme) || is_punctuation(grapheme))
|
||||
_ => match (max_width_index_in_input..input.len())
|
||||
.skip_while(|pos| !is_valid_linebreak(input, *pos))
|
||||
.next()
|
||||
{
|
||||
// A boundary was found after the line limit
|
||||
Some(index) => break_at(max_width_index_in_input + index),
|
||||
Some(index) => break_at(index),
|
||||
// No boundary to the right, the input cannot be broken
|
||||
None => SnippetState::EndOfInput(input.concat()),
|
||||
},
|
||||
@ -336,6 +337,23 @@ fn break_string(max_width: usize, trim_end: bool, line_end: &str, input: &[&str]
|
||||
}
|
||||
}
|
||||
|
||||
fn is_valid_linebreak(input: &[&str], pos: usize) -> bool {
|
||||
let is_whitespace = is_whitespace(input[pos]);
|
||||
if is_whitespace {
|
||||
return true;
|
||||
}
|
||||
let is_punctuation = is_punctuation(input[pos]);
|
||||
if is_punctuation && !is_part_of_type(input, pos) {
|
||||
return true;
|
||||
}
|
||||
false
|
||||
}
|
||||
|
||||
fn is_part_of_type(input: &[&str], pos: usize) -> bool {
|
||||
input.get(pos..=pos + 1) == Some(&[":", ":"])
|
||||
|| input.get(pos.saturating_sub(1)..=pos) == Some(&[":", ":"])
|
||||
}
|
||||
|
||||
fn is_new_line(grapheme: &str) -> bool {
|
||||
let bytes = grapheme.as_bytes();
|
||||
bytes.starts_with(b"\n") || bytes.starts_with(b"\r\n")
|
||||
@ -369,6 +387,19 @@ mod test {
|
||||
rewrite_string("eq_", &fmt, 2);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn line_break_at_valid_points_test() {
|
||||
let string = "[TheName](Dont::break::my::type::That::would::be::very::nice) break here";
|
||||
let graphemes = UnicodeSegmentation::graphemes(&*string, false).collect::<Vec<&str>>();
|
||||
assert_eq!(
|
||||
break_string(20, false, "", &graphemes[..]),
|
||||
SnippetState::LineEnd(
|
||||
"[TheName](Dont::break::my::type::That::would::be::very::nice) ".to_string(),
|
||||
62
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn should_break_on_whitespace() {
|
||||
let string = "Placerat felis. Mauris porta ante sagittis purus.";
|
||||
|
14
tests/source/issue-5260.rs
Normal file
14
tests/source/issue-5260.rs
Normal file
@ -0,0 +1,14 @@
|
||||
// rustfmt-wrap_comments: true
|
||||
|
||||
/// [MyType](VeryLongPathToMyType::NoLineBreak::Here::Okay::ThatWouldBeNice::Thanks)
|
||||
fn documented_with_longtype() {
|
||||
// # We're using a long type link, rustfmt should not break line
|
||||
// on the type when `wrap_comments = true`
|
||||
}
|
||||
|
||||
/// VeryLongPathToMyType::JustMyType::But::VeryVery::Long::NoLineBreak::Here::Okay::ThatWouldBeNice::Thanks
|
||||
fn documented_with_verylongtype() {
|
||||
// # We're using a long type link, rustfmt should not break line
|
||||
// on the type when `wrap_comments = true`
|
||||
}
|
||||
|
13
tests/target/issue-5260.rs
Normal file
13
tests/target/issue-5260.rs
Normal file
@ -0,0 +1,13 @@
|
||||
// rustfmt-wrap_comments: true
|
||||
|
||||
/// [MyType](VeryLongPathToMyType::NoLineBreak::Here::Okay::ThatWouldBeNice::Thanks)
|
||||
fn documented_with_longtype() {
|
||||
// # We're using a long type link, rustfmt should not break line
|
||||
// on the type when `wrap_comments = true`
|
||||
}
|
||||
|
||||
/// VeryLongPathToMyType::JustMyType::But::VeryVery::Long::NoLineBreak::Here::Okay::ThatWouldBeNice::Thanks
|
||||
fn documented_with_verylongtype() {
|
||||
// # We're using a long type link, rustfmt should not break line
|
||||
// on the type when `wrap_comments = true`
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user