pub fn without_block_comments(lines: Vec<&str>) -> Vec<&str> {
let mut without = vec![];
- // naive approach for block comments
- let mut inside_comment = false;
+ let mut nest_level = 0;
for line in lines.into_iter() {
if line.contains("/*") {
- inside_comment = true;
+ nest_level += 1;
continue;
} else if line.contains("*/") {
- inside_comment = false;
+ nest_level -= 1;
continue;
}
- if !inside_comment {
+ if nest_level == 0 {
without.push(line);
}
}
Bar4
}
-// This should not produce a warning because there is a comment in between
+// This should not produce a warning because the empty line is inside a block comment
#[crate_type = "lib"]
/*
*/
pub struct S;
+// This should not produce a warning
+#[crate_type = "lib"]
+/* test */
+pub struct T;
+
fn main() { }
let result = without_block_comments(vec!["/* rust", "", "*/"]);
assert!(result.is_empty());
+ let result = without_block_comments(vec!["/* one-line comment */"]);
+ assert!(result.is_empty());
+
+ let result = without_block_comments(vec!["/* nested", "/* multi-line", "comment", "*/", "test", "*/"]);
+ assert!(result.is_empty());
+
+ let result = without_block_comments(vec!["/* nested /* inline /* comment */ test */ */"]);
+ assert!(result.is_empty());
+
let result = without_block_comments(vec!["foo", "bar", "baz"]);
assert_eq!(result, vec!["foo", "bar", "baz"]);
}