diff options
| author | bors <bors@rust-lang.org> | 2014-11-03 21:07:45 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-11-03 21:07:45 +0000 |
| commit | b11b706545ec986b0416a14383170c60004644a5 (patch) | |
| tree | dca9b3f476907c8c6addc7ec1afb01c789c6d330 /src/libsyntax | |
| parent | 01b81c0ebb45d36198fa8a78dcdcb8144e4bb06c (diff) | |
| parent | dce0be03d94360d100825c134892e78c39858ef8 (diff) | |
auto merge of #18575 : alexcrichton/rust/rollup, r=alexcrichton
Diffstat (limited to 'src/libsyntax')
| -rw-r--r-- | src/libsyntax/ext/base.rs | 27 | ||||
| -rw-r--r-- | src/libsyntax/ext/format.rs | 37 | ||||
| -rw-r--r-- | src/libsyntax/ext/mtwt.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/ext/source_util.rs | 35 | ||||
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 2 |
5 files changed, 62 insertions, 41 deletions
diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index e641abbfeee..152b89b86e7 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -675,26 +675,23 @@ pub fn check_zero_tts(cx: &ExtCtxt, /// Extract the string literal from the first token of `tts`. If this /// is not a string literal, emit an error and return None. -pub fn get_single_str_from_tts(cx: &ExtCtxt, +pub fn get_single_str_from_tts(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree], name: &str) -> Option<String> { - if tts.len() != 1 { - cx.span_err(sp, format!("{} takes 1 argument.", name).as_slice()); - } else { - match tts[0] { - ast::TtToken(_, token::LitStr(ident)) => return Some(parse::str_lit(ident.as_str())), - ast::TtToken(_, token::LitStrRaw(ident, _)) => { - return Some(parse::raw_str_lit(ident.as_str())) - } - _ => { - cx.span_err(sp, - format!("{} requires a string.", name).as_slice()) - } - } + let mut p = cx.new_parser_from_tts(tts); + if p.token == token::Eof { + cx.span_err(sp, format!("{} takes 1 argument", name).as_slice()); + return None } - None + let ret = cx.expander().fold_expr(p.parse_expr()); + if p.token != token::Eof { + cx.span_err(sp, format!("{} takes 1 argument", name).as_slice()); + } + expr_to_string(cx, ret, "argument must be a string literal").map(|(s, _)| { + s.get().to_string() + }) } /// Extract comma-separated expressions from `tts`. If there is a diff --git a/src/libsyntax/ext/format.rs b/src/libsyntax/ext/format.rs index 53d091db095..486ce910e2b 100644 --- a/src/libsyntax/ext/format.rs +++ b/src/libsyntax/ext/format.rs @@ -663,28 +663,28 @@ impl<'a, 'b> Context<'a, 'b> { fn format_arg(ecx: &ExtCtxt, sp: Span, ty: &ArgumentType, arg: P<ast::Expr>) -> P<ast::Expr> { - let (krate, fmt_fn) = match *ty { + let trait_ = match *ty { Known(ref tyname) => { match tyname.as_slice() { - "" => ("std", "secret_show"), - "b" => ("std", "secret_bool"), - "c" => ("std", "secret_char"), - "d" | "i" => ("std", "secret_signed"), - "e" => ("std", "secret_lower_exp"), - "E" => ("std", "secret_upper_exp"), - "f" => ("std", "secret_float"), - "o" => ("std", "secret_octal"), - "p" => ("std", "secret_pointer"), - "s" => ("std", "secret_string"), - "t" => ("std", "secret_binary"), - "u" => ("std", "secret_unsigned"), - "x" => ("std", "secret_lower_hex"), - "X" => ("std", "secret_upper_hex"), + "" => "Show", + "b" => "Bool", + "c" => "Char", + "d" | "i" => "Signed", + "e" => "LowerExp", + "E" => "UpperExp", + "f" => "Float", + "o" => "Octal", + "p" => "Pointer", + "s" => "String", + "t" => "Binary", + "u" => "Unsigned", + "x" => "LowerHex", + "X" => "UpperHex", _ => { ecx.span_err(sp, format!("unknown format trait `{}`", *tyname).as_slice()); - ("std", "dummy") + "Dummy" } } } @@ -697,9 +697,10 @@ impl<'a, 'b> Context<'a, 'b> { }; let format_fn = ecx.path_global(sp, vec![ - ecx.ident_of(krate), + ecx.ident_of("std"), ecx.ident_of("fmt"), - ecx.ident_of(fmt_fn)]); + ecx.ident_of(trait_), + ecx.ident_of("fmt")]); ecx.expr_call_global(sp, vec![ ecx.ident_of("std"), ecx.ident_of("fmt"), diff --git a/src/libsyntax/ext/mtwt.rs b/src/libsyntax/ext/mtwt.rs index 840468176ab..bebe16286c9 100644 --- a/src/libsyntax/ext/mtwt.rs +++ b/src/libsyntax/ext/mtwt.rs @@ -20,7 +20,7 @@ use ast::{Ident, Mrk, Name, SyntaxContext}; use std::cell::RefCell; use std::rc::Rc; use std::collections::HashMap; -use std::collections::hashmap::{Occupied, Vacant}; +use std::collections::hash_map::{Occupied, Vacant}; /// The SCTable contains a table of SyntaxContext_'s. It /// represents a flattened tree structure, to avoid having diff --git a/src/libsyntax/ext/source_util.rs b/src/libsyntax/ext/source_util.rs index 41967b0680c..f1923084409 100644 --- a/src/libsyntax/ext/source_util.rs +++ b/src/libsyntax/ext/source_util.rs @@ -9,14 +9,16 @@ // except according to those terms. use ast; -use codemap; use codemap::{Pos, Span}; +use codemap; use ext::base::*; use ext::base; use ext::build::AstBuilder; -use parse; use parse::token; +use parse; use print::pprust; +use ptr::P; +use util::small_vector::SmallVector; use std::io::File; use std::rc::Rc; @@ -82,14 +84,14 @@ pub fn expand_mod(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) /// include! : parse the given file as an expr /// This is generally a bad idea because it's going to behave /// unhygienically. -pub fn expand_include(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) - -> Box<base::MacResult+'static> { +pub fn expand_include<'cx>(cx: &'cx mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) + -> Box<base::MacResult+'cx> { let file = match get_single_str_from_tts(cx, sp, tts, "include!") { Some(f) => f, None => return DummyResult::expr(sp), }; // The file will be added to the code map by the parser - let mut p = + let p = parse::new_sub_parser_from_file(cx.parse_sess(), cx.cfg(), &res_rel_file(cx, @@ -98,7 +100,28 @@ pub fn expand_include(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) true, None, sp); - base::MacExpr::new(p.parse_expr()) + + struct ExpandResult<'a> { + p: parse::parser::Parser<'a>, + } + impl<'a> base::MacResult for ExpandResult<'a> { + fn make_expr(mut self: Box<ExpandResult<'a>>) -> Option<P<ast::Expr>> { + Some(self.p.parse_expr()) + } + fn make_items(mut self: Box<ExpandResult<'a>>) + -> Option<SmallVector<P<ast::Item>>> { + let mut ret = SmallVector::zero(); + loop { + match self.p.parse_item_with_outer_attributes() { + Some(item) => ret.push(item), + None => break + } + } + Some(ret) + } + } + + box ExpandResult { p: p } } // include_str! : read the given file, insert it as a literal string expr diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index c1877c827a4..54eaa308658 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -57,7 +57,7 @@ static KNOWN_FEATURES: &'static [(&'static str, Status)] = &[ ("default_type_params", Active), ("quote", Active), ("linkage", Active), - ("struct_inherit", Active), + ("struct_inherit", Removed), ("overloaded_calls", Active), ("unboxed_closure_sugar", Active), |
