diff options
| author | Kang Seonghoon <public+git@mearie.org> | 2013-02-13 11:37:07 +0900 |
|---|---|---|
| committer | Kang Seonghoon <public+git@mearie.org> | 2013-02-13 11:39:13 +0900 |
| commit | 6d98ca94ccab88be224eb2703fb496c2d003a562 (patch) | |
| tree | 0dd09a705cd6800d979e159df4372e777efa34da /src/libsyntax/parse/lexer.rs | |
| parent | 1a394e57f7a622e67c13eae8bc26848eea31334a (diff) | |
| download | rust-6d98ca94ccab88be224eb2703fb496c2d003a562.tar.gz rust-6d98ca94ccab88be224eb2703fb496c2d003a562.zip | |
libsyntax: don't parse ////, /***/ as doc comments
Diffstat (limited to 'src/libsyntax/parse/lexer.rs')
| -rw-r--r-- | src/libsyntax/parse/lexer.rs | 37 |
1 files changed, 26 insertions, 11 deletions
diff --git a/src/libsyntax/parse/lexer.rs b/src/libsyntax/parse/lexer.rs index e8afd0b96a2..4392acdf75e 100644 --- a/src/libsyntax/parse/lexer.rs +++ b/src/libsyntax/parse/lexer.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. // @@ -253,6 +253,10 @@ fn consume_whitespace_and_comments(rdr: @mut StringReader) return consume_any_line_comment(rdr); } +pub pure fn is_line_non_doc_comment(s: &str) -> bool { + s.trim_right().all(|ch| ch == '/') +} + // PRECONDITION: rdr.curr is not whitespace // EFFECT: eats any kind of comment. // returns a Some(sugared-doc-attr) if one exists, None otherwise @@ -271,15 +275,18 @@ fn consume_any_line_comment(rdr: @mut StringReader) str::push_char(&mut acc, rdr.curr); bump(rdr); } - return Some(TokenAndSpan{ - tok: token::DOC_COMMENT(rdr.interner.intern(@acc)), - sp: codemap::mk_sp(start_bpos, rdr.pos) - }); + // but comments with only "/"s are not + if !is_line_non_doc_comment(acc) { + return Some(TokenAndSpan{ + tok: token::DOC_COMMENT(rdr.interner.intern(@acc)), + sp: codemap::mk_sp(start_bpos, rdr.pos) + }); + } } else { while rdr.curr != '\n' && !is_eof(rdr) { bump(rdr); } - // Restart whitespace munch. - return consume_whitespace_and_comments(rdr); } + // Restart whitespace munch. + return consume_whitespace_and_comments(rdr); } '*' => { bump(rdr); bump(rdr); return consume_block_comment(rdr); } _ => () @@ -298,6 +305,11 @@ fn consume_any_line_comment(rdr: @mut StringReader) return None; } +pub pure fn is_block_non_doc_comment(s: &str) -> bool { + assert s.len() >= 1u; + str::all_between(s, 1u, s.len() - 1u, |ch| ch == '*') +} + // might return a sugared-doc-attr fn consume_block_comment(rdr: @mut StringReader) -> Option<TokenAndSpan> { @@ -315,10 +327,13 @@ fn consume_block_comment(rdr: @mut StringReader) acc += ~"*/"; bump(rdr); bump(rdr); - return Some(TokenAndSpan{ - tok: token::DOC_COMMENT(rdr.interner.intern(@acc)), - sp: codemap::mk_sp(start_bpos, rdr.pos) - }); + // but comments with only "*"s between two "/"s are not + if !is_block_non_doc_comment(acc) { + return Some(TokenAndSpan{ + tok: token::DOC_COMMENT(rdr.interner.intern(@acc)), + sp: codemap::mk_sp(start_bpos, rdr.pos) + }); + } } } else { loop { |
