Add custom comments (#1179)

* Add custom comments

This allows users to use custom comments such as

```
//@ this is a custom comment
//@ with multiple lines
```

without having them destroyed by rustfmt.

* Fix issues with empty lines

* Check non-whitespace right after custom comments
This commit is contained in:
Florian Gilcher 2016-09-29 21:34:46 +02:00 committed by Nick Cameron
parent 3e14af0eeb
commit b8f7ec3dcc
3 changed files with 39 additions and 0 deletions

View File

@ -20,6 +20,18 @@ use rewrite::RewriteContext;
use string::{StringFormat, rewrite_string};
use utils::wrap_str;
fn is_custom_comment(comment: &str) -> bool {
if !comment.starts_with("//") {
false
} else {
if let Some(c) = comment.chars().nth(2) {
!c.is_alphanumeric() && !c.is_whitespace()
} else {
false
}
}
}
pub fn rewrite_comment(orig: &str,
block_style: bool,
width: usize,
@ -51,6 +63,12 @@ pub fn rewrite_comment(orig: &str,
("/// ", "", "/// ")
} else if orig.starts_with("//!") || orig.starts_with("/*!") {
("//! ", "", "//! ")
} else if is_custom_comment(orig) {
if orig.chars().nth(3) == Some(' ') {
(&orig[0..4], "", &orig[0..4])
} else {
(&orig[0..3], "", &orig[0..3])
}
} else {
("// ", "", "// ")
};
@ -138,6 +156,12 @@ fn left_trim_comment_line(line: &str) -> &str {
if line.starts_with("//! ") || line.starts_with("/// ") || line.starts_with("/*! ") ||
line.starts_with("/** ") {
&line[4..]
} else if is_custom_comment(line) {
if line.len() > 3 && line.chars().nth(3) == Some(' ') {
&line[4..]
} else {
&line[3..]
}
} else if line.starts_with("/* ") || line.starts_with("// ") || line.starts_with("//!") ||
line.starts_with("///") ||
line.starts_with("** ") || line.starts_with("/*!") ||

7
tests/source/comment5.rs Normal file
View File

@ -0,0 +1,7 @@
// rustfmt-wrap_comments: true
//@ special comment
//@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec adiam lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam
//@
//@foo
fn test() {}

8
tests/target/comment5.rs Normal file
View File

@ -0,0 +1,8 @@
// rustfmt-wrap_comments: true
//@ special comment
//@ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec adiam
//@ lectus. Sed sit amet ipsum mauris. Maecenas congue ligula ac quam
//@
//@ foo
fn test() {}