Skip to content

Commit 52b7002

Browse files
committed
Use different style when rewriting comment with different opener
1 parent 72c04fa commit 52b7002

File tree

2 files changed

+153
-27
lines changed

2 files changed

+153
-27
lines changed

src/comment.rs

Lines changed: 144 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,118 @@ fn is_custom_comment(comment: &str) -> bool {
3232
}
3333
}
3434

35+
#[derive(PartialEq, Eq)]
36+
pub enum CommentStyle {
37+
DoubleSlash,
38+
TripleSlash,
39+
Doc,
40+
SingleBullet,
41+
DoubleBullet,
42+
Exclamation,
43+
Custom,
44+
}
45+
46+
impl CommentStyle {
47+
pub fn opener<'a>(&self, orig: &'a str) -> &'a str {
48+
match *self {
49+
CommentStyle::DoubleSlash => "// ",
50+
CommentStyle::TripleSlash => "/// ",
51+
CommentStyle::Doc => "//! ",
52+
CommentStyle::SingleBullet => "/* ",
53+
CommentStyle::DoubleBullet => "/** ",
54+
CommentStyle::Exclamation => "/*! ",
55+
CommentStyle::Custom => {
56+
if orig.chars().nth(3) == Some(' ') {
57+
&orig[0..4]
58+
} else {
59+
&orig[0..3]
60+
}
61+
}
62+
}
63+
}
64+
65+
pub fn closer<'a>(&self) -> &'a str {
66+
match *self {
67+
CommentStyle::DoubleSlash |
68+
CommentStyle::TripleSlash |
69+
CommentStyle::Custom |
70+
CommentStyle::Doc => "",
71+
CommentStyle::DoubleBullet => " **/",
72+
CommentStyle::SingleBullet |
73+
CommentStyle::Exclamation => " */",
74+
}
75+
}
76+
77+
pub fn line_start<'a>(&self, orig: &'a str) -> &'a str {
78+
match *self {
79+
CommentStyle::DoubleSlash => "// ",
80+
CommentStyle::TripleSlash => "/// ",
81+
CommentStyle::Doc => "//! ",
82+
CommentStyle::SingleBullet |
83+
CommentStyle::Exclamation => " * ",
84+
CommentStyle::DoubleBullet => " ** ",
85+
CommentStyle::Custom => {
86+
if orig.chars().nth(3) == Some(' ') {
87+
&orig[0..4]
88+
} else {
89+
&orig[0..3]
90+
}
91+
}
92+
}
93+
}
94+
95+
pub fn to_str_tuplet<'a>(&self, orig: &'a str) -> (&'a str, &'a str, &'a str) {
96+
(self.opener(orig), self.closer(), self.line_start(orig))
97+
}
98+
99+
pub fn to_pattern<'a>(&self, line: &str, orig: &'a str, normalize_comments: bool) -> bool {
100+
match *self {
101+
CommentStyle::DoubleSlash |
102+
CommentStyle::TripleSlash |
103+
CommentStyle::Custom |
104+
CommentStyle::Doc => {
105+
line.trim_left()
106+
.starts_with(self.line_start(orig).trim_left()) ||
107+
comment_style(line, normalize_comments) == *self
108+
}
109+
CommentStyle::DoubleBullet |
110+
CommentStyle::SingleBullet |
111+
CommentStyle::Exclamation => {
112+
line.trim_left().starts_with(self.closer().trim_left()) ||
113+
line.trim_left()
114+
.starts_with(self.line_start(orig).trim_left()) ||
115+
comment_style(line, normalize_comments) == *self
116+
}
117+
}
118+
}
119+
}
120+
121+
fn comment_style(orig: &str, normalize_comments: bool) -> CommentStyle {
122+
if !normalize_comments {
123+
if orig.starts_with("/**") && !orig.starts_with("/**/") {
124+
CommentStyle::DoubleBullet
125+
} else if orig.starts_with("/*!") {
126+
CommentStyle::Exclamation
127+
} else if orig.starts_with("/*") {
128+
CommentStyle::SingleBullet
129+
} else if orig.starts_with("///") {
130+
CommentStyle::TripleSlash
131+
} else if orig.starts_with("//!") {
132+
CommentStyle::Doc
133+
} else {
134+
CommentStyle::DoubleSlash
135+
}
136+
} else if orig.starts_with("///") || (orig.starts_with("/**") && !orig.starts_with("/**/")) {
137+
CommentStyle::TripleSlash
138+
} else if orig.starts_with("//!") || orig.starts_with("/*!") {
139+
CommentStyle::Doc
140+
} else if is_custom_comment(orig) {
141+
CommentStyle::Custom
142+
} else {
143+
CommentStyle::DoubleSlash
144+
}
145+
}
146+
35147
pub fn rewrite_comment(orig: &str,
36148
block_style: bool,
37149
shape: Shape,
@@ -47,39 +159,44 @@ pub fn rewrite_comment(orig: &str,
47159
if num_bare_lines > 0 && !config.normalize_comments() {
48160
return Some(orig.to_owned());
49161
}
50-
51162
if !config.normalize_comments() && !config.wrap_comments() {
52163
return light_rewrite_comment(orig, shape.indent, config);
53164
}
54165

166+
let style = comment_style(orig, false);
167+
let first_group = orig.lines()
168+
.take_while(|l| style.to_pattern(l, orig, false))
169+
.collect::<Vec<_>>()
170+
.join("\n");
171+
let rest = orig.lines()
172+
.skip(first_group.lines().count())
173+
.collect::<Vec<_>>()
174+
.join("\n");
175+
176+
let first_group_str = try_opt!(rewrite_comment_inner(&first_group, block_style, shape, config));
177+
if rest.is_empty() {
178+
Some(first_group_str)
179+
} else {
180+
rewrite_comment(&rest, block_style, shape, config).map(|rest_str| {
181+
format!("{}\n{}{}",
182+
first_group_str,
183+
shape
184+
.indent
185+
.to_string(config),
186+
rest_str)
187+
})
188+
}
189+
}
190+
191+
fn rewrite_comment_inner(orig: &str,
192+
block_style: bool,
193+
shape: Shape,
194+
config: &Config)
195+
-> Option<String> {
55196
let (opener, closer, line_start) = if block_style {
56-
("/* ", " */", " * ")
57-
} else if !config.normalize_comments() {
58-
if orig.starts_with("/**") && !orig.starts_with("/**/") {
59-
("/** ", " **/", " ** ")
60-
} else if orig.starts_with("/*!") {
61-
("/*! ", " */", " * ")
62-
} else if orig.starts_with("/*") {
63-
("/* ", " */", " * ")
64-
} else if orig.starts_with("///") {
65-
("/// ", "", "/// ")
66-
} else if orig.starts_with("//!") {
67-
("//! ", "", "//! ")
68-
} else {
69-
("// ", "", "// ")
70-
}
71-
} else if orig.starts_with("///") || (orig.starts_with("/**") && !orig.starts_with("/**/")) {
72-
("/// ", "", "/// ")
73-
} else if orig.starts_with("//!") || orig.starts_with("/*!") {
74-
("//! ", "", "//! ")
75-
} else if is_custom_comment(orig) {
76-
if orig.chars().nth(3) == Some(' ') {
77-
(&orig[0..4], "", &orig[0..4])
78-
} else {
79-
(&orig[0..3], "", &orig[0..3])
80-
}
197+
CommentStyle::SingleBullet.to_str_tuplet("")
81198
} else {
82-
("// ", "", "// ")
199+
comment_style(orig, config.normalize_comments()).to_str_tuplet(orig)
83200
};
84201

85202
let max_chars = shape

tests/target/issue-691.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
// rustfmt-normalize_comments: true
2+
3+
//! `std` or `core` and simply link to this library. In case the target
4+
//! platform has no hardware
5+
//! support for some operation, software implementations provided by this
6+
//! library will be used automagically.
7+
// TODO: provide instructions to override default libm link and how to link to
8+
// this library.
9+
fn foo() {}

0 commit comments

Comments
 (0)