Skip to content

Commit 6d98ca9

Browse files
committed
libsyntax: don't parse ////, /***/ as doc comments
1 parent 1a394e5 commit 6d98ca9

File tree

3 files changed

+88
-44
lines changed

3 files changed

+88
-44
lines changed

Diff for: src/libsyntax/parse/comments.rs

+38-28
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
1+
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
22
// file at the top-level directory of this distribution and at
33
// http://rust-lang.org/COPYRIGHT.
44
//
@@ -15,6 +15,7 @@ use codemap::{BytePos, CharPos, CodeMap, FileMap, Pos};
1515
use diagnostic;
1616
use parse::lexer::{is_whitespace, get_str_from, reader};
1717
use parse::lexer::{StringReader, bump, is_eof, nextch, TokenAndSpan};
18+
use parse::lexer::{is_line_non_doc_comment, is_block_non_doc_comment};
1819
use parse::lexer;
1920
use parse::token;
2021
use parse;
@@ -46,9 +47,9 @@ impl cmnt_style : cmp::Eq {
4647
pub type cmnt = {style: cmnt_style, lines: ~[~str], pos: BytePos};
4748

4849
pub fn is_doc_comment(s: ~str) -> bool {
49-
s.starts_with(~"///") ||
50+
(s.starts_with(~"///") && !is_line_non_doc_comment(s)) ||
5051
s.starts_with(~"//!") ||
51-
s.starts_with(~"/**") ||
52+
(s.starts_with(~"/**") && !is_block_non_doc_comment(s)) ||
5253
s.starts_with(~"/*!")
5354
}
5455
@@ -231,47 +232,56 @@ fn read_block_comment(rdr: @mut StringReader,
231232
bump(rdr);
232233
bump(rdr);
233234
235+
let mut curr_line = ~"/*";
236+
234237
// doc-comments are not really comments, they are attributes
235238
if rdr.curr == '*' || rdr.curr == '!' {
236239
while !(rdr.curr == '*' && nextch(rdr) == '/') && !is_eof(rdr) {
240+
str::push_char(&mut curr_line, rdr.curr);
237241
bump(rdr);
238242
}
239243
if !is_eof(rdr) {
244+
curr_line += ~"*/";
240245
bump(rdr);
241246
bump(rdr);
242247
}
243-
return;
244-
}
245-
246-
let mut curr_line = ~"/*";
247-
let mut level: int = 1;
248-
while level > 0 {
249-
debug!("=== block comment level %d", level);
250-
if is_eof(rdr) {(rdr as reader).fatal(~"unterminated block comment");}
251-
if rdr.curr == '\n' {
252-
trim_whitespace_prefix_and_push_line(&mut lines, curr_line, col);
253-
curr_line = ~"";
254-
bump(rdr);
255-
} else {
256-
str::push_char(&mut curr_line, rdr.curr);
257-
if rdr.curr == '/' && nextch(rdr) == '*' {
258-
bump(rdr);
248+
if !is_block_non_doc_comment(curr_line) { return; }
249+
assert !curr_line.contains_char('\n');
250+
lines.push(curr_line);
251+
} else {
252+
let mut level: int = 1;
253+
while level > 0 {
254+
debug!("=== block comment level %d", level);
255+
if is_eof(rdr) {
256+
(rdr as reader).fatal(~"unterminated block comment");
257+
}
258+
if rdr.curr == '\n' {
259+
trim_whitespace_prefix_and_push_line(&mut lines, curr_line,
260+
col);
261+
curr_line = ~"";
259262
bump(rdr);
260-
curr_line += ~"*";
261-
level += 1;
262263
} else {
263-
if rdr.curr == '*' && nextch(rdr) == '/' {
264+
str::push_char(&mut curr_line, rdr.curr);
265+
if rdr.curr == '/' && nextch(rdr) == '*' {
264266
bump(rdr);
265267
bump(rdr);
266-
curr_line += ~"/";
267-
level -= 1;
268-
} else { bump(rdr); }
268+
curr_line += ~"*";
269+
level += 1;
270+
} else {
271+
if rdr.curr == '*' && nextch(rdr) == '/' {
272+
bump(rdr);
273+
bump(rdr);
274+
curr_line += ~"/";
275+
level -= 1;
276+
} else { bump(rdr); }
277+
}
269278
}
270279
}
280+
if str::len(curr_line) != 0 {
281+
trim_whitespace_prefix_and_push_line(&mut lines, curr_line, col);
282+
}
271283
}
272-
if str::len(curr_line) != 0 {
273-
trim_whitespace_prefix_and_push_line(&mut lines, curr_line, col);
274-
}
284+
275285
let mut style = if code_to_the_left { trailing } else { isolated };
276286
consume_non_eol_whitespace(rdr);
277287
if !is_eof(rdr) && rdr.curr != '\n' && vec::len(lines) == 1u {

Diff for: src/libsyntax/parse/lexer.rs

+26-11
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
1+
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
22
// file at the top-level directory of this distribution and at
33
// http://rust-lang.org/COPYRIGHT.
44
//
@@ -253,6 +253,10 @@ fn consume_whitespace_and_comments(rdr: @mut StringReader)
253253
return consume_any_line_comment(rdr);
254254
}
255255

256+
pub pure fn is_line_non_doc_comment(s: &str) -> bool {
257+
s.trim_right().all(|ch| ch == '/')
258+
}
259+
256260
// PRECONDITION: rdr.curr is not whitespace
257261
// EFFECT: eats any kind of comment.
258262
// returns a Some(sugared-doc-attr) if one exists, None otherwise
@@ -271,15 +275,18 @@ fn consume_any_line_comment(rdr: @mut StringReader)
271275
str::push_char(&mut acc, rdr.curr);
272276
bump(rdr);
273277
}
274-
return Some(TokenAndSpan{
275-
tok: token::DOC_COMMENT(rdr.interner.intern(@acc)),
276-
sp: codemap::mk_sp(start_bpos, rdr.pos)
277-
});
278+
// but comments with only "/"s are not
279+
if !is_line_non_doc_comment(acc) {
280+
return Some(TokenAndSpan{
281+
tok: token::DOC_COMMENT(rdr.interner.intern(@acc)),
282+
sp: codemap::mk_sp(start_bpos, rdr.pos)
283+
});
284+
}
278285
} else {
279286
while rdr.curr != '\n' && !is_eof(rdr) { bump(rdr); }
280-
// Restart whitespace munch.
281-
return consume_whitespace_and_comments(rdr);
282287
}
288+
// Restart whitespace munch.
289+
return consume_whitespace_and_comments(rdr);
283290
}
284291
'*' => { bump(rdr); bump(rdr); return consume_block_comment(rdr); }
285292
_ => ()
@@ -298,6 +305,11 @@ fn consume_any_line_comment(rdr: @mut StringReader)
298305
return None;
299306
}
300307

308+
pub pure fn is_block_non_doc_comment(s: &str) -> bool {
309+
assert s.len() >= 1u;
310+
str::all_between(s, 1u, s.len() - 1u, |ch| ch == '*')
311+
}
312+
301313
// might return a sugared-doc-attr
302314
fn consume_block_comment(rdr: @mut StringReader)
303315
-> Option<TokenAndSpan> {
@@ -315,10 +327,13 @@ fn consume_block_comment(rdr: @mut StringReader)
315327
acc += ~"*/";
316328
bump(rdr);
317329
bump(rdr);
318-
return Some(TokenAndSpan{
319-
tok: token::DOC_COMMENT(rdr.interner.intern(@acc)),
320-
sp: codemap::mk_sp(start_bpos, rdr.pos)
321-
});
330+
// but comments with only "*"s between two "/"s are not
331+
if !is_block_non_doc_comment(acc) {
332+
return Some(TokenAndSpan{
333+
tok: token::DOC_COMMENT(rdr.interner.intern(@acc)),
334+
sp: codemap::mk_sp(start_bpos, rdr.pos)
335+
});
336+
}
322337
}
323338
} else {
324339
loop {

Diff for: src/test/pretty/doc-comments.rs

+24-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
1+
// Copyright 2012-2013 The Rust Project Developers. See the COPYRIGHT
22
// file at the top-level directory of this distribution and at
33
// http://rust-lang.org/COPYRIGHT.
44
//
@@ -19,24 +19,43 @@ fn b() {
1919
//! some single line inner-docs
2020
}
2121

22+
//////////////////////////////////
23+
// some single-line non-doc comment preceded by a separator
24+
25+
//////////////////////////////////
26+
/// some single-line outer-docs preceded by a separator
27+
/// (and trailing whitespaces)
28+
fn c() { }
29+
2230
/*
2331
* some multi-line non-doc comment
2432
*/
2533

2634
/**
2735
* some multi-line outer-docs
2836
*/
29-
fn c() { }
37+
fn d() { }
3038

31-
fn d() {
39+
fn e() {
3240
/*!
3341
* some multi-line inner-docs
3442
*/
3543
}
3644

45+
/********************************/
46+
/*
47+
* some multi-line non-doc comment preceded by a separator
48+
*/
49+
50+
/********************************/
51+
/**
52+
* some multi-line outer-docs preceded by a separator
53+
*/
54+
fn f() { }
55+
3756
#[doc = "unsugared outer doc-comments work also"]
38-
fn e() { }
57+
fn g() { }
3958

40-
fn f() {
59+
fn h() {
4160
#[doc = "as do inner ones"];
4261
}

0 commit comments

Comments
 (0)