diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2014-02-28 12:54:01 -0800 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2014-03-01 22:40:52 -0800 |
| commit | 198cc3d850136582651489328fec221a2b98bfef (patch) | |
| tree | fe47f6fab3d4ead61053684613d0b1852ec7e311 /src/libsyntax/ext | |
| parent | 58fd6ab90db3eb68c94695e1254a73e57bc44658 (diff) | |
| download | rust-198cc3d850136582651489328fec221a2b98bfef.tar.gz rust-198cc3d850136582651489328fec221a2b98bfef.zip | |
libsyntax: Fix errors arising from the automated `~[T]` conversion
Diffstat (limited to 'src/libsyntax/ext')
31 files changed, 289 insertions, 133 deletions
diff --git a/src/libsyntax/ext/asm.rs b/src/libsyntax/ext/asm.rs index c2d16d83301..6080613460d 100644 --- a/src/libsyntax/ext/asm.rs +++ b/src/libsyntax/ext/asm.rs @@ -20,6 +20,8 @@ use parse; use parse::token::InternedString; use parse::token; +use std::vec_ng::Vec; + enum State { Asm, Outputs, @@ -42,7 +44,9 @@ pub fn expand_asm(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) -> base::MacResult { let mut p = parse::new_parser_from_tts(cx.parse_sess(), cx.cfg(), - tts.to_owned()); + tts.iter() + .map(|x| (*x).clone()) + .collect()); let mut asm = InternedString::new(""); let mut asm_str_style = None; diff --git a/src/libsyntax/ext/base.rs b/src/libsyntax/ext/base.rs index 85a8be1c876..e9fe21eded6 100644 --- a/src/libsyntax/ext/base.rs +++ b/src/libsyntax/ext/base.rs @@ -20,6 +20,7 @@ use parse::token::{InternedString, intern, str_to_ident}; use util::small_vector::SmallVector; use collections::HashMap; +use std::vec_ng::Vec; // new-style macro! tt code: // @@ -461,7 +462,9 @@ pub fn get_exprs_from_tts(cx: &ExtCtxt, tts: &[ast::TokenTree]) -> Option<Vec<@ast::Expr> > { let mut p = parse::new_parser_from_tts(cx.parse_sess(), cx.cfg(), - tts.to_owned()); + tts.iter() + .map(|x| (*x).clone()) + .collect()); let mut es = Vec::new(); while p.token != token::EOF { if es.len() != 0 && !p.eat(&token::COMMA) { @@ -553,6 +556,7 @@ impl SyntaxEnv { } pub fn info<'a>(&'a mut self) -> &'a mut BlockInfo { - &mut self.chain[self.chain.len()-1].info + let last_chain_index = self.chain.len() - 1; + &mut self.chain.get_mut(last_chain_index).info } } diff --git a/src/libsyntax/ext/build.rs b/src/libsyntax/ext/build.rs index 2dc94253a35..34625923ea1 100644 --- a/src/libsyntax/ext/build.rs +++ b/src/libsyntax/ext/build.rs @@ -21,6 +21,8 @@ use opt_vec::OptVec; use parse::token::special_idents; use parse::token; +use std::vec_ng::Vec; + pub struct Field { ident: ast::Ident, ex: @ast::Expr @@ -132,7 +134,7 @@ pub trait AstBuilder { fn expr_vstore(&self, sp: Span, expr: @ast::Expr, vst: ast::ExprVstore) -> @ast::Expr; fn expr_vec(&self, sp: Span, exprs: Vec<@ast::Expr> ) -> @ast::Expr; - fn expr_vec_uniq(&self, sp: Span, exprs: Vec<@ast::Expr> ) -> @ast::Expr; + fn expr_vec_ng(&self, sp: Span) -> @ast::Expr; fn expr_vec_slice(&self, sp: Span, exprs: Vec<@ast::Expr> ) -> @ast::Expr; fn expr_str(&self, sp: Span, s: InternedString) -> @ast::Expr; fn expr_str_uniq(&self, sp: Span, s: InternedString) -> @ast::Expr; @@ -580,8 +582,13 @@ impl<'a> AstBuilder for ExtCtxt<'a> { fn expr_vec(&self, sp: Span, exprs: Vec<@ast::Expr> ) -> @ast::Expr { self.expr(sp, ast::ExprVec(exprs, ast::MutImmutable)) } - fn expr_vec_uniq(&self, sp: Span, exprs: Vec<@ast::Expr> ) -> @ast::Expr { - self.expr_vstore(sp, self.expr_vec(sp, exprs), ast::ExprVstoreUniq) + fn expr_vec_ng(&self, sp: Span) -> @ast::Expr { + self.expr_call_global(sp, + vec!(self.ident_of("std"), + self.ident_of("vec_ng"), + self.ident_of("Vec"), + self.ident_of("new")), + Vec::new()) } fn expr_vec_slice(&self, sp: Span, exprs: Vec<@ast::Expr> ) -> @ast::Expr { self.expr_vstore(sp, self.expr_vec(sp, exprs), ast::ExprVstoreSlice) @@ -701,14 +708,12 @@ impl<'a> AstBuilder for ExtCtxt<'a> { self.expr(span, ast::ExprFnBlock(fn_decl, blk)) } - fn lambda0(&self, _span: Span, blk: P<ast::Block>) -> @ast::Expr { - let blk_e = self.expr(blk.span, ast::ExprBlock(blk)); - quote_expr!(self, || $blk_e ) + fn lambda0(&self, span: Span, blk: P<ast::Block>) -> @ast::Expr { + self.lambda(span, Vec::new(), blk) } - fn lambda1(&self, _span: Span, blk: P<ast::Block>, ident: ast::Ident) -> @ast::Expr { - let blk_e = self.expr(blk.span, ast::ExprBlock(blk)); - quote_expr!(self, |$ident| $blk_e ) + fn lambda1(&self, span: Span, blk: P<ast::Block>, ident: ast::Ident) -> @ast::Expr { + self.lambda(span, vec!(ident), blk) } fn lambda_expr(&self, span: Span, ids: Vec<ast::Ident> , expr: @ast::Expr) -> @ast::Expr { @@ -721,7 +726,11 @@ impl<'a> AstBuilder for ExtCtxt<'a> { self.lambda1(span, self.block_expr(expr), ident) } - fn lambda_stmts(&self, span: Span, ids: Vec<ast::Ident> , stmts: Vec<@ast::Stmt> ) -> @ast::Expr { + fn lambda_stmts(&self, + span: Span, + ids: Vec<ast::Ident>, + stmts: Vec<@ast::Stmt>) + -> @ast::Expr { self.lambda(span, ids, self.block(span, stmts, None)) } fn lambda_stmts_0(&self, span: Span, stmts: Vec<@ast::Stmt> ) -> @ast::Expr { @@ -921,7 +930,9 @@ impl<'a> AstBuilder for ExtCtxt<'a> { self.view_use(sp, vis, vec!(@respan(sp, ast::ViewPathList(self.path(sp, path), - imports, + imports.iter() + .map(|x| *x) + .collect(), ast::DUMMY_NODE_ID)))) } diff --git a/src/libsyntax/ext/bytes.rs b/src/libsyntax/ext/bytes.rs index ba6ad4888e2..6123fd4d3d4 100644 --- a/src/libsyntax/ext/bytes.rs +++ b/src/libsyntax/ext/bytes.rs @@ -17,6 +17,7 @@ use ext::base; use ext::build::AstBuilder; use std::char; +use std::vec_ng::Vec; pub fn expand_syntax_ext(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) -> base::MacResult { // Gather all argument expressions diff --git a/src/libsyntax/ext/cfg.rs b/src/libsyntax/ext/cfg.rs index e1f487a95bb..5d11a0d1e2f 100644 --- a/src/libsyntax/ext/cfg.rs +++ b/src/libsyntax/ext/cfg.rs @@ -26,10 +26,14 @@ use parse::token::InternedString; use parse::token; use parse; +use std::vec_ng::Vec; + pub fn expand_cfg(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) -> base::MacResult { let mut p = parse::new_parser_from_tts(cx.parse_sess(), cx.cfg(), - tts.to_owned()); + tts.iter() + .map(|x| (*x).clone()) + .collect()); let mut cfgs = Vec::new(); // parse `cfg!(meta_item, meta_item(x,y), meta_item="foo", ...)` @@ -42,7 +46,8 @@ pub fn expand_cfg(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) -> base::M // test_cfg searches for meta items looking like `cfg(foo, ...)` let in_cfg = &[cx.meta_list(sp, InternedString::new("cfg"), cfgs)]; - let matches_cfg = attr::test_cfg(cx.cfg(), in_cfg.iter().map(|&x| x)); + let matches_cfg = attr::test_cfg(cx.cfg().as_slice(), + in_cfg.iter().map(|&x| x)); let e = cx.expr_bool(sp, matches_cfg); MRExpr(e) } diff --git a/src/libsyntax/ext/deriving/clone.rs b/src/libsyntax/ext/deriving/clone.rs index 3f8fb3ae4f5..feda1694ff1 100644 --- a/src/libsyntax/ext/deriving/clone.rs +++ b/src/libsyntax/ext/deriving/clone.rs @@ -14,6 +14,8 @@ use ext::base::ExtCtxt; use ext::build::AstBuilder; use ext::deriving::generic::*; +use std::vec_ng::Vec; + pub fn expand_deriving_clone(cx: &mut ExtCtxt, span: Span, mitem: @MetaItem, @@ -99,7 +101,7 @@ fn cs_clone( name)) } - if all_fields.len() >= 1 && all_fields[0].name.is_none() { + if all_fields.len() >= 1 && all_fields.get(0).name.is_none() { // enum-like let subcalls = all_fields.map(subcall); cx.expr_call_ident(trait_span, ctor_ident, subcalls) diff --git a/src/libsyntax/ext/deriving/cmp/eq.rs b/src/libsyntax/ext/deriving/cmp/eq.rs index 975b8885de7..1e7199ccc95 100644 --- a/src/libsyntax/ext/deriving/cmp/eq.rs +++ b/src/libsyntax/ext/deriving/cmp/eq.rs @@ -14,6 +14,8 @@ use ext::base::ExtCtxt; use ext::build::AstBuilder; use ext::deriving::generic::*; +use std::vec_ng::Vec; + pub fn expand_deriving_eq(cx: &mut ExtCtxt, span: Span, mitem: @MetaItem, diff --git a/src/libsyntax/ext/deriving/cmp/ord.rs b/src/libsyntax/ext/deriving/cmp/ord.rs index 5605c0b6107..66f45988239 100644 --- a/src/libsyntax/ext/deriving/cmp/ord.rs +++ b/src/libsyntax/ext/deriving/cmp/ord.rs @@ -15,6 +15,8 @@ use ext::base::ExtCtxt; use ext::build::AstBuilder; use ext::deriving::generic::*; +use std::vec_ng::Vec; + pub fn expand_deriving_ord(cx: &mut ExtCtxt, span: Span, mitem: @MetaItem, diff --git a/src/libsyntax/ext/deriving/cmp/totaleq.rs b/src/libsyntax/ext/deriving/cmp/totaleq.rs index ffabed95db5..2b3c0b9ea69 100644 --- a/src/libsyntax/ext/deriving/cmp/totaleq.rs +++ b/src/libsyntax/ext/deriving/cmp/totaleq.rs @@ -14,6 +14,8 @@ use ext::base::ExtCtxt; use ext::build::AstBuilder; use ext::deriving::generic::*; +use std::vec_ng::Vec; + pub fn expand_deriving_totaleq(cx: &mut ExtCtxt, span: Span, mitem: @MetaItem, diff --git a/src/libsyntax/ext/deriving/cmp/totalord.rs b/src/libsyntax/ext/deriving/cmp/totalord.rs index 13f72f5fc2f..89a344bdb7b 100644 --- a/src/libsyntax/ext/deriving/cmp/totalord.rs +++ b/src/libsyntax/ext/deriving/cmp/totalord.rs @@ -14,7 +14,9 @@ use codemap::Span; use ext::base::ExtCtxt; use ext::build::AstBuilder; use ext::deriving::generic::*; + use std::cmp::{Ordering, Equal, Less, Greater}; +use std::vec_ng::Vec; pub fn expand_deriving_totalord(cx: &mut ExtCtxt, span: Span, diff --git a/src/libsyntax/ext/deriving/decodable.rs b/src/libsyntax/ext/deriving/decodable.rs index 4c9a58c46f7..bc6d69c7cca 100644 --- a/src/libsyntax/ext/deriving/decodable.rs +++ b/src/libsyntax/ext/deriving/decodable.rs @@ -21,6 +21,8 @@ use ext::deriving::generic::*; use parse::token::InternedString; use parse::token; +use std::vec_ng::Vec; + pub fn expand_deriving_decodable(cx: &mut ExtCtxt, span: Span, mitem: @MetaItem, diff --git a/src/libsyntax/ext/deriving/default.rs b/src/libsyntax/ext/deriving/default.rs index 46e9dfb89ab..8259459f57a 100644 --- a/src/libsyntax/ext/deriving/default.rs +++ b/src/libsyntax/ext/deriving/default.rs @@ -14,6 +14,8 @@ use ext::base::ExtCtxt; use ext::build::AstBuilder; use ext::deriving::generic::*; +use std::vec_ng::Vec; + pub fn expand_deriving_default(cx: &mut ExtCtxt, span: Span, mitem: @MetaItem, diff --git a/src/libsyntax/ext/deriving/encodable.rs b/src/libsyntax/ext/deriving/encodable.rs index 2fa6ec6888b..091ff7b9c90 100644 --- a/src/libsyntax/ext/deriving/encodable.rs +++ b/src/libsyntax/ext/deriving/encodable.rs @@ -89,6 +89,8 @@ use ext::build::AstBuilder; use ext::deriving::generic::*; use parse::token; +use std::vec_ng::Vec; + pub fn expand_deriving_encodable(cx: &mut ExtCtxt, span: Span, mitem: @MetaItem, diff --git a/src/libsyntax/ext/deriving/generic.rs b/src/libsyntax/ext/deriving/generic.rs index 6869ff2fd0d..1dc474551cf 100644 --- a/src/libsyntax/ext/deriving/generic.rs +++ b/src/libsyntax/ext/deriving/generic.rs @@ -188,7 +188,8 @@ use opt_vec; use parse::token::InternedString; use parse::token; -use std::vec; +use std::vec_ng::Vec; +use std::vec_ng; pub use self::ty::*; mod ty; @@ -410,7 +411,7 @@ impl<'a> TraitDef<'a> { cx.item( self.span, ident, - vec_ng::append(vec!(doc_attr), self.attributes), + vec_ng::append(vec!(doc_attr), self.attributes.as_slice()), ast::ItemImpl(trait_generics, opt_trait_ref, self_type, methods.map(|x| *x))) } @@ -431,13 +432,15 @@ impl<'a> TraitDef<'a> { self, struct_def, type_ident, - self_args, nonself_args) + self_args.as_slice(), + nonself_args.as_slice()) } else { method_def.expand_struct_method_body(cx, self, struct_def, type_ident, - self_args, nonself_args) + self_args.as_slice(), + nonself_args.as_slice()) }; method_def.create_method(cx, self, @@ -465,13 +468,15 @@ impl<'a> TraitDef<'a> { self, enum_def, type_ident, - self_args, nonself_args) + self_args.as_slice(), + nonself_args.as_slice()) } else { method_def.expand_enum_method_body(cx, self, enum_def, type_ident, - self_args, nonself_args) + self_args.as_slice(), + nonself_args.as_slice()) }; method_def.create_method(cx, self, @@ -666,14 +671,15 @@ impl<'a> MethodDef<'a> { // transpose raw_fields let fields = if raw_fields.len() > 0 { - raw_fields[0].iter() - .enumerate() - .map(|(i, &(span, opt_id, field))| { - let other_fields = raw_fields.tail().map(|l| { - match &l[i] { + raw_fields.get(0) + .iter() + .enumerate() + .map(|(i, &(span, opt_id, field))| { + let other_fields = raw_fields.tail().iter().map(|l| { + match l.get(i) { &(_, _, ex) => ex } - }); + }).collect(); FieldInfo { span: span, name: opt_id, @@ -820,17 +826,17 @@ impl<'a> MethodDef<'a> { Some(variant_index) => { // `ref` inside let matches is buggy. Causes havoc wih rusc. // let (variant_index, ref self_vec) = matches_so_far[0]; - let (variant, self_vec) = match matches_so_far[0] { - (_, v, ref s) => (v, s) + let (variant, self_vec) = match matches_so_far.get(0) { + &(_, v, ref s) => (v, s) }; - let mut enum_matching_fields = vec::from_elem(self_vec.len(), Vec::new()); + let mut enum_matching_fields = Vec::from_elem(self_vec.len(), Vec::new()); for triple in matches_so_far.tail().iter() { match triple { &(_, _, ref other_fields) => { for (i, &(_, _, e)) in other_fields.iter().enumerate() { - enum_matching_fields[i].push(e); + enum_matching_fields.get_mut(i).push(e); } } } @@ -849,7 +855,7 @@ impl<'a> MethodDef<'a> { substructure = EnumMatching(variant_index, variant, field_tuples); } None => { - substructure = EnumNonMatching(*matches_so_far); + substructure = EnumNonMatching(matches_so_far.as_slice()); } } self.call_substructure_method(cx, trait_, type_ident, @@ -877,7 +883,7 @@ impl<'a> MethodDef<'a> { }; // matching-variant match - let variant = enum_def.variants[index]; + let variant = *enum_def.variants.get(index); let (pattern, idents) = trait_.create_enum_variant_pattern(cx, variant, current_match_str, @@ -1149,11 +1155,19 @@ pub fn cs_fold(use_foldl: bool, EnumMatching(_, _, ref all_fields) | Struct(ref all_fields) => { if use_foldl { all_fields.iter().fold(base, |old, field| { - f(cx, field.span, old, field.self_, field.other) + f(cx, + field.span, + old, + field.self_, + field.other.as_slice()) }) } else { all_fields.rev_iter().fold(base, |old, field| { - f(cx, field.span, old, field.self_, field.other) + f(cx, + field.span, + old, + field.self_, + field.other.as_slice()) }) } }, diff --git a/src/libsyntax/ext/deriving/hash.rs b/src/libsyntax/ext/deriving/hash.rs index ed7f61d5e94..1d6cfab120d 100644 --- a/src/libsyntax/ext/deriving/hash.rs +++ b/src/libsyntax/ext/deriving/hash.rs @@ -14,6 +14,8 @@ use ext::base::ExtCtxt; use ext::build::AstBuilder; use ext::deriving::generic::*; +use std::vec_ng::Vec; + pub fn expand_deriving_hash(cx: &mut ExtCtxt, span: Span, mitem: @MetaItem, diff --git a/src/libsyntax/ext/deriving/primitive.rs b/src/libsyntax/ext/deriving/primitive.rs index 2615479fa72..ecd042eb172 100644 --- a/src/libsyntax/ext/deriving/primitive.rs +++ b/src/libsyntax/ext/deriving/primitive.rs @@ -16,6 +16,8 @@ use ext::build::AstBuilder; use ext::deriving::generic::*; use parse::token::InternedString; +use std::vec_ng::Vec; + pub fn expand_deriving_from_primitive(cx: &mut ExtCtxt, span: Span, mitem: @MetaItem, diff --git a/src/libsyntax/ext/deriving/rand.rs b/src/libsyntax/ext/deriving/rand.rs index 203e5aae567..da9679eb655 100644 --- a/src/libsyntax/ext/deriving/rand.rs +++ b/src/libsyntax/ext/deriving/rand.rs @@ -16,6 +16,8 @@ use ext::build::{AstBuilder}; use ext::deriving::generic::*; use opt_vec; +use std::vec_ng::Vec; + pub fn expand_deriving_rand(cx: &mut ExtCtxt, span: Span, mitem: @MetaItem, @@ -64,7 +66,7 @@ fn rand_substructure(cx: &mut ExtCtxt, trait_span: Span, substr: &Substructure) let rand_call = |cx: &mut ExtCtxt, span| { cx.expr_call_global(span, rand_ident.clone(), - vec!( rng[0] )) + vec!( *rng.get(0) )) }; return match *substr.fields { @@ -90,7 +92,7 @@ fn rand_substructure(cx: &mut ExtCtxt, trait_span: Span, substr: &Substructure) // ::std::rand::Rand::rand(rng) let rv_call = cx.expr_call(trait_span, rand_name, - vec!( rng[0] )); + vec!( *rng.get(0) )); // need to specify the uint-ness of the random number let uint_ty = cx.ty_ident(trait_span, cx.ident_of("uint")); diff --git a/src/libsyntax/ext/deriving/show.rs b/src/libsyntax/ext/deriving/show.rs index 0622588be8e..51399d8efab 100644 --- a/src/libsyntax/ext/deriving/show.rs +++ b/src/libsyntax/ext/deriving/show.rs @@ -19,6 +19,7 @@ use ext::deriving::generic::*; use parse::token; use collections::HashMap; +use std::vec_ng::Vec; pub fn expand_deriving_show(cx: &mut ExtCtxt, span: Span, @@ -79,7 +80,7 @@ fn show_substructure(cx: &mut ExtCtxt, span: Span, EnumMatching(_, _, ref fields) if fields.len() == 0 => {} Struct(ref fields) | EnumMatching(_, _, ref fields) => { - if fields[0].name.is_none() { + if fields.get(0).name.is_none() { // tuple struct/"normal" variant format_string.push_str("("); @@ -135,6 +136,6 @@ fn show_substructure(cx: &mut ExtCtxt, span: Span, // phew, not our responsibility any more! format::expand_preparsed_format_args(cx, span, format_closure, - format_string, exprs, ~[], + format_string, exprs, Vec::new(), HashMap::new()) } diff --git a/src/libsyntax/ext/deriving/ty.rs b/src/libsyntax/ext/deriving/ty.rs index f7019d65058..b88cd117911 100644 --- a/src/libsyntax/ext/deriving/ty.rs +++ b/src/libsyntax/ext/deriving/ty.rs @@ -21,6 +21,8 @@ use codemap::{Span,respan}; use opt_vec; use opt_vec::OptVec; +use std::vec_ng::Vec; + /// The types of pointers pub enum PtrTy<'a> { Send, // ~ @@ -188,10 +190,10 @@ impl<'a> Ty<'a> { fn mk_ty_param(cx: &ExtCtxt, span: Span, name: &str, bounds: &[Path], self_ident: Ident, self_generics: &Generics) -> ast::TyParam { let bounds = opt_vec::from( - bounds.map(|b| { + bounds.iter().map(|b| { let path = b.to_path(cx, span, self_ident, self_generics); cx.typarambound(path) - })); + }).collect()); cx.typaram(cx.ident_of(name), bounds, None) } @@ -204,8 +206,8 @@ fn mk_generics(lifetimes: Vec<ast::Lifetime> , ty_params: Vec<ast::TyParam> ) - /// Lifetimes and bounds on type parameters pub struct LifetimeBounds<'a> { - lifetimes: Vec<&'a str> , - bounds: vec!((&'a str, Vec<Path<'a>> )) + lifetimes: Vec<&'a str>, + bounds: Vec<(&'a str, Vec<Path<'a>>)>, } impl<'a> LifetimeBounds<'a> { @@ -226,7 +228,12 @@ impl<'a> LifetimeBounds<'a> { let ty_params = self.bounds.map(|t| { match t { &(ref name, ref bounds) => { - mk_ty_param(cx, span, *name, *bounds, self_ty, self_generics) + mk_ty_param(cx, + span, + *name, + bounds.as_slice(), + self_ty, + self_generics) } } }); diff --git a/src/libsyntax/ext/deriving/zero.rs b/src/libsyntax/ext/deriving/zero.rs index 9feae186894..98c0ec9d072 100644 --- a/src/libsyntax/ext/deriving/zero.rs +++ b/src/libsyntax/ext/deriving/zero.rs @@ -14,6 +14,8 @@ use ext::base::ExtCtxt; use ext::build::AstBuilder; use ext::deriving::generic::*; +use std::vec_ng::Vec; + pub fn expand_deriving_zero(cx: &mut ExtCtxt, span: Span, mitem: @MetaItem, diff --git a/src/libsyntax/ext/env.rs b/src/libsyntax/ext/env.rs index aacb2a74087..b0b5fa26015 100644 --- a/src/libsyntax/ext/env.rs +++ b/src/libsyntax/ext/env.rs @@ -19,6 +19,7 @@ use codemap::Span; use ext::base::*; use ext::base; use ext::build::AstBuilder; +use opt_vec; use parse::token; use std::os; @@ -31,8 +32,30 @@ pub fn expand_option_env(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) }; let e = match os::getenv(var) { - None => quote_expr!(cx, ::std::option::None::<&'static str>), - Some(s) => quote_expr!(cx, ::std::option::Some($s)) + None => { + cx.expr_path(cx.path_all(sp, + true, + vec!(cx.ident_of("std"), + cx.ident_of("option"), + cx.ident_of("None")), + opt_vec::Empty, + vec!(cx.ty_rptr(sp, + cx.ty_ident(sp, + cx.ident_of("str")), + Some(cx.lifetime(sp, + cx.ident_of( + "static").name)), + ast::MutImmutable)))) + } + Some(s) => { + cx.expr_call_global(sp, + vec!(cx.ident_of("std"), + cx.ident_of("option"), + cx.ident_of("Some")), + vec!(cx.expr_str(sp, + token::intern_and_get_ident( + s)))) + } }; MRExpr(e) } @@ -48,7 +71,9 @@ pub fn expand_env(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) Some(exprs) => exprs }; - let var = match expr_to_str(cx, exprs[0], "expected string literal") { + let var = match expr_to_str(cx, + *exprs.get(0), + "expected string literal") { None => return MacResult::dummy_expr(sp), Some((v, _style)) => v }; @@ -59,7 +84,7 @@ pub fn expand_env(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) var)) } 2 => { - match expr_to_str(cx, exprs[1], "expected string literal") { + match expr_to_str(cx, *exprs.get(1), "expected string literal") { None => return MacResult::dummy_expr(sp), Some((s, _style)) => s } diff --git a/src/libsyntax/ext/expand.rs b/src/libsyntax/ext/expand.rs index 08d40745894..b162e17f53d 100644 --- a/src/libsyntax/ext/expand.rs +++ b/src/libsyntax/ext/expand.rs @@ -31,6 +31,7 @@ use util::small_vector::SmallVector; use std::cast; use std::unstable::dynamic_lib::DynamicLibrary; use std::os; +use std::vec_ng::Vec; pub fn expand_expr(e: @ast::Expr, fld: &mut MacroExpander) -> @ast::Expr { match e.node { @@ -53,7 +54,7 @@ pub fn expand_expr(e: @ast::Expr, fld: &mut MacroExpander) -> @ast::Expr { // let compilation continue return MacResult::raw_dummy_expr(e.span); } - let extname = pth.segments[0].identifier; + let extname = pth.segments.get(0).identifier; let extnamestr = token::get_ident(extname); // leaving explicit deref here to highlight unbox op: let marked_after = match fld.extsbox.find(&extname.name) { @@ -77,7 +78,7 @@ pub fn expand_expr(e: @ast::Expr, fld: &mut MacroExpander) -> @ast::Expr { }); let fm = fresh_mark(); // mark before: - let marked_before = mark_tts(*tts,fm); + let marked_before = mark_tts(tts.as_slice(), fm); // The span that we pass to the expanders we want to // be the root of the call stack. That's the most @@ -87,7 +88,7 @@ pub fn expand_expr(e: @ast::Expr, fld: &mut MacroExpander) -> @ast::Expr { let expanded = match expandfun.expand(fld.cx, mac_span.call_site, - marked_before) { + marked_before.as_slice()) { MRExpr(e) => e, MRAny(any_macro) => any_macro.make_expr(), _ => { @@ -181,7 +182,10 @@ pub fn expand_expr(e: @ast::Expr, fld: &mut MacroExpander) -> @ast::Expr { // `match i.next() { ... }` let match_expr = { let next_call_expr = - fld.cx.expr_method_call(span, fld.cx.expr_path(local_path), next_ident, Vec::new()); + fld.cx.expr_method_call(span, + fld.cx.expr_path(local_path), + next_ident, + Vec::new()); fld.cx.expr_match(span, next_call_expr, vec!(none_arm, some_arm)) }; @@ -276,7 +280,7 @@ pub fn expand_item(it: @ast::Item, fld: &mut MacroExpander) ast::ItemMac(..) => expand_item_mac(it, fld), ast::ItemMod(_) | ast::ItemForeignMod(_) => { fld.cx.mod_push(it.ident); - let macro_escape = contains_macro_escape(it.attrs); + let macro_escape = contains_macro_escape(it.attrs.as_slice()); let result = with_exts_frame!(fld.extsbox, macro_escape, noop_fold_item(it, fld)); @@ -309,7 +313,7 @@ pub fn expand_item_mac(it: @ast::Item, fld: &mut MacroExpander) _ => fld.cx.span_bug(it.span, "invalid item macro invocation") }; - let extname = pth.segments[0].identifier; + let extname = pth.segments.get(0).identifier; let extnamestr = token::get_ident(extname); let fm = fresh_mark(); let expanded = match fld.extsbox.find(&extname.name) { @@ -339,8 +343,8 @@ pub fn expand_item_mac(it: @ast::Item, fld: &mut MacroExpander) } }); // mark before expansion: - let marked_before = mark_tts(tts,fm); - expander.expand(fld.cx, it.span, marked_before) + let marked_before = mark_tts(tts.as_slice(), fm); + expander.expand(fld.cx, it.span, marked_before.as_slice()) } Some(&IdentTT(ref expander, span)) => { if it.ident.name == parse::token::special_idents::invalid.name { @@ -358,7 +362,7 @@ pub fn expand_item_mac(it: @ast::Item, fld: &mut MacroExpander) } }); // mark before expansion: - let marked_tts = mark_tts(tts,fm); + let marked_tts = mark_tts(tts.as_slice(), fm); expander.expand(fld.cx, it.span, it.ident, marked_tts) } _ => { @@ -391,7 +395,7 @@ pub fn expand_item_mac(it: @ast::Item, fld: &mut MacroExpander) // yikes... no idea how to apply the mark to this. I'm afraid // we're going to have to wait-and-see on this one. fld.extsbox.insert(intern(name), ext); - if attr::contains_name(it.attrs, "macro_export") { + if attr::contains_name(it.attrs.as_slice(), "macro_export") { SmallVector::one(it) } else { SmallVector::zero() @@ -504,7 +508,7 @@ pub fn expand_stmt(s: &Stmt, fld: &mut MacroExpander) -> SmallVector<@Stmt> { fld.cx.span_err(pth.span, "expected macro name without module separators"); return SmallVector::zero(); } - let extname = pth.segments[0].identifier; + let extname = pth.segments.get(0).identifier; let extnamestr = token::get_ident(extname); let marked_after = match fld.extsbox.find(&extname.name) { None => { @@ -523,7 +527,7 @@ pub fn expand_stmt(s: &Stmt, fld: &mut MacroExpander) -> SmallVector<@Stmt> { }); let fm = fresh_mark(); // mark before expansion: - let marked_tts = mark_tts(tts,fm); + let marked_tts = mark_tts(tts.as_slice(), fm); // See the comment in expand_expr for why we want the original span, // not the current mac.span. @@ -531,7 +535,7 @@ pub fn expand_stmt(s: &Stmt, fld: &mut MacroExpander) -> SmallVector<@Stmt> { let expanded = match expandfun.expand(fld.cx, mac_span.call_site, - marked_tts) { + marked_tts.as_slice()) { MRExpr(e) => { @codemap::Spanned { node: StmtExpr(e, ast::DUMMY_NODE_ID), @@ -676,7 +680,8 @@ impl Visitor<()> for NewNameFinderContext { span: _, segments: ref segments } if segments.len() == 1 => { - self.ident_accumulator.push(segments[0].identifier) + self.ident_accumulator.push(segments.get(0) + .identifier) } // I believe these must be enums... _ => () @@ -843,7 +848,7 @@ impl Folder for Marker { let macro = match m.node { MacInvocTT(ref path, ref tts, ctxt) => { MacInvocTT(self.fold_path(path), - fold_tts(*tts, self), + fold_tts(tts.as_slice(), self), new_mark(self.mark, ctxt)) } }; @@ -912,6 +917,8 @@ mod test { use visit; use visit::Visitor; + use std::vec_ng::Vec; + // a visitor that extracts the paths // from a given thingy and puts them in a mutable // array (passed in to the traversal) @@ -1015,9 +1022,9 @@ mod test { let attr2 = make_dummy_attr ("bar"); let escape_attr = make_dummy_attr ("macro_escape"); let attrs1 = vec!(attr1, escape_attr, attr2); - assert_eq!(contains_macro_escape (attrs1),true); + assert_eq!(contains_macro_escape(attrs1.as_slice()),true); let attrs2 = vec!(attr1,attr2); - assert_eq!(contains_macro_escape (attrs2),false); + assert_eq!(contains_macro_escape(attrs2.as_slice()),false); } // make a MetaWord outer attribute with the given name @@ -1082,7 +1089,7 @@ mod test { // in principle, you might want to control this boolean on a per-varref basis, // but that would make things even harder to understand, and might not be // necessary for thorough testing. - type RenamingTest = (&'static str, vec!(Vec<uint> ), bool); + type RenamingTest = (&'static str, Vec<Vec<uint>>, bool); #[test] fn automatic_renaming () { @@ -1131,8 +1138,8 @@ mod test { // must be one check clause for each binding: assert_eq!(bindings.len(),bound_connections.len()); for (binding_idx,shouldmatch) in bound_connections.iter().enumerate() { - let binding_name = mtwt_resolve(bindings[binding_idx]); - let binding_marks = mtwt_marksof(bindings[binding_idx].ctxt,invalid_name); + let binding_name = mtwt_resolve(*bindings.get(binding_idx)); + let binding_marks = mtwt_marksof(bindings.get(binding_idx).ctxt,invalid_name); // shouldmatch can't name varrefs that don't exist: assert!((shouldmatch.len() == 0) || (varrefs.len() > *shouldmatch.iter().max().unwrap())); @@ -1141,13 +1148,18 @@ mod test { // it should be a path of length 1, and it should // be free-identifier=? or bound-identifier=? to the given binding assert_eq!(varref.segments.len(),1); - let varref_name = mtwt_resolve(varref.segments[0].identifier); - let varref_marks = mtwt_marksof(varref.segments[0].identifier.ctxt, + let varref_name = mtwt_resolve(varref.segments + .get(0) + .identifier); + let varref_marks = mtwt_marksof(varref.segments + .get(0) + .identifier + .ctxt, invalid_name); if !(varref_name==binding_name) { println!("uh oh, should match but doesn't:"); println!("varref: {:?}",varref); - println!("binding: {:?}", bindings[binding_idx]); + println!("binding: {:?}", *bindings.get(binding_idx)); ast_util::display_sctable(get_sctable()); } assert_eq!(varref_name,binding_name); @@ -1158,7 +1170,8 @@ mod test { } } else { let fail = (varref.segments.len() == 1) - && (mtwt_resolve(varref.segments[0].identifier) == binding_name); + && (mtwt_resolve(varref.segments.get(0).identifier) == + binding_name); // temp debugging: if fail { println!("failure on test {}",test_idx); @@ -1167,11 +1180,13 @@ mod test { println!("uh oh, matches but shouldn't:"); println!("varref: {:?}",varref); // good lord, you can't make a path with 0 segments, can you? - let string = token::get_ident(varref.segments[0].identifier); + let string = token::get_ident(varref.segments + .get(0) + .identifier); println!("varref's first segment's uint: {}, and string: \"{}\"", - varref.segments[0].identifier.name, + varref.segments.get(0).identifier.name, string.get()); - println!("binding: {:?}", bindings[binding_idx]); + println!("binding: {:?}", *bindings.get(binding_idx)); ast_util::display_sctable(get_sctable()); } assert!(!fail); @@ -1197,7 +1212,7 @@ foo_module!() let string = ident.get(); "xx" == string }).collect(); - let cxbinds: &[&ast::Ident] = cxbinds; + let cxbinds: &[&ast::Ident] = cxbinds.as_slice(); let cxbind = match cxbinds { [b] => b, _ => fail!("expected just one binding for ext_cx") @@ -1211,16 +1226,17 @@ foo_module!() // the xx binding should bind all of the xx varrefs: for (idx,v) in varrefs.iter().filter(|p| { p.segments.len() == 1 - && "xx" == token::get_ident(p.segments[0].identifier).get() + && "xx" == token::get_ident(p.segments.get(0).identifier).get() }).enumerate() { - if mtwt_resolve(v.segments[0].identifier) != resolved_binding { + if mtwt_resolve(v.segments.get(0).identifier) != + resolved_binding { println!("uh oh, xx binding didn't match xx varref:"); println!("this is xx varref \\# {:?}",idx); println!("binding: {:?}",cxbind); println!("resolves to: {:?}",resolved_binding); - println!("varref: {:?}",v.segments[0].identifier); + println!("varref: {:?}",v.segments.get(0).identifier); println!("resolves to: {:?}", - mtwt_resolve(v.segments[0].identifier)); + mtwt_resolve(v.segments.get(0).identifier)); let table = get_sctable(); println!("SC table:"); @@ -1231,7 +1247,8 @@ foo_module!() } } } - assert_eq!(mtwt_resolve(v.segments[0].identifier),resolved_binding); + assert_eq!(mtwt_resolve(v.segments.get(0).identifier), + resolved_binding); }; } diff --git a/src/libsyntax/ext/format.rs b/src/libsyntax/ext/format.rs index 4b27951aa50..7752d885968 100644 --- a/src/libsyntax/ext/format.rs +++ b/src/libsyntax/ext/format.rs @@ -22,6 +22,7 @@ use rsparse = parse; use std::fmt::parse; use collections::{HashMap, HashSet}; use std::vec; +use std::vec_ng::Vec; #[deriving(Eq)] enum ArgumentType { @@ -49,7 +50,7 @@ struct Context<'a> { // were declared in. names: HashMap<~str, @ast::Expr>, name_types: HashMap<~str, ArgumentType>, - name_ordering: ~[~str], + name_ordering: Vec<~str>, // Collection of the compiled `rt::Piece` structures pieces: Vec<@ast::Expr> , @@ -70,15 +71,17 @@ struct Context<'a> { /// Some((fmtstr, unnamed arguments, ordering of named arguments, /// named arguments)) fn parse_args(ecx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) - -> (@ast::Expr, Option<(@ast::Expr, Vec<@ast::Expr>, ~[~str], + -> (@ast::Expr, Option<(@ast::Expr, Vec<@ast::Expr>, Vec<~str>, HashMap<~str, @ast::Expr>)>) { let mut args = Vec::new(); let mut names = HashMap::<~str, @ast::Expr>::new(); - let mut order = ~[]; + let mut order = Vec::new(); let mut p = rsparse::new_parser_from_tts(ecx.parse_sess(), ecx.cfg(), - tts.to_owned()); + tts.iter() + .map(|x| (*x).clone()) + .collect()); // Parse the leading function expression (maybe a block, maybe a path) let extra = p.parse_expr(); if !p.eat(&token::COMMA) { @@ -275,14 +278,14 @@ impl<'a> Context<'a> { return; } { - let arg_type = match self.arg_types[arg] { - None => None, - Some(ref x) => Some(x) + let arg_type = match self.arg_types.get(arg) { + &None => None, + &Some(ref x) => Some(x) }; - self.verify_same(self.args[arg].span, &ty, arg_type); + self.verify_same(self.args.get(arg).span, &ty, arg_type); } - if self.arg_types[arg].is_none() { - self.arg_types[arg] = Some(ty); + if self.arg_types.get(arg).is_none() { + *self.arg_types.get_mut(arg) = Some(ty); } } @@ -653,7 +656,9 @@ impl<'a> Context<'a> { // of each variable because we don't want to move out of the arguments // passed to this function. for (i, &e) in self.args.iter().enumerate() { - if self.arg_types[i].is_none() { continue } // error already generated + if self.arg_types.get(i).is_none() { + continue // error already generated + } let name = self.ecx.ident_of(format!("__arg{}", i)); pats.push(self.ecx.pat_ident(e.span, name)); @@ -748,7 +753,7 @@ impl<'a> Context<'a> { fn format_arg(&self, sp: Span, argno: Position, arg: @ast::Expr) -> @ast::Expr { let ty = match argno { - Exact(ref i) => self.arg_types[*i].get_ref(), + Exact(ref i) => self.arg_types.get(*i).get_ref(), Named(ref s) => self.name_types.get(s) }; @@ -822,7 +827,7 @@ pub fn expand_preparsed_format_args(ecx: &mut ExtCtxt, sp: Span, efmt: @ast::Expr, args: Vec<@ast::Expr>, name_ordering: Vec<~str>, names: HashMap<~str, @ast::Expr>) -> @ast::Expr { - let arg_types = vec::from_fn(args.len(), |_| None); + let arg_types = Vec::from_fn(args.len(), |_| None); let mut cx = Context { ecx: ecx, args: args, @@ -871,7 +876,7 @@ pub fn expand_preparsed_format_args(ecx: &mut ExtCtxt, sp: Span, // Make sure that all arguments were used and all arguments have types. for (i, ty) in cx.arg_types.iter().enumerate() { if ty.is_none() { - cx.ecx.span_err(cx.args[i].span, "argument never used"); + cx.ecx.span_err(cx.args.get(i).span, "argument never used"); } } for (name, e) in cx.names.iter() { diff --git a/src/libsyntax/ext/log_syntax.rs b/src/libsyntax/ext/log_syntax.rs index 5ee4084d207..b94928238e9 100644 --- a/src/libsyntax/ext/log_syntax.rs +++ b/src/libsyntax/ext/log_syntax.rs @@ -20,7 +20,8 @@ pub fn expand_syntax_ext(cx: &mut ExtCtxt, -> base::MacResult { cx.print_backtrace(); - println!("{}", print::pprust::tt_to_str(&ast::TTDelim(@tt.to_owned()))); + println!("{}", print::pprust::tt_to_str(&ast::TTDelim( + @tt.iter().map(|x| (*x).clone()).collect()))); //trivial expression MRExpr(@ast::Expr { diff --git a/src/libsyntax/ext/quote.rs b/src/libsyntax/ext/quote.rs index 3b8df84acc3..e96597d4159 100644 --- a/src/libsyntax/ext/quote.rs +++ b/src/libsyntax/ext/quote.rs @@ -17,6 +17,8 @@ use parse::token::*; use parse::token; use parse; +use std::vec_ng::Vec; + /** * * Quasiquoting works via token trees. @@ -35,6 +37,8 @@ pub mod rt { use parse; use print::pprust; + use std::vec_ng::Vec; + pub use ast::*; pub use parse::token::*; pub use parse::new_parser_from_tts; @@ -305,7 +309,7 @@ pub fn expand_quote_expr(cx: &mut ExtCtxt, pub fn expand_quote_item(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) -> base::MacResult { - let e_attrs = cx.expr_vec_uniq(sp, Vec::new()); + let e_attrs = cx.expr_vec_ng(sp); let expanded = expand_parse_call(cx, sp, "parse_item", vec!(e_attrs), tts); base::MRExpr(expanded) @@ -332,7 +336,7 @@ pub fn expand_quote_ty(cx: &mut ExtCtxt, pub fn expand_quote_stmt(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) -> base::MacResult { - let e_attrs = cx.expr_vec_uniq(sp, Vec::new()); + let e_attrs = cx.expr_vec_ng(sp); let expanded = expand_parse_call(cx, sp, "parse_stmt", vec!(e_attrs), tts); base::MRExpr(expanded) @@ -540,7 +544,7 @@ fn mk_tt(cx: &ExtCtxt, sp: Span, tt: &ast::TokenTree) -> Vec<@ast::Stmt> { vec!(cx.stmt_expr(e_push)) } - ast::TTDelim(ref tts) => mk_tts(cx, sp, **tts), + ast::TTDelim(ref tts) => mk_tts(cx, sp, tts.as_slice()), ast::TTSeq(..) => fail!("TTSeq in quote!"), ast::TTNonterminal(sp, ident) => { @@ -583,7 +587,9 @@ fn expand_tts(cx: &ExtCtxt, sp: Span, tts: &[ast::TokenTree]) let mut p = parse::new_parser_from_tts(cx.parse_sess(), cx.cfg(), - tts.to_owned()); + tts.iter() + .map(|x| (*x).clone()) + .collect()); p.quote_depth += 1u; let cx_expr = p.parse_expr(); @@ -629,14 +635,14 @@ fn expand_tts(cx: &ExtCtxt, sp: Span, tts: &[ast::TokenTree]) id_ext("_sp"), e_sp); - let stmt_let_tt = cx.stmt_let(sp, true, - id_ext("tt"), - cx.expr_vec_uniq(sp, Vec::new())); + let stmt_let_tt = cx.stmt_let(sp, true, id_ext("tt"), cx.expr_vec_ng(sp)); + let mut vector = vec!(stmt_let_sp, stmt_let_tt); + vector.push_all_move(mk_tts(cx, sp, tts.as_slice())); let block = cx.expr_block( cx.block_all(sp, Vec::new(), - vec!(stmt_let_sp, stmt_let_tt) + mk_tts(cx, sp, tts), + vector, Some(cx.expr_ident(sp, id_ext("tt"))))); (cx_expr, block) diff --git a/src/libsyntax/ext/registrar.rs b/src/libsyntax/ext/registrar.rs index 15e753ee49f..4c18eb83afc 100644 --- a/src/libsyntax/ext/registrar.rs +++ b/src/libsyntax/ext/registrar.rs @@ -15,6 +15,8 @@ use diagnostic; use visit; use visit::Visitor; +use std::vec_ng::Vec; + struct MacroRegistrarContext { registrars: Vec<(ast::NodeId, Span)> , } @@ -23,7 +25,8 @@ impl Visitor<()> for MacroRegistrarContext { fn visit_item(&mut self, item: &ast::Item, _: ()) { match item.node { ast::ItemFn(..) => { - if attr::contains_name(item.attrs, "macro_registrar") { + if attr::contains_name(item.attrs.as_slice(), + "macro_registrar") { self.registrars.push((item.id, item.span)); } } diff --git a/src/libsyntax/ext/source_util.rs b/src/libsyntax/ext/source_util.rs index c81ee55c237..b31388f58eb 100644 --- a/src/libsyntax/ext/source_util.rs +++ b/src/libsyntax/ext/source_util.rs @@ -142,6 +142,7 @@ pub fn expand_include_bin(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) return MacResult::dummy_expr(sp); } Ok(bytes) => { + let bytes = bytes.iter().map(|x| *x).collect(); base::MRExpr(cx.expr_lit(sp, ast::LitBinary(Rc::new(bytes)))) } } diff --git a/src/libsyntax/ext/trace_macros.rs b/src/libsyntax/ext/trace_macros.rs index db2c9dcddb6..183cccde18e 100644 --- a/src/libsyntax/ext/trace_macros.rs +++ b/src/libsyntax/ext/trace_macros.rs @@ -24,7 +24,7 @@ pub fn expand_trace_macros(cx: &mut ExtCtxt, let cfg = cx.cfg(); let tt_rdr = new_tt_reader(cx.parse_sess().span_diagnostic, None, - tt.to_owned()); + tt.iter().map(|x| (*x).clone()).collect()); let mut rust_parser = Parser(sess, cfg.clone(), tt_rdr.dup()); if rust_parser.is_keyword(keywords::True) { diff --git a/src/libsyntax/ext/tt/macro_parser.rs b/src/libsyntax/ext/tt/macro_parser.rs index cb86f2cecaa..c9d3150c2cd 100644 --- a/src/libsyntax/ext/tt/macro_parser.rs +++ b/src/libsyntax/ext/tt/macro_parser.rs @@ -22,7 +22,7 @@ use parse::token::{Token, EOF, Nonterminal}; use parse::token; use collections::HashMap; -use std::vec; +use std::vec_ng::Vec; /* This is an Earley-like parser, without support for in-grammar nonterminals, only by calling out to the main rust parser for named nonterminals (which it @@ -103,7 +103,7 @@ pub struct MatcherPos { sep: Option<Token>, idx: uint, up: Option<~MatcherPos>, - matches: vec!(Vec<@NamedMatch> ), + matches: Vec<Vec<@NamedMatch>>, match_lo: uint, match_hi: uint, sp_lo: BytePos, } @@ -112,7 +112,9 @@ pub fn count_names(ms: &[Matcher]) -> uint { ms.iter().fold(0, |ct, m| { ct + match m.node { MatchTok(_) => 0u, - MatchSeq(ref more_ms, _, _, _, _) => count_names((*more_ms)), + MatchSeq(ref more_ms, _, _, _, _) => { + count_names(more_ms.as_slice()) + } MatchNonterminal(_, _, _) => 1u }}) } @@ -131,7 +133,7 @@ pub fn initial_matcher_pos(ms: Vec<Matcher> , sep: Option<Token>, lo: BytePos) } } } - let matches = vec::from_fn(count_names(ms), |_i| Vec::new()); + let matches = Vec::from_fn(count_names(ms.as_slice()), |_i| Vec::new()); ~MatcherPos { elts: ms, sep: sep, @@ -208,7 +210,7 @@ pub fn parse_or_else<R: Reader>(sess: @ParseSess, rdr: R, ms: Vec<Matcher> ) -> HashMap<Ident, @NamedMatch> { - match parse(sess, cfg, rdr, ms) { + match parse(sess, cfg, rdr, ms.as_slice()) { Success(m) => m, Failure(sp, str) => sess.span_diagnostic.span_fatal(sp, str), Error(sp, str) => sess.span_diagnostic.span_fatal(sp, str) @@ -231,7 +233,11 @@ pub fn parse<R: Reader>(sess: @ParseSess, ms: &[Matcher]) -> ParseResult { let mut cur_eis = Vec::new(); - cur_eis.push(initial_matcher_pos(ms.to_owned(), None, rdr.peek().sp.lo)); + cur_eis.push(initial_matcher_pos(ms.iter() + .map(|x| (*x).clone()) + .collect(), + None, + rdr.peek().sp.lo)); loop { let mut bb_eis = Vec::new(); // black-box parsed by parser.rs @@ -274,8 +280,9 @@ pub fn parse<R: Reader>(sess: @ParseSess, // Only touch the binders we have actually bound for idx in range(ei.match_lo, ei.match_hi) { - let sub = ei.matches[idx].clone(); - new_pos.matches[idx] + let sub = (*ei.matches.get(idx)).clone(); + new_pos.matches + .get_mut(idx) .push(@MatchedSeq(sub, mk_sp(ei.sp_lo, sp.hi))); } @@ -308,7 +315,7 @@ pub fn parse<R: Reader>(sess: @ParseSess, eof_eis.push(ei); } } else { - match ei.elts[idx].node.clone() { + match ei.elts.get(idx).node.clone() { /* need to descend into sequence */ MatchSeq(ref matchers, ref sep, zero_ok, match_idx_lo, match_idx_hi) => { @@ -317,13 +324,15 @@ pub fn parse<R: Reader>(sess: @ParseSess, new_ei.idx += 1u; //we specifically matched zero repeats. for idx in range(match_idx_lo, match_idx_hi) { - new_ei.matches[idx].push(@MatchedSeq(Vec::new(), sp)); + new_ei.matches + .get_mut(idx) + .push(@MatchedSeq(Vec::new(), sp)); } cur_eis.push(new_ei); } - let matches = vec::from_elem(ei.matches.len(), Vec::new()); + let matches = Vec::from_elem(ei.matches.len(), Vec::new()); let ei_t = ei; cur_eis.push(~MatcherPos { elts: (*matchers).clone(), @@ -352,10 +361,10 @@ pub fn parse<R: Reader>(sess: @ParseSess, if token_name_eq(&tok, &EOF) { if eof_eis.len() == 1u { let mut v = Vec::new(); - for dv in eof_eis[0u].matches.mut_iter() { + for dv in eof_eis.get_mut(0).matches.mut_iter() { v.push(dv.pop().unwrap()); } - return Success(nameize(sess, ms, v)); + return Success(nameize(sess, ms, v.as_slice())); } else if eof_eis.len() > 1u { return Error(sp, ~"ambiguity: multiple successful parses"); } else { @@ -365,7 +374,7 @@ pub fn parse<R: Reader>(sess: @ParseSess, if (bb_eis.len() > 0u && next_eis.len() > 0u) || bb_eis.len() > 1u { let nts = bb_eis.map(|ei| { - match ei.elts[ei.idx].node { + match ei.elts.get(ei.idx).node { MatchNonterminal(bind, name, _) => { format!("{} ('{}')", token::get_ident(name), @@ -390,10 +399,10 @@ pub fn parse<R: Reader>(sess: @ParseSess, let mut rust_parser = Parser(sess, cfg.clone(), rdr.dup()); let mut ei = bb_eis.pop().unwrap(); - match ei.elts[ei.idx].node { + match ei.elts.get(ei.idx).node { MatchNonterminal(_, name, idx) => { let name_string = token::get_ident(name); - ei.matches[idx].push(@MatchedNonterminal( + ei.matches.get_mut(idx).push(@MatchedNonterminal( parse_nt(&mut rust_parser, name_string.get()))); ei.idx += 1u; } diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index ed127c43117..712d5f6bd27 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -25,9 +25,11 @@ use parse::token::{special_idents, gensym_ident}; use parse::token::{FAT_ARROW, SEMI, NtMatchers, NtTT, EOF}; use parse::token; use print; -use std::cell::RefCell; use util::small_vector::SmallVector; +use std::cell::RefCell; +use std::vec_ng::Vec; + struct ParserAnyMacro { parser: RefCell<Parser>, } @@ -100,7 +102,12 @@ impl MacroExpander for MacroRulesMacroExpander { sp: Span, arg: &[ast::TokenTree]) -> MacResult { - generic_extension(cx, sp, self.name, arg, *self.lhses, *self.rhses) + generic_extension(cx, + sp, + self.name, + arg, + self.lhses.as_slice(), + self.rhses.as_slice()) } } @@ -115,7 +122,9 @@ fn generic_extension(cx: &ExtCtxt, if cx.trace_macros() { println!("{}! \\{ {} \\}", token::get_ident(name), - print::pprust::tt_to_str(&TTDelim(@arg.to_owned()))); + print::pprust::tt_to_str(&TTDelim(@arg.iter() + .map(|x| (*x).clone()) + .collect()))); } // Which arm's failure should we report? (the one furthest along) @@ -128,8 +137,12 @@ fn generic_extension(cx: &ExtCtxt, 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()); - match parse(cx.parse_sess(), cx.cfg(), arg_rdr, *mtcs) { + let arg_rdr = new_tt_reader(s_d, + None, + arg.iter() + .map(|x| (*x).clone()) + .collect()); + match parse(cx.parse_sess(), cx.cfg(), arg_rdr, mtcs.as_slice()) { Success(named_matches) => { let rhs = match *rhses[i] { // okay, what's your transcriber? @@ -137,7 +150,10 @@ fn generic_extension(cx: &ExtCtxt, match *tt { // cut off delimiters; don't parse 'em TTDelim(ref tts) => { - (*tts).slice(1u,(*tts).len()-1u).to_owned() + (*tts).slice(1u,(*tts).len()-1u) + .iter() + .map(|x| (*x).clone()) + .collect() } _ => cx.span_fatal( sp, "macro rhs must be delimited") diff --git a/src/libsyntax/ext/tt/transcribe.rs b/src/libsyntax/ext/tt/transcribe.rs index 690ae82741c..a3f179e851a 100644 --- a/src/libsyntax/ext/tt/transcribe.rs +++ b/src/libsyntax/ext/tt/transcribe.rs @@ -18,6 +18,7 @@ use parse::token; use parse::lexer::TokenAndSpan; use std::cell::{Cell, RefCell}; +use std::vec_ng::Vec; use collections::HashMap; ///an unzipping of `TokenTree`s @@ -106,7 +107,7 @@ fn lookup_cur_matched_by_matched(r: &TtReader, start: @NamedMatch) // end of the line; duplicate henceforth ad } - MatchedSeq(ref ads, _) => ads[*idx] + MatchedSeq(ref ads, _) => *ads.get(*idx) } } let repeat_idx = r.repeat_idx.borrow(); @@ -217,7 +218,8 @@ pub fn tt_next_token(r: &TtReader) -> TokenAndSpan { r.stack.get().idx.set(0u); { let mut repeat_idx = r.repeat_idx.borrow_mut(); - repeat_idx.get()[repeat_idx.get().len() - 1u] += 1u; + let last_repeat_idx = repeat_idx.get().len() - 1u; + *repeat_idx.get().get_mut(last_repeat_idx) += 1u; } match r.stack.get().sep.clone() { Some(tk) => { @@ -231,7 +233,7 @@ pub fn tt_next_token(r: &TtReader) -> TokenAndSpan { loop { /* because it's easiest, this handles `TTDelim` not starting with a `TTTok`, even though it won't happen */ // FIXME(pcwalton): Bad copy. - match r.stack.get().forest[r.stack.get().idx.get()].clone() { + match (*r.stack.get().forest.get(r.stack.get().idx.get())).clone() { TTDelim(tts) => { r.stack.set(@TtFrame { forest: tts, |
