Skip to content

Commit 3454812

Browse files
committed
Partition wrap_comments into normal or doc settings
1 parent ead0fc9 commit 3454812

File tree

16 files changed

+304
-23
lines changed

16 files changed

+304
-23
lines changed

Configurations.md

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3096,11 +3096,11 @@ Note that no wrapping will happen if:
30963096
1. The comment is the start of a markdown header doc comment
30973097
2. An URL was found in the comment
30983098

3099-
- **Default value**: `false`
3100-
- **Possible values**: `true`, `false`
3099+
- **Default value**: `"off"`
3100+
- **Possible values**: `"doc"`, `"normal"`, `"all"` (alias `true`), `"off"` (alias `false`)
31013101
- **Stable**: No (tracking issue: [#3347](https://github.com/rust-lang/rustfmt/issues/3347))
31023102

3103-
#### `false` (default):
3103+
#### `"off"` (default):
31043104

31053105
```rust
31063106
// Lorem ipsum dolor sit amet, consectetur adipiscing elit,
@@ -3112,12 +3112,10 @@ Note that no wrapping will happen if:
31123112
// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
31133113

31143114
// Information on the lorem ipsum can be found at the following url: https://en.wikipedia.org/wiki/Lorem_ipsum. Its text is: lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
3115-
3116-
/// # This doc comment is a very long header (it starts with a '#'). Had it not been a header it would have been wrapped. But because it is a header, it will not be. That is because wrapping a markdown header breaks it.
31173115
struct Foo {}
31183116
```
31193117

3120-
#### `true`:
3118+
#### `"all"`:
31213119

31223120
```rust
31233121
// Lorem ipsum dolor sit amet, consectetur adipiscing elit,
@@ -3133,8 +3131,6 @@ struct Foo {}
31333131
// commodo consequat.
31343132

31353133
// Information on the lorem ipsum can be found at the following url: https://en.wikipedia.org/wiki/Lorem_ipsum. Its text is: lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
3136-
3137-
/// # This doc comment is a very long header (it starts with a '#'). Had it not been a header it would have been wrapped. But because it is a header, it will not be. That is because wrapping a markdown header breaks it.
31383134
struct Foo {}
31393135
```
31403136

src/comment.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use lazy_static::lazy_static;
77
use regex::Regex;
88
use rustc_span::Span;
99

10-
use crate::config::Config;
10+
use crate::config::{Config, WrapComments};
1111
use crate::rewrite::RewriteContext;
1212
use crate::shape::{Indent, Shape};
1313
use crate::string::{rewrite_string, StringFormat};
@@ -361,12 +361,11 @@ fn identify_comment(
361361
if !config.normalize_comments() && has_bare_lines && style.is_block_comment() {
362362
trim_left_preserve_layout(first_group, shape.indent, config)?
363363
} else if !config.normalize_comments()
364-
&& !config.wrap_comments()
365-
&& !(
366-
// `format_code_in_doc_comments` should only take effect on doc comments,
367-
// so we only consider it when this comment block is a doc comment block.
368-
is_doc_comment && config.format_code_in_doc_comments()
369-
)
364+
&& (if is_doc_comment {
365+
!config.wrap_comments().is_doc() && !config.format_code_in_doc_comments()
366+
} else {
367+
!config.wrap_comments().is_normal()
368+
})
370369
{
371370
light_rewrite_comment(first_group, shape.indent, config, is_doc_comment)
372371
} else {
@@ -770,7 +769,7 @@ impl<'a> CommentRewrite<'a> {
770769
&& !self.code_block_buffer.trim().is_empty() =>
771770
{
772771
let mut config = self.fmt.config.clone();
773-
config.set().wrap_comments(false);
772+
config.set().wrap_comments(WrapComments::Off);
774773
let comment_max_width = config
775774
.doc_comment_code_block_width()
776775
.min(config.max_width());
@@ -802,11 +801,17 @@ impl<'a> CommentRewrite<'a> {
802801
return false;
803802
}
804803

804+
let config_wrap_comments = if is_doc_comment {
805+
self.fmt.config.wrap_comments().is_doc()
806+
} else {
807+
self.fmt.config.wrap_comments().is_normal()
808+
};
809+
805810
self.code_block_attr = None;
806811
self.item_block = None;
807812
if let Some(stripped) = line.strip_prefix("```") {
808813
self.code_block_attr = Some(CodeBlockAttribute::new(stripped))
809-
} else if self.fmt.config.wrap_comments() {
814+
} else if config_wrap_comments {
810815
if let Some(ib) = ItemizedBlock::new(line) {
811816
self.item_block = Some(ib);
812817
return false;
@@ -845,7 +850,7 @@ impl<'a> CommentRewrite<'a> {
845850
// 4) No URLS were found in the comment
846851
// If this changes, the documentation in ../Configurations.md#wrap_comments
847852
// should be changed accordingly.
848-
let should_wrap_comment = self.fmt.config.wrap_comments()
853+
let should_wrap_comment = config_wrap_comments
849854
&& !is_markdown_header_doc_comment
850855
&& unicode_str_width(line) > self.fmt.shape.width
851856
&& !has_url(line)
@@ -1903,13 +1908,13 @@ mod test {
19031908

19041909
#[test]
19051910
#[rustfmt::skip]
1906-
fn format_doc_comments() {
1911+
fn format_comments() {
19071912
let mut wrap_normalize_config: crate::config::Config = Default::default();
1908-
wrap_normalize_config.set().wrap_comments(true);
1913+
wrap_normalize_config.set().wrap_comments(WrapComments::All);
19091914
wrap_normalize_config.set().normalize_comments(true);
19101915

19111916
let mut wrap_config: crate::config::Config = Default::default();
1912-
wrap_config.set().wrap_comments(true);
1917+
wrap_config.set().wrap_comments(WrapComments::All);
19131918

19141919
let comment = rewrite_comment(" //test",
19151920
true,

src/config/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ create_config! {
6363
over multiple lines.";
6464

6565
// Comments. macros, and strings
66-
wrap_comments: bool, false, false, "Break comments to fit on the line";
66+
wrap_comments: WrapComments, WrapComments::Off, false, "Break comments to fit on the line";
6767
format_code_in_doc_comments: bool, false, false, "Format the code snippet in doc comments.";
6868
doc_comment_code_block_width: usize, 100, false, "Maximum width for code snippets in doc \
6969
comments. No effect unless format_code_in_doc_comments = true";
@@ -634,7 +634,7 @@ array_width = 60
634634
chain_width = 60
635635
single_line_if_else_max_width = 50
636636
single_line_let_else_max_width = 50
637-
wrap_comments = false
637+
wrap_comments = "Off"
638638
format_code_in_doc_comments = false
639639
doc_comment_code_block_width = 100
640640
comment_width = 80

src/config/options.rs

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,97 @@ pub enum Verbosity {
216216
Quiet,
217217
}
218218

219+
/// Which comments to wrap
220+
#[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize)]
221+
pub enum WrapComments {
222+
/// Don't wrap comments
223+
Off,
224+
/// Wrap all kinds of comments
225+
All,
226+
/// Only wrap doc comments
227+
Doc,
228+
/// Only wrap normal comments
229+
Normal,
230+
}
231+
232+
impl WrapComments {
233+
pub(crate) fn is_normal(self) -> bool {
234+
matches!(self, WrapComments::All | WrapComments::Normal)
235+
}
236+
237+
pub(crate) fn is_doc(self) -> bool {
238+
matches!(self, WrapComments::All | WrapComments::Doc)
239+
}
240+
}
241+
242+
impl fmt::Display for WrapComments {
243+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
244+
match self {
245+
WrapComments::Off => f.write_str("Off"),
246+
WrapComments::All => f.write_str("All"),
247+
WrapComments::Doc => f.write_str("Doc"),
248+
WrapComments::Normal => f.write_str("Normal"),
249+
}
250+
}
251+
}
252+
253+
impl super::ConfigType for WrapComments {
254+
fn doc_hint() -> String {
255+
"[Off|All|Doc|Normal]".to_owned()
256+
}
257+
258+
fn stable_variant(&self) -> bool {
259+
true
260+
}
261+
}
262+
263+
impl std::str::FromStr for WrapComments {
264+
type Err = &'static str;
265+
266+
fn from_str(s: &str) -> Result<Self, Self::Err> {
267+
match s.to_lowercase().as_str() {
268+
"off" | "false" => Ok(WrapComments::Off),
269+
"all" | "true" => Ok(WrapComments::All),
270+
"doc" => Ok(WrapComments::Doc),
271+
"normal" => Ok(WrapComments::Normal),
272+
_ => Err("Bad variant, expected one of: `Off` `All` `Doc` `Normal`"),
273+
}
274+
}
275+
}
276+
277+
impl<'de> serde::de::Deserialize<'de> for WrapComments {
278+
fn deserialize<D>(d: D) -> Result<Self, D::Error>
279+
where
280+
D: serde::Deserializer<'de>,
281+
{
282+
use serde::de::Error;
283+
284+
struct StringOrBoolVisitor;
285+
286+
impl<'de> Visitor<'de> for StringOrBoolVisitor {
287+
type Value = String;
288+
289+
fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
290+
formatter.write_str("string")
291+
}
292+
293+
fn visit_str<E>(self, value: &str) -> Result<String, E> {
294+
Ok(String::from(value))
295+
}
296+
297+
fn visit_bool<E>(self, value: bool) -> Result<String, E> {
298+
Ok(value.to_string())
299+
}
300+
}
301+
302+
let s = d.deserialize_string(StringOrBoolVisitor)?;
303+
s.parse().map_err(|_| {
304+
static ALLOWED: &'static [&str] = &["Off", "All", "Doc", "Normal"];
305+
D::Error::unknown_variant(&s, ALLOWED)
306+
})
307+
}
308+
}
309+
219310
#[derive(Deserialize, Serialize, Clone, Debug, PartialEq)]
220311
pub struct WidthHeuristics {
221312
// Maximum width of the args of a function call before falling back
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// rustfmt-wrap_comments: all
2+
// rustfmt-max_width: 50
3+
// Wrap comments
4+
5+
fn main() {
6+
//! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
7+
8+
// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
9+
}
10+
11+
fn code_block() {
12+
// ```rust
13+
// let x = 3;
14+
//
15+
// println!("x = {}", x);
16+
// ```
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// rustfmt-wrap_comments: doc
2+
// rustfmt-max_width: 50
3+
/// Wrap comments
4+
5+
fn main() {
6+
//! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
7+
8+
// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
9+
}
10+
11+
fn code_block() {
12+
// ```rust
13+
// let x = 3;
14+
//
15+
// println!("x = {}", x);
16+
// ```
17+
}

tests/source/configs/wrap_comments/false.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,15 @@
44
// Wrap comments
55

66
fn main() {
7+
//! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
8+
79
// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
810
}
11+
12+
fn code_block() {
13+
//! ```rust
14+
//! let x = 3;
15+
//!
16+
//! println!("x = {}", x);
17+
//! ```
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// rustfmt-wrap_comments: normal
2+
// rustfmt-max_width: 50
3+
// rustfmt-error_on_line_overflow: false
4+
// Wrap comments
5+
6+
fn main() {
7+
//! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
8+
9+
// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
10+
}
11+
12+
fn code_block() {
13+
//! ```rust
14+
//! let x = 3;
15+
//!
16+
//! println!("x = {}", x);
17+
//! ```
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// rustfmt-wrap_comments: off
2+
// rustfmt-max_width: 50
3+
// rustfmt-error_on_line_overflow: false
4+
// Wrap comments
5+
6+
fn main() {
7+
//! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
8+
9+
// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
10+
}
11+
12+
fn code_block() {
13+
//! ```rust
14+
//! let x = 3;
15+
//!
16+
//! println!("x = {}", x);
17+
//! ```
18+
}

tests/source/configs/wrap_comments/true.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
// Wrap comments
44

55
fn main() {
6+
//! Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
7+
68
// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
79
}
810

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
// rustfmt-wrap_comments: all
2+
// rustfmt-max_width: 50
3+
// Wrap comments
4+
5+
fn main() {
6+
//! Lorem ipsum dolor sit amet, consectetur
7+
//! adipiscing elit, sed do eiusmod tempor
8+
//! incididunt ut labore et dolore magna
9+
//! aliqua. Ut enim ad minim veniam, quis
10+
//! nostrud exercitation ullamco laboris nisi
11+
//! ut aliquip ex ea commodo consequat.
12+
13+
// Lorem ipsum dolor sit amet, consectetur
14+
// adipiscing elit, sed do eiusmod tempor
15+
// incididunt ut labore et dolore magna
16+
// aliqua. Ut enim ad minim veniam, quis
17+
// nostrud exercitation ullamco laboris nisi
18+
// ut aliquip ex ea commodo consequat.
19+
}
20+
21+
fn code_block() {
22+
// ```rust
23+
// let x = 3;
24+
//
25+
// println!("x = {}", x);
26+
// ```
27+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
// rustfmt-wrap_comments: doc
2+
// rustfmt-max_width: 50
3+
/// Wrap comments
4+
5+
fn main() {
6+
//! Lorem ipsum dolor sit amet, consectetur
7+
//! adipiscing elit, sed do eiusmod tempor
8+
//! incididunt ut labore et dolore magna
9+
//! aliqua. Ut enim ad minim veniam, quis
10+
//! nostrud exercitation ullamco laboris nisi
11+
//! ut aliquip ex ea commodo consequat.
12+
13+
// Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
14+
}
15+
16+
fn code_block() {
17+
// ```rust
18+
// let x = 3;
19+
//
20+
// println!("x = {}", x);
21+
// ```
22+
}

0 commit comments

Comments
 (0)