Navigation Menu

Skip to content

Commit

Permalink
Use different numbers of #s when expanding documentation comments
Browse files Browse the repository at this point in the history
Any documentation comments that contain raw-string-looking sequences may
pretty-print invalid code when expanding them, as the current logic
always uses the `r"literal"` form, without appending any `#`s.

This commit calculates the minimum number of `#`s required to wrap a
comment correctly and appends `#`s appropriately.

Fixes #27489.
  • Loading branch information
barosl committed Jan 18, 2016
1 parent 0888649 commit 1a8cdc0
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 1 deletion.
3 changes: 3 additions & 0 deletions src/libstd/macros.rs
Expand Up @@ -365,6 +365,9 @@ pub mod builtin {
/// stringification of all the tokens passed to the macro. No restrictions
/// are placed on the syntax of the macro invocation itself.
///
/// Note that the expanded results of the input tokens may change in the
/// future. You should be careful if you rely on the output.
///
/// # Examples
///
/// ```
Expand Down
16 changes: 15 additions & 1 deletion src/libsyntax/ast.rs
Expand Up @@ -1174,14 +1174,28 @@ impl TokenTree {
}
(&TokenTree::Token(sp, token::DocComment(name)), _) => {
let stripped = strip_doc_comment_decoration(&name.as_str());

// Searches for the occurrences of `"#*` and returns the minimum number of `#`s
// required to wrap the text.
let num_of_hashes = stripped.chars().scan(0, |cnt, x| {
*cnt = if x == '"' {
1
} else if *cnt != 0 && x == '#' {
*cnt + 1
} else {
0
};
Some(*cnt)
}).max().unwrap_or(0);

TokenTree::Delimited(sp, Rc::new(Delimited {
delim: token::Bracket,
open_span: sp,
tts: vec![TokenTree::Token(sp, token::Ident(token::str_to_ident("doc"),
token::Plain)),
TokenTree::Token(sp, token::Eq),
TokenTree::Token(sp, token::Literal(
token::StrRaw(token::intern(&stripped), 0), None))],
token::StrRaw(token::intern(&stripped), num_of_hashes), None))],
close_span: sp,
}))
}
Expand Down
39 changes: 39 additions & 0 deletions src/test/run-pass/macro-doc-raw-str-hashes.rs
@@ -0,0 +1,39 @@
// Copyright 2015 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// The number of `#`s used to wrap the documentation comment should differ regarding the content.
//
// Related issue: #27489

macro_rules! homura {
($x:expr, #[$y:meta]) => (assert_eq!($x, stringify!($y)))
}

fn main() {
homura! {
r#"doc = r" Madoka""#,
/// Madoka
};

homura! {
r##"doc = r#" One quote mark: ["]"#"##,
/// One quote mark: ["]
};

homura! {
r##"doc = r#" Two quote marks: [""]"#"##,
/// Two quote marks: [""]
};

homura! {
r#####"doc = r####" Raw string ending sequences: ["###]"####"#####,
/// Raw string ending sequences: ["###]
};
}

0 comments on commit 1a8cdc0

Please sign in to comment.