Refactored ast_map and friends, mainly to have Paths without storing them.
This commit is contained in:
parent
22c34f3c4c
commit
a02b10a062
92 changed files with 1987 additions and 2573 deletions
|
@ -54,8 +54,8 @@ pub fn expand_expr(e: @ast::Expr, fld: &mut MacroExpander) -> @ast::Expr {
|
|||
// let compilation continue
|
||||
return e;
|
||||
}
|
||||
let extname = &pth.segments[0].identifier;
|
||||
let extnamestr = token::get_ident(extname.name);
|
||||
let extname = pth.segments[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) {
|
||||
None => {
|
||||
|
@ -297,26 +297,25 @@ 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 extnamestr = token::get_ident(extname.name);
|
||||
let extname = pth.segments[0].identifier;
|
||||
let extnamestr = token::get_ident(extname);
|
||||
let fm = fresh_mark();
|
||||
let expanded = match fld.extsbox.find(&extname.name) {
|
||||
None => {
|
||||
fld.cx.span_err(pth.span,
|
||||
format!("macro undefined: '{}!'",
|
||||
extnamestr.get()));
|
||||
extnamestr));
|
||||
// let compilation continue
|
||||
return SmallVector::zero();
|
||||
}
|
||||
|
||||
Some(&NormalTT(ref expander, span)) => {
|
||||
if it.ident.name != parse::token::special_idents::invalid.name {
|
||||
let string = token::get_ident(it.ident.name);
|
||||
fld.cx.span_err(pth.span,
|
||||
format!("macro {}! expects no ident argument, \
|
||||
given '{}'",
|
||||
extnamestr.get(),
|
||||
string.get()));
|
||||
extnamestr,
|
||||
token::get_ident(it.ident)));
|
||||
return SmallVector::zero();
|
||||
}
|
||||
fld.cx.bt_push(ExpnInfo {
|
||||
|
@ -418,13 +417,10 @@ fn load_extern_macros(krate: &ast::ViewItem, fld: &mut MacroExpander) {
|
|||
let MacroCrate { lib, cnum } = fld.cx.loader.load_crate(krate);
|
||||
|
||||
let crate_name = match krate.node {
|
||||
ast::ViewItemExternMod(ref name, _, _) => {
|
||||
let string = token::get_ident(name.name);
|
||||
string.get().to_str()
|
||||
},
|
||||
_ => unreachable!(),
|
||||
ast::ViewItemExternMod(name, _, _) => name,
|
||||
_ => unreachable!()
|
||||
};
|
||||
let name = format!("<{} macros>", crate_name);
|
||||
let name = format!("<{} macros>", token::get_ident(crate_name));
|
||||
|
||||
let exported_macros = fld.cx.loader.get_exported_macros(cnum);
|
||||
for source in exported_macros.iter() {
|
||||
|
@ -496,12 +492,11 @@ 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 extnamestr = token::get_ident(extname.name);
|
||||
let extname = pth.segments[0].identifier;
|
||||
let extnamestr = token::get_ident(extname);
|
||||
let marked_after = match fld.extsbox.find(&extname.name) {
|
||||
None => {
|
||||
fld.cx.span_err(pth.span, format!("macro undefined: '{}'",
|
||||
extnamestr.get()));
|
||||
fld.cx.span_err(pth.span, format!("macro undefined: '{}'", extnamestr));
|
||||
return SmallVector::zero();
|
||||
}
|
||||
|
||||
|
@ -535,7 +530,7 @@ pub fn expand_stmt(s: &Stmt, fld: &mut MacroExpander) -> SmallVector<@Stmt> {
|
|||
_ => {
|
||||
fld.cx.span_err(pth.span,
|
||||
format!("non-stmt macro in stmt pos: {}",
|
||||
extnamestr.get()));
|
||||
extnamestr));
|
||||
return SmallVector::zero();
|
||||
}
|
||||
};
|
||||
|
@ -545,7 +540,7 @@ pub fn expand_stmt(s: &Stmt, fld: &mut MacroExpander) -> SmallVector<@Stmt> {
|
|||
|
||||
_ => {
|
||||
fld.cx.span_err(pth.span, format!("'{}' is not a tt-style macro",
|
||||
extnamestr.get()));
|
||||
extnamestr));
|
||||
return SmallVector::zero();
|
||||
}
|
||||
};
|
||||
|
@ -1186,9 +1181,7 @@ 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
|
||||
.name);
|
||||
let string = token::get_ident(varref.segments[0].identifier);
|
||||
println!("varref's first segment's uint: {}, and string: \"{}\"",
|
||||
varref.segments[0].identifier.name,
|
||||
string.get());
|
||||
|
@ -1213,10 +1206,7 @@ foo_module!()
|
|||
let bindings = name_finder.ident_accumulator;
|
||||
|
||||
let cxbinds: ~[&ast::Ident] =
|
||||
bindings.iter().filter(|b| {
|
||||
let string = token::get_ident(b.name);
|
||||
"xx" == string.get()
|
||||
}).collect();
|
||||
bindings.iter().filter(|b| "xx" == token::get_ident(**b).get()).collect();
|
||||
let cxbind = match cxbinds {
|
||||
[b] => b,
|
||||
_ => fail!("expected just one binding for ext_cx")
|
||||
|
@ -1228,12 +1218,9 @@ foo_module!()
|
|||
let varrefs = path_finder.path_accumulator;
|
||||
|
||||
// the xx binding should bind all of the xx varrefs:
|
||||
for (idx,v) in varrefs.iter().filter(|p|{
|
||||
for (idx,v) in varrefs.iter().filter(|p| {
|
||||
p.segments.len() == 1
|
||||
&& {
|
||||
let string = token::get_ident(p.segments[0].identifier.name);
|
||||
"xx" == string.get()
|
||||
}
|
||||
&& "xx" == token::get_ident(p.segments[0].identifier).get()
|
||||
}).enumerate() {
|
||||
if mtwt_resolve(v.segments[0].identifier) != resolved_binding {
|
||||
println!("uh oh, xx binding didn't match xx varref:");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue