summary refs log tree commit diff
path: root/src/libsyntax/parse/lexer.rs
diff options
context:
space:
mode:
authorKang Seonghoon <public+git@mearie.org>2013-02-13 11:37:07 +0900
committerKang Seonghoon <public+git@mearie.org>2013-02-13 11:39:13 +0900
commit6d98ca94ccab88be224eb2703fb496c2d003a562 (patch)
tree0dd09a705cd6800d979e159df4372e777efa34da /src/libsyntax/parse/lexer.rs
parent1a394e57f7a622e67c13eae8bc26848eea31334a (diff)
downloadrust-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.rs37
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 {