diff --git a/src/libextra/glob.rs b/src/libextra/glob.rs index 031545c1cd203..cdcb730e8bed5 100644 --- a/src/libextra/glob.rs +++ b/src/libextra/glob.rs @@ -39,32 +39,32 @@ pub struct GlobIterator { priv todo: ~[(Path,uint)] } -/** - * Return an iterator that produces all the Paths that match the given pattern, - * which may be absolute or relative to the current working directory. - * - * This method uses the default match options and is equivalent to calling - * `glob_with(pattern, MatchOptions::new())`. Use `glob_with` directly if you - * want to use non-default match options. - * - * # Example - * - * Consider a directory `/media/pictures` containing only the files `kittens.jpg`, - * `puppies.jpg` and `hamsters.gif`: - * - * ```rust - * for path in glob("/media/pictures/*.jpg") { - * println(path.to_str()); - * } - * ``` - * - * The above code will print: - * - * ``` - * /media/pictures/kittens.jpg - * /media/pictures/puppies.jpg - * ``` - */ +/// +/// Return an iterator that produces all the Paths that match the given pattern, +/// which may be absolute or relative to the current working directory. +/// +/// is method uses the default match options and is equivalent to calling +/// `glob_with(pattern, MatchOptions::new())`. Use `glob_with` directly if you +/// want to use non-default match options. +/// +/// # Example +/// +/// Consider a directory `/media/pictures` containing only the files `kittens.jpg`, +/// `puppies.jpg` and `hamsters.gif`: +/// +/// ```rust +/// for path in glob("/media/pictures/*.jpg") { +/// println(path.to_str()); +/// } +/// ``` +/// +/// The above code will print: +/// +/// ``` +/// /media/pictures/kittens.jpg +/// /media/pictures/puppies.jpg +/// ``` +/// pub fn glob(pattern: &str) -> GlobIterator { glob_with(pattern, MatchOptions::new()) } diff --git a/src/libstd/os.rs b/src/libstd/os.rs index 348bfd5c61a43..6f68e293dac2f 100644 --- a/src/libstd/os.rs +++ b/src/libstd/os.rs @@ -516,12 +516,6 @@ pub fn self_exe_path() -> Option { load_self().and_then(|path| Path::new_opt(path).map(|mut p| { p.pop(); p })) } - -/** - * Returns the path to the user's home directory, if known. -} - - /** * Returns the path to the user's home directory, if known. * diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs index a43e018cf4949..8edc171fcacac 100644 --- a/src/libsyntax/parse/lexer.rs +++ b/src/libsyntax/parse/lexer.rs @@ -373,49 +373,49 @@ pub fn is_block_non_doc_comment(s: &str) -> bool { fn consume_block_comment(rdr: @mut StringReader) -> Option { // block comments starting with "/**" or "/*!" are doc-comments - let res = if rdr.curr == '*' || rdr.curr == '!' { - let start_bpos = rdr.pos - BytePos(3u); - while !(rdr.curr == '*' && nextch(rdr) == '/') && !is_eof(rdr) { - bump(rdr); - } + let is_doc_comment = rdr.curr == '*' || rdr.curr == '!'; + let start_bpos = rdr.pos - BytePos(if is_doc_comment {3u} else {2u}); + + let mut level: int = 1; + while level > 0 { if is_eof(rdr) { - fatal_span(rdr, start_bpos, rdr.last_pos, - ~"unterminated block doc-comment"); - } else { + let msg = if is_doc_comment { + ~"unterminated block doc-comment" + } else { + ~"unterminated block comment" + }; + fatal_span(rdr, start_bpos, rdr.last_pos, msg); + } else if rdr.curr == '/' && nextch(rdr) == '*' { + level += 1; bump(rdr); bump(rdr); - do with_str_from(rdr, start_bpos) |string| { - // but comments with only "*"s between two "/"s are not - if !is_block_non_doc_comment(string) { - Some(TokenAndSpan{ - tok: token::DOC_COMMENT(str_to_ident(string)), - sp: codemap::mk_sp(start_bpos, rdr.pos) - }) - } else { - None - } - } + } else if rdr.curr == '*' && nextch(rdr) == '/' { + level -= 1; + bump(rdr); + bump(rdr); + } else { + bump(rdr); } - } else { - let start_bpos = rdr.last_pos - BytePos(2u); - loop { - if is_eof(rdr) { - fatal_span(rdr, start_bpos, rdr.last_pos, - ~"unterminated block comment"); - } - if rdr.curr == '*' && nextch(rdr) == '/' { - bump(rdr); - bump(rdr); - break; + } + + let res = if is_doc_comment { + do with_str_from(rdr, start_bpos) |string| { + // but comments with only "*"s between two "/"s are not + if !is_block_non_doc_comment(string) { + Some(TokenAndSpan{ + tok: token::DOC_COMMENT(str_to_ident(string)), + sp: codemap::mk_sp(start_bpos, rdr.pos) + }) } else { - bump(rdr); + None } } + } else { None }; - // restart whitespace munch. - if res.is_some() { res } else { consume_whitespace_and_comments(rdr) } + // restart whitespace munch. + if res.is_some() { res } else { consume_whitespace_and_comments(rdr) } } fn scan_exponent(rdr: @mut StringReader, start_bpos: BytePos) -> Option<~str> { @@ -1056,4 +1056,12 @@ mod test { assert!(!is_line_non_doc_comment("/// blah")); assert!(is_line_non_doc_comment("////")); } + + #[test] fn nested_block_comments() { + let env = setup(@"/* /* */ */'a'"); + let TokenAndSpan {tok, sp: _} = + env.string_reader.next_token(); + assert_eq!(tok,token::LIT_CHAR('a' as u32)); + } + } diff --git a/src/test/compile-fail/no-comment-balancing.rs b/src/test/run-pass/nested-block-comment.rs similarity index 53% rename from src/test/compile-fail/no-comment-balancing.rs rename to src/test/run-pass/nested-block-comment.rs index 5911bb1481184..6527a7e4996bd 100644 --- a/src/test/compile-fail/no-comment-balancing.rs +++ b/src/test/run-pass/nested-block-comment.rs @@ -8,17 +8,10 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// error-pattern: - -/* This is a test to ensure that we do _not_ support nested/balanced comments. I know you might be - thinking "but nested comments are cool", and that would be a valid point, but they are also a - thing that would make our lexical syntax non-regular, and we do not want that to be true. - - omitting-things at a higher level (tokens) should be done via token-trees / macros, - not comments. +/* This test checks that nested comments are supported /* - fail here + This should not fail */ */