diff options
Diffstat (limited to 'src/libsyntax/ext')
| -rw-r--r-- | src/libsyntax/ext/base.rs | 2 | ||||
| -rw-r--r-- | src/libsyntax/ext/build.rs | 5 | ||||
| -rw-r--r-- | src/libsyntax/ext/deriving/encodable.rs | 4 | ||||
| -rw-r--r-- | src/libsyntax/ext/deriving/ty.rs | 5 | ||||
| -rw-r--r-- | src/libsyntax/ext/expand.rs | 140 | ||||
| -rw-r--r-- | src/libsyntax/ext/trace_macros.rs | 5 | ||||
| -rw-r--r-- | src/libsyntax/ext/tt/macro_parser.rs | 20 | ||||
| -rw-r--r-- | src/libsyntax/ext/tt/macro_rules.rs | 14 | ||||
| -rw-r--r-- | src/libsyntax/ext/tt/transcribe.rs | 10 |
9 files changed, 49 insertions, 156 deletions
diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index 08098b71ce4..800eda64d51 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -105,7 +105,7 @@ pub trait AnyMacro { pub enum MacResult { MRExpr(@ast::Expr), MRItem(@ast::Item), - MRAny(@AnyMacro), + MRAny(~AnyMacro:), MRDef(MacroDef), } impl MacResult { diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index c5ee1948466..e41decbd8ef 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -56,7 +56,6 @@ pub trait AstBuilder { lifetime: Option<ast::Lifetime>, mutbl: ast::Mutability) -> P<ast::Ty>; fn ty_uniq(&self, span: Span, ty: P<ast::Ty>) -> P<ast::Ty>; - fn ty_box(&self, span: Span, ty: P<ast::Ty>) -> P<ast::Ty>; fn ty_option(&self, ty: P<ast::Ty>) -> P<ast::Ty>; fn ty_infer(&self, sp: Span) -> P<ast::Ty>; @@ -329,10 +328,6 @@ impl<'a> AstBuilder for ExtCtxt<'a> { self.ty(span, ast::TyUniq(ty)) } - fn ty_box(&self, span: Span, ty: P<ast::Ty>) -> P<ast::Ty> { - self.ty(span, ast::TyBox(ty)) - } - fn ty_option(&self, ty: P<ast::Ty>) -> P<ast::Ty> { self.ty_path( self.path_all(DUMMY_SP, diff --git a/src/libsyntax/ext/deriving/encodable.rs b/src/libsyntax/ext/deriving/encodable.rs index 66b744ecbcb..a44e4af5b6b 100644 --- a/src/libsyntax/ext/deriving/encodable.rs +++ b/src/libsyntax/ext/deriving/encodable.rs @@ -75,7 +75,7 @@ would yield functions like: } */ -use ast::{MetaItem, Item, Expr, MutImmutable, MutMutable}; +use ast::{MetaItem, Item, Expr, MutMutable}; use codemap::Span; use ext::base::ExtCtxt; use ext::build::AstBuilder; @@ -100,7 +100,7 @@ pub fn expand_deriving_encodable(cx: &ExtCtxt, MethodDef { name: "encode", generics: LifetimeBounds::empty(), - explicit_self: Some(Some(Borrowed(None, MutImmutable))), + explicit_self: borrowed_explicit_self(), args: ~[Ptr(~Literal(Path::new_local("__E")), Borrowed(None, MutMutable))], ret_ty: nil_ty(), diff --git a/src/libsyntax/ext/deriving/ty.rs b/src/libsyntax/ext/deriving/ty.rs index 893a1c68426..f37abbe1ef4 100644 --- a/src/libsyntax/ext/deriving/ty.rs +++ b/src/libsyntax/ext/deriving/ty.rs @@ -24,7 +24,6 @@ use opt_vec::OptVec; /// The types of pointers pub enum PtrTy<'a> { Send, // ~ - Managed, // @ Borrowed(Option<&'a str>, ast::Mutability), // &['lifetime] [mut] } @@ -138,9 +137,6 @@ impl<'a> Ty<'a> { Send => { cx.ty_uniq(span, raw_ty) } - Managed => { - cx.ty_box(span, raw_ty) - } Borrowed(ref lt, mutbl) => { let lt = mk_lifetime(cx, span, lt); cx.ty_rptr(span, raw_ty, lt, mutbl) @@ -251,7 +247,6 @@ pub fn get_explicit_self(cx: &ExtCtxt, span: Span, self_ptr: &Option<PtrTy>) span, match *ptr { Send => ast::SelfUniq, - Managed => ast::SelfBox, Borrowed(ref lt, mutbl) => { let lt = lt.map(|s| cx.lifetime(span, cx.ident_of(s))); ast::SelfRegion(lt, mutbl) diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 76aa0e981bd..5dc16b9b6b6 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -use ast::{P, Block, Crate, DeclLocal, ExprMac, SyntaxContext}; +use ast::{P, Block, Crate, DeclLocal, ExprMac}; use ast::{Local, Ident, MacInvocTT}; use ast::{ItemMac, Mrk, Stmt, StmtDecl, StmtMac, StmtExpr, StmtSemi}; use ast::{TokenTree}; @@ -134,7 +134,7 @@ pub fn expand_expr(e: @ast::Expr, fld: &mut MacroExpander) -> @ast::Expr { // Desugar expr_for_loop // From: `['<ident>:] for <src_pat> in <src_expr> <src_loop_block>` - // FIXME #6993 : change type of opt_ident to Option<Name> + // FIXME #6993: change type of opt_ident to Option<Name> ast::ExprForLoop(src_pat, src_expr, src_loop_block, opt_ident) => { // Expand any interior macros etc. // NB: we don't fold pats yet. Curious. @@ -818,59 +818,16 @@ pub fn expand_crate(parse_sess: @parse::ParseSess, // element that has one. a CtxtFn is a trait-ified // version of a closure in (SyntaxContext -> SyntaxContext). // the ones defined here include: -// Renamer - add a rename to a context -// MultiRenamer - add a set of renames to a context // Marker - add a mark to a context -// Repainter - replace a context (maybe Replacer would be a better name?) -// a function in SyntaxContext -> SyntaxContext -pub trait CtxtFn{ - fn f(&self, ast::SyntaxContext) -> ast::SyntaxContext; -} - -// a renamer adds a rename to the syntax context -pub struct Renamer { - from : ast::Ident, - to : ast::Name -} +// A Marker adds the given mark to the syntax context +struct Marker { mark: Mrk } -impl CtxtFn for Renamer { - fn f(&self, ctxt : ast::SyntaxContext) -> ast::SyntaxContext { - new_rename(self.from,self.to,ctxt) - } -} - -// a marker adds the given mark to the syntax context -pub struct Marker { mark : Mrk } - -impl CtxtFn for Marker { - fn f(&self, ctxt : ast::SyntaxContext) -> ast::SyntaxContext { - new_mark(self.mark,ctxt) - } -} - -// a repainter just replaces the given context with the one it's closed over -pub struct Repainter { ctxt : SyntaxContext } - -impl CtxtFn for Repainter { - fn f(&self, _ctxt : ast::SyntaxContext) -> ast::SyntaxContext { - self.ctxt - } -} - -pub struct ContextWrapper { - context_function: @CtxtFn, -} - -impl Folder for ContextWrapper { +impl Folder for Marker { fn fold_ident(&mut self, id: ast::Ident) -> ast::Ident { - let ast::Ident { - name, - ctxt - } = id; ast::Ident { - name: name, - ctxt: self.context_function.f(ctxt), + name: id.name, + ctxt: new_mark(self.mark, id.ctxt) } } fn fold_mac(&mut self, m: &ast::Mac) -> ast::Mac { @@ -878,7 +835,7 @@ impl Folder for ContextWrapper { MacInvocTT(ref path, ref tts, ctxt) => { MacInvocTT(self.fold_path(path), fold_tts(*tts, self), - self.context_function.f(ctxt)) + new_mark(self.mark, ctxt)) } }; Spanned { @@ -888,50 +845,32 @@ impl Folder for ContextWrapper { } } -// given a function from ctxts to ctxts, produce -// a Folder that applies that function to all ctxts: -pub fn fun_to_ctxt_folder<T : 'static + CtxtFn>(cf: @T) -> ContextWrapper { - ContextWrapper { - context_function: cf as @CtxtFn, - } -} - // just a convenience: -pub fn new_mark_folder(m: Mrk) -> ContextWrapper { - fun_to_ctxt_folder(@Marker{mark:m}) -} - -pub fn new_rename_folder(from: ast::Ident, to: ast::Name) -> ContextWrapper { - fun_to_ctxt_folder(@Renamer{from:from,to:to}) +fn new_mark_folder(m: Mrk) -> Marker { + Marker {mark: m} } // apply a given mark to the given token trees. Used prior to expansion of a macro. -fn mark_tts(tts : &[TokenTree], m : Mrk) -> ~[TokenTree] { +fn mark_tts(tts: &[TokenTree], m: Mrk) -> ~[TokenTree] { fold_tts(tts, &mut new_mark_folder(m)) } // apply a given mark to the given expr. Used following the expansion of a macro. -fn mark_expr(expr : @ast::Expr, m : Mrk) -> @ast::Expr { +fn mark_expr(expr: @ast::Expr, m: Mrk) -> @ast::Expr { new_mark_folder(m).fold_expr(expr) } // apply a given mark to the given stmt. Used following the expansion of a macro. -fn mark_stmt(expr : &ast::Stmt, m : Mrk) -> @ast::Stmt { +fn mark_stmt(expr: &ast::Stmt, m: Mrk) -> @ast::Stmt { new_mark_folder(m).fold_stmt(expr) .expect_one("marking a stmt didn't return a stmt") } // apply a given mark to the given item. Used following the expansion of a macro. -fn mark_item(expr : @ast::Item, m : Mrk) -> SmallVector<@ast::Item> { +fn mark_item(expr: @ast::Item, m: Mrk) -> SmallVector<@ast::Item> { new_mark_folder(m).fold_item(expr) } -// replace all contexts in a given expr with the given mark. Used -// for capturing macros -pub fn replace_ctxts(expr : @ast::Expr, ctxt : SyntaxContext) -> @ast::Expr { - fun_to_ctxt_folder(@Repainter{ctxt:ctxt}).fold_expr(expr) -} - fn original_span(cx: &ExtCtxt) -> @codemap::ExpnInfo { let mut relevant_info = cx.backtrace(); let mut einfo = relevant_info.unwrap(); @@ -1025,7 +964,7 @@ mod test { #[test] fn macros_cant_escape_fns_test () { let src = ~"fn bogus() {macro_rules! z (() => (3+4))}\ fn inty() -> int { z!() }"; - let sess = parse::new_parse_sess(None); + let sess = parse::new_parse_sess(); let crate_ast = parse::parse_crate_from_source_str( ~"<test>", src, @@ -1040,7 +979,7 @@ mod test { #[test] fn macros_cant_escape_mods_test () { let src = ~"mod foo {macro_rules! z (() => (3+4))}\ fn inty() -> int { z!() }"; - let sess = parse::new_parse_sess(None); + let sess = parse::new_parse_sess(); let crate_ast = parse::parse_crate_from_source_str( ~"<test>", src, @@ -1054,7 +993,7 @@ mod test { #[test] fn macros_can_escape_flattened_mods_test () { let src = ~"#[macro_escape] mod foo {macro_rules! z (() => (3+4))}\ fn inty() -> int { z!() }"; - let sess = parse::new_parse_sess(None); + let sess = parse::new_parse_sess(); let crate_ast = parse::parse_crate_from_source_str( ~"<test>", src, @@ -1089,41 +1028,6 @@ mod test { } } - #[test] - fn renaming () { - let item_ast = string_to_crate(~"fn f() -> int { a }"); - let a_name = intern("a"); - let a2_name = gensym("a2"); - let mut renamer = new_rename_folder(ast::Ident{name:a_name,ctxt:EMPTY_CTXT}, - a2_name); - let renamed_ast = renamer.fold_crate(item_ast.clone()); - let mut path_finder = new_path_finder(~[]); - visit::walk_crate(&mut path_finder, &renamed_ast, ()); - - match path_finder.path_accumulator { - [ast::Path{segments:[ref seg],..}] => - assert_eq!(mtwt_resolve(seg.identifier),a2_name), - _ => assert_eq!(0,1) - } - - // try a double-rename, with pending_renames. - let a3_name = gensym("a3"); - // a context that renames from ("a",empty) to "a2" : - let ctxt2 = new_rename(ast::Ident::new(a_name),a2_name,EMPTY_CTXT); - let mut pending_renames = ~[ - (ast::Ident::new(a_name),a2_name), - (ast::Ident{name:a_name,ctxt:ctxt2},a3_name) - ]; - let double_renamed = renames_to_fold(&mut pending_renames).fold_crate(item_ast); - let mut path_finder = new_path_finder(~[]); - visit::walk_crate(&mut path_finder, &double_renamed, ()); - match path_finder.path_accumulator { - [ast::Path{segments:[ref seg],..}] => - assert_eq!(mtwt_resolve(seg.identifier),a3_name), - _ => assert_eq!(0,1) - } - } - //fn fake_print_crate(crate: &ast::Crate) { // let mut out = ~std::io::stderr() as ~std::io::Writer; // let mut s = pprust::rust_printer(out, get_ident_interner()); @@ -1142,7 +1046,7 @@ mod test { // println!("expanded: {:?}\n",expanded_ast); //mtwt_resolve_crate(expanded_ast) //} - //fn expand_and_resolve_and_pretty_print (crate_str : @str) -> ~str { + //fn expand_and_resolve_and_pretty_print (crate_str: @str) -> ~str { //let resolved_ast = expand_and_resolve(crate_str); //pprust::to_str(&resolved_ast,fake_print_crate,get_ident_interner()) //} @@ -1175,12 +1079,12 @@ mod test { #[test] fn automatic_renaming () { - let tests : ~[RenamingTest] = + let tests: ~[RenamingTest] = ~[// b & c should get new names throughout, in the expr too: ("fn a() -> int { let b = 13; let c = b; b+c }", ~[~[0,1],~[2]], false), // both x's should be renamed (how is this causing a bug?) - ("fn main () {let x : int = 13;x;}", + ("fn main () {let x: int = 13;x;}", ~[~[0]], false), // the use of b after the + should be renamed, the other one not: ("macro_rules! f (($x:ident) => (b + $x)) fn a() -> int { let b = 13; f!(b)}", @@ -1300,7 +1204,7 @@ foo_module!() visit::walk_crate(&mut name_finder, &cr, ()); let bindings = name_finder.ident_accumulator; - let cxbinds : ~[&ast::Ident] = + let cxbinds: ~[&ast::Ident] = bindings.iter().filter(|b| { let string = token::get_ident(b.name); "xx" == string.get() @@ -1337,7 +1241,7 @@ foo_module!() { let table = table.table.borrow(); for (idx,val) in table.get().iter().enumerate() { - println!("{:4u} : {:?}",idx,val); + println!("{:4u}: {:?}",idx,val); } } } diff --git a/src/libsyntax/ext/trace_macros.rs b/src/libsyntax/ext/trace_macros.rs index 83c6c6a1762..4189ea6a967 100644 --- a/src/libsyntax/ext/trace_macros.rs +++ b/src/libsyntax/ext/trace_macros.rs @@ -25,8 +25,7 @@ pub fn expand_trace_macros(cx: &mut ExtCtxt, let tt_rdr = new_tt_reader(cx.parse_sess().span_diagnostic, None, tt.to_owned()); - let rdr = tt_rdr as @Reader; - let mut rust_parser = Parser(sess, cfg.clone(), rdr.dup()); + let mut rust_parser = Parser(sess, cfg.clone(), tt_rdr.dup()); if rust_parser.is_keyword(keywords::True) { cx.set_trace_macros(true); @@ -39,7 +38,7 @@ pub fn expand_trace_macros(cx: &mut ExtCtxt, rust_parser.bump(); - let mut rust_parser = Parser(sess, cfg, rdr.dup()); + let mut rust_parser = Parser(sess, cfg, tt_rdr.dup()); let result = rust_parser.parse_expr(); base::MRExpr(result) } diff --git a/src/libsyntax/ext/tt/macro_parser.rs b/src/libsyntax/ext/tt/macro_parser.rs index 6d1b8dd2358..a18f80ad4c9 100644 --- a/src/libsyntax/ext/tt/macro_parser.rs +++ b/src/libsyntax/ext/tt/macro_parser.rs @@ -202,11 +202,11 @@ pub enum ParseResult { Error(codemap::Span, ~str) } -pub fn parse_or_else(sess: @ParseSess, - cfg: ast::CrateConfig, - rdr: @Reader, - ms: ~[Matcher]) - -> HashMap<Ident, @NamedMatch> { +pub fn parse_or_else<R: Reader>(sess: @ParseSess, + cfg: ast::CrateConfig, + rdr: R, + ms: ~[Matcher]) + -> HashMap<Ident, @NamedMatch> { match parse(sess, cfg, rdr, ms) { Success(m) => m, Failure(sp, str) => sess.span_diagnostic.span_fatal(sp, str), @@ -223,11 +223,11 @@ pub fn token_name_eq(t1 : &Token, t2 : &Token) -> bool { } } -pub fn parse(sess: @ParseSess, - cfg: ast::CrateConfig, - rdr: @Reader, - ms: &[Matcher]) - -> ParseResult { +pub fn parse<R: Reader>(sess: @ParseSess, + cfg: ast::CrateConfig, + rdr: R, + ms: &[Matcher]) + -> ParseResult { let mut cur_eis = ~[]; cur_eis.push(initial_matcher_pos(ms.to_owned(), None, rdr.peek().sp.lo)); diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index c179e9959e0..e196bdccfe3 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -18,7 +18,7 @@ use ext::base; use ext::tt::macro_parser::{Success, Error, Failure}; use ext::tt::macro_parser::{NamedMatch, MatchedSeq, MatchedNonterminal}; use ext::tt::macro_parser::{parse, parse_or_else}; -use parse::lexer::{new_tt_reader, Reader}; +use parse::lexer::new_tt_reader; use parse::parser::Parser; use parse::attr::ParserAttr; use parse::token::{get_ident_interner, special_idents, gensym_ident}; @@ -129,8 +129,8 @@ fn generic_extension(cx: &ExtCtxt, for (i, lhs) in lhses.iter().enumerate() { // try each arm's matchers match **lhs { MatchedNonterminal(NtMatchers(ref mtcs)) => { - // `none` is because we're not interpolating - let arg_rdr = new_tt_reader(s_d, None, arg.to_owned()) as @Reader; + // `None` is because we're not interpolating + let arg_rdr = new_tt_reader(s_d, None, arg.to_owned()); match parse(cx.parse_sess(), cx.cfg(), arg_rdr, *mtcs) { Success(named_matches) => { let rhs = match *rhses[i] { @@ -150,12 +150,12 @@ fn generic_extension(cx: &ExtCtxt, // rhs has holes ( `$id` and `$(...)` that need filled) let trncbr = new_tt_reader(s_d, Some(named_matches), rhs); - let p = Parser(cx.parse_sess(), cx.cfg(), trncbr as @Reader); + let p = Parser(cx.parse_sess(), cx.cfg(), ~trncbr); // Let the context choose how to interpret the result. // Weird, but useful for X-macros. - return MRAny(@ParserAnyMacro { + return MRAny(~ParserAnyMacro { parser: RefCell::new(p), - } as @AnyMacro) + }) } Failure(sp, ref msg) => if sp.lo >= best_fail_spot.lo { best_fail_spot = sp; @@ -210,7 +210,7 @@ pub fn add_new_extension(cx: &mut ExtCtxt, arg.clone()); let argument_map = parse_or_else(cx.parse_sess(), cx.cfg(), - arg_reader as @Reader, + arg_reader, argument_gram); // Extract the arguments: diff --git a/src/libsyntax/ext/tt/transcribe.rs b/src/libsyntax/ext/tt/transcribe.rs index d2fa24b1cfe..430bd02119a 100644 --- a/src/libsyntax/ext/tt/transcribe.rs +++ b/src/libsyntax/ext/tt/transcribe.rs @@ -49,8 +49,8 @@ pub struct TtReader { pub fn new_tt_reader(sp_diag: @SpanHandler, interp: Option<HashMap<Ident, @NamedMatch>>, src: ~[ast::TokenTree]) - -> @TtReader { - let r = @TtReader { + -> TtReader { + let r = TtReader { sp_diag: sp_diag, stack: RefCell::new(@TtFrame { forest: @src, @@ -69,7 +69,7 @@ pub fn new_tt_reader(sp_diag: @SpanHandler, cur_tok: RefCell::new(EOF), cur_span: RefCell::new(DUMMY_SP), }; - tt_next_token(r); /* get cur_tok and cur_span set up */ + tt_next_token(&r); /* get cur_tok and cur_span set up */ return r; } @@ -86,8 +86,8 @@ fn dup_tt_frame(f: @TtFrame) -> @TtFrame { } } -pub fn dup_tt_reader(r: @TtReader) -> @TtReader { - @TtReader { +pub fn dup_tt_reader(r: &TtReader) -> TtReader { + TtReader { sp_diag: r.sp_diag, stack: RefCell::new(dup_tt_frame(r.stack.get())), repeat_idx: r.repeat_idx.clone(), |
