diff --git a/src/librustdoc/attr_parser.rs b/src/librustdoc/attr_parser.rs index a86a7f38a8cddbbc0f22b1539dde5f034ad9c42b..1abdae113c597bb751e95e2df1dd5488191f0dd3 100644 --- a/src/librustdoc/attr_parser.rs +++ b/src/librustdoc/attr_parser.rs @@ -1,4 +1,4 @@ -// Copyright 2012 The Rust Project Developers. See the COPYRIGHT +// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // @@ -152,6 +152,6 @@ fn should_not_parse_non_hidden_attribute() { fn should_concatenate_multiple_doc_comments() { let source = @"/// foo\n/// bar"; let desc = parse_desc(parse_attributes(source)); - assert!(desc == Some(~"foo\nbar")); + assert!(desc == Some(~" foo\n bar")); } } diff --git a/src/libsyntax/parse/comments.rs b/src/libsyntax/parse/comments.rs index 40352f890f4faf6dff9ae4073e488e4758bf0a20..472f807cd8b682a6b8f0241a73d07039d23f4358 100644 --- a/src/libsyntax/parse/comments.rs +++ b/src/libsyntax/parse/comments.rs @@ -69,39 +69,48 @@ fn vertical_trim(lines: ~[~str]) -> ~[~str] { return lines.slice(i, j).to_owned(); } - // drop leftmost columns that contain only values in chars - fn block_trim(lines: ~[~str], chars: ~str, max: Option) -> ~[~str] { - - let mut i = max.get_or_default(uint::max_value); - for lines.each |line| { - if line.trim().is_empty() { - loop; - } + /// remove a "[ \t]*\*" block from each line, if possible + fn horizontal_trim(lines: ~[~str]) -> ~[~str] { + let mut i = uint::max_value; + let mut can_trim = true; + let mut first = true; + for lines.iter().advance |line| { for line.iter().enumerate().advance |(j, c)| { - if j >= i { + if j > i || !"* \t".contains_char(c) { + can_trim = false; break; } - if !chars.contains_char(c) { - i = j; + if c == '*' { + if first { + i = j; + first = false; + } else if i != j { + can_trim = false; + } break; } } + if i > line.len() { + can_trim = false; + } + if !can_trim { + break; + } } - return do lines.map |line| { - let chars = line.iter().collect::<~[char]>(); - if i > chars.len() { - ~"" - } else { - str::from_chars(chars.slice(i, chars.len())) + if can_trim { + do lines.map |line| { + line.slice(i + 1, line.len()).to_owned() } - }; + } else { + lines + } } if comment.starts_with("//") { // FIXME #5475: - // return comment.slice(3u, comment.len()).trim().to_owned(); - let r = comment.slice(3u, comment.len()); return r.trim().to_owned(); + // return comment.slice(3u, comment.len()).to_owned(); + let r = comment.slice(3u, comment.len()); return r.to_owned(); } if comment.starts_with("/*") { @@ -109,10 +118,10 @@ fn block_trim(lines: ~[~str], chars: ~str, max: Option) -> ~[~str] { .any_line_iter() .transform(|s| s.to_owned()) .collect::<~[~str]>(); + let lines = vertical_trim(lines); - let lines = block_trim(lines, ~"\t ", None); - let lines = block_trim(lines, ~"*", Some(1u)); - let lines = block_trim(lines, ~"\t ", None); + let lines = horizontal_trim(lines); + return lines.connect("\n"); } @@ -370,3 +379,36 @@ pub fn gather_comments_and_literals(span_diagnostic: (comments, literals) } + +#[cfg(test)] +mod test { + use super::*; + + #[test] fn test_block_doc_comment_1() { + let comment = "/**\n * Test \n ** Test\n * Test\n*/"; + let correct_stripped = " Test \n* Test\n Test"; + let stripped = strip_doc_comment_decoration(comment); + assert_eq!(stripped.slice(0, stripped.len()), correct_stripped); + } + + #[test] fn test_block_doc_comment_2() { + let comment = "/**\n * Test\n * Test\n*/"; + let correct_stripped = " Test\n Test"; + let stripped = strip_doc_comment_decoration(comment); + assert_eq!(stripped.slice(0, stripped.len()), correct_stripped); + } + + #[test] fn test_block_doc_comment_3() { + let comment = "/**\n let a: *int;\n *a = 5;\n*/"; + let correct_stripped = " let a: *int;\n *a = 5;"; + let stripped = strip_doc_comment_decoration(comment); + assert_eq!(stripped.slice(0, stripped.len()), correct_stripped); + } + + #[test] fn test_line_doc_comment() { + let comment = "/// Test"; + let correct_stripped = " Test"; + let stripped = strip_doc_comment_decoration(comment); + assert_eq!(stripped.slice(0, stripped.len()), correct_stripped); + } +}