Skip to content

Commit

Permalink
add token::LIT_STR_RAW(ident, num of # symbols)
Browse files Browse the repository at this point in the history
Treat it as a synonym for LIT_STR for now.
  • Loading branch information
ben0x539 committed Oct 7, 2013
1 parent 18099fe commit 9787872
Show file tree
Hide file tree
Showing 5 changed files with 23 additions and 5 deletions.
3 changes: 2 additions & 1 deletion src/libsyntax/ext/base.rs
Expand Up @@ -437,7 +437,8 @@ pub fn get_single_str_from_tts(cx: @ExtCtxt,
}

match tts[0] {
ast::tt_tok(_, token::LIT_STR(ident)) => cx.str_of(ident),
ast::tt_tok(_, token::LIT_STR(ident))
| ast::tt_tok(_, token::LIT_STR_RAW(ident, _)) => cx.str_of(ident),
_ => cx.span_fatal(sp, format!("{} requires a string.", name)),
}
}
Expand Down
7 changes: 7 additions & 0 deletions src/libsyntax/ext/quote.rs
Expand Up @@ -464,6 +464,13 @@ fn mk_token(cx: @ExtCtxt, sp: Span, tok: &token::Token) -> @ast::Expr {
~[mk_ident(cx, sp, ident)]);
}

LIT_STR_RAW(ident, n) => {
return cx.expr_call_ident(sp,
id_ext("LIT_STR_RAW"),
~[mk_ident(cx, sp, ident),
cx.expr_uint(sp, n)]);
}

IDENT(ident, b) => {
return cx.expr_call_ident(sp,
id_ext("IDENT"),
Expand Down
4 changes: 2 additions & 2 deletions src/libsyntax/parse/lexer.rs
Expand Up @@ -883,7 +883,7 @@ fn next_token_inner(rdr: @mut StringReader) -> token::Token {
content_start_bpos,
content_end_bpos,
str_to_ident);
return token::LIT_STR(str_content);
return token::LIT_STR_RAW(str_content, hash_count);
}
'-' => {
if nextch(rdr) == '>' {
Expand Down Expand Up @@ -1048,7 +1048,7 @@ mod test {
let TokenAndSpan {tok, sp: _} =
env.string_reader.next_token();
let id = token::str_to_ident("\"#a\\b\x00c\"");
assert_eq!(tok, token::LIT_STR(id));
assert_eq!(tok, token::LIT_STR_RAW(id, 3));
}

#[test] fn line_doc_comments() {
Expand Down
7 changes: 5 additions & 2 deletions src/libsyntax/parse/parser.rs
Expand Up @@ -1283,6 +1283,7 @@ impl Parser {
token::LIT_FLOAT_UNSUFFIXED(s) =>
lit_float_unsuffixed(self.id_to_str(s)),
token::LIT_STR(s) => lit_str(self.id_to_str(s)),
token::LIT_STR_RAW(s, _) => lit_str(self.id_to_str(s)),
token::LPAREN => { self.expect(&token::RPAREN); lit_nil },
_ => { self.unexpected_last(tok); }
}
Expand Down Expand Up @@ -4345,7 +4346,8 @@ impl Parser {
// parse a string as an ABI spec on an extern type or module
fn parse_opt_abis(&self) -> Option<AbiSet> {
match *self.token {
token::LIT_STR(s) => {
token::LIT_STR(s)
| token::LIT_STR_RAW(s, _) => {
self.bump();
let the_string = ident_to_str(&s);
let mut abis = AbiSet::empty();
Expand Down Expand Up @@ -4932,7 +4934,8 @@ impl Parser {

pub fn parse_optional_str(&self) -> Option<@str> {
match *self.token {
token::LIT_STR(s) => {
token::LIT_STR(s)
| token::LIT_STR_RAW(s, _) => {
self.bump();
Some(ident_to_str(&s))
}
Expand Down
7 changes: 7 additions & 0 deletions src/libsyntax/parse/token.rs
Expand Up @@ -79,6 +79,7 @@ pub enum Token {
LIT_FLOAT(ast::Ident, ast::float_ty),
LIT_FLOAT_UNSUFFIXED(ast::Ident),
LIT_STR(ast::Ident),
LIT_STR_RAW(ast::Ident, uint), /* raw str delimited by n hash symbols */

/* Name components */
// an identifier contains an "is_mod_name" boolean,
Expand Down Expand Up @@ -194,6 +195,10 @@ pub fn to_str(input: @ident_interner, t: &Token) -> ~str {
body
}
LIT_STR(ref s) => { format!("\"{}\"", ident_to_str(s).escape_default()) }
LIT_STR_RAW(ref s, n) => {
format!("r{delim}\"{string}\"{delim}",
delim="#".repeat(n), string=ident_to_str(s))
}

/* Name components */
IDENT(s, _) => input.get(s.name).to_owned(),
Expand Down Expand Up @@ -243,6 +248,7 @@ pub fn can_begin_expr(t: &Token) -> bool {
LIT_FLOAT(_, _) => true,
LIT_FLOAT_UNSUFFIXED(_) => true,
LIT_STR(_) => true,
LIT_STR_RAW(_, _) => true,
POUND => true,
AT => true,
NOT => true,
Expand Down Expand Up @@ -284,6 +290,7 @@ pub fn is_lit(t: &Token) -> bool {
LIT_FLOAT(_, _) => true,
LIT_FLOAT_UNSUFFIXED(_) => true,
LIT_STR(_) => true,
LIT_STR_RAW(_, _) => true,
_ => false
}
}
Expand Down

0 comments on commit 9787872

Please sign in to comment.