提交 6a6ffb4c 编写于 作者: S SiegeLord

Do not strip leading whitespace when parsing doc comments.

This change prevents the indentation in code blocks inside the /// doc comments
from being eaten. The indentation that is the same across the consecutive doc
comments is removed by the uindent_pass in librustdoc.
上级 ae23beb5
// 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 // file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT. // http://rust-lang.org/COPYRIGHT.
// //
...@@ -152,6 +152,6 @@ fn should_not_parse_non_hidden_attribute() { ...@@ -152,6 +152,6 @@ fn should_not_parse_non_hidden_attribute() {
fn should_concatenate_multiple_doc_comments() { fn should_concatenate_multiple_doc_comments() {
let source = @"/// foo\n/// bar"; let source = @"/// foo\n/// bar";
let desc = parse_desc(parse_attributes(source)); let desc = parse_desc(parse_attributes(source));
assert!(desc == Some(~"foo\nbar")); assert!(desc == Some(~" foo\n bar"));
} }
} }
...@@ -69,39 +69,48 @@ fn vertical_trim(lines: ~[~str]) -> ~[~str] { ...@@ -69,39 +69,48 @@ fn vertical_trim(lines: ~[~str]) -> ~[~str] {
return lines.slice(i, j).to_owned(); return lines.slice(i, j).to_owned();
} }
// drop leftmost columns that contain only values in chars /// remove a "[ \t]*\*" block from each line, if possible
fn block_trim(lines: ~[~str], chars: ~str, max: Option<uint>) -> ~[~str] { fn horizontal_trim(lines: ~[~str]) -> ~[~str] {
let mut i = uint::max_value;
let mut i = max.get_or_default(uint::max_value); let mut can_trim = true;
for lines.each |line| { let mut first = true;
if line.trim().is_empty() { for lines.iter().advance |line| {
loop;
}
for line.iter().enumerate().advance |(j, c)| { for line.iter().enumerate().advance |(j, c)| {
if j >= i { if j > i || !"* \t".contains_char(c) {
can_trim = false;
break; break;
} }
if !chars.contains_char(c) { if c == '*' {
i = j; if first {
i = j;
first = false;
} else if i != j {
can_trim = false;
}
break; break;
} }
} }
if i > line.len() {
can_trim = false;
}
if !can_trim {
break;
}
} }
return do lines.map |line| { if can_trim {
let chars = line.iter().collect::<~[char]>(); do lines.map |line| {
if i > chars.len() { line.slice(i + 1, line.len()).to_owned()
~""
} else {
str::from_chars(chars.slice(i, chars.len()))
} }
}; } else {
lines
}
} }
if comment.starts_with("//") { if comment.starts_with("//") {
// FIXME #5475: // FIXME #5475:
// return comment.slice(3u, comment.len()).trim().to_owned(); // return comment.slice(3u, comment.len()).to_owned();
let r = comment.slice(3u, comment.len()); return r.trim().to_owned(); let r = comment.slice(3u, comment.len()); return r.to_owned();
} }
if comment.starts_with("/*") { if comment.starts_with("/*") {
...@@ -109,10 +118,10 @@ fn block_trim(lines: ~[~str], chars: ~str, max: Option<uint>) -> ~[~str] { ...@@ -109,10 +118,10 @@ fn block_trim(lines: ~[~str], chars: ~str, max: Option<uint>) -> ~[~str] {
.any_line_iter() .any_line_iter()
.transform(|s| s.to_owned()) .transform(|s| s.to_owned())
.collect::<~[~str]>(); .collect::<~[~str]>();
let lines = vertical_trim(lines); let lines = vertical_trim(lines);
let lines = block_trim(lines, ~"\t ", None); let lines = horizontal_trim(lines);
let lines = block_trim(lines, ~"*", Some(1u));
let lines = block_trim(lines, ~"\t ", None);
return lines.connect("\n"); return lines.connect("\n");
} }
...@@ -370,3 +379,36 @@ pub fn gather_comments_and_literals(span_diagnostic: ...@@ -370,3 +379,36 @@ pub fn gather_comments_and_literals(span_diagnostic:
(comments, literals) (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);
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册