diff options
| author | Huon Wilson <dbau.pp+github@gmail.com> | 2014-04-15 22:00:14 +1000 |
|---|---|---|
| committer | Huon Wilson <dbau.pp+github@gmail.com> | 2014-04-16 17:53:27 +1000 |
| commit | 99dd5911a1026da0a374b697e4a0407a631eb388 (patch) | |
| tree | 4e88a1416f3c7336e83d2c1797aa0de76d8ca84b /src/libsyntax/ext/source_util.rs | |
| parent | 168b2d1a3f4569706fe4f9a2baee04e37f85d297 (diff) | |
| download | rust-99dd5911a1026da0a374b697e4a0407a631eb388.tar.gz rust-99dd5911a1026da0a374b697e4a0407a631eb388.zip | |
syntax: unify all MacResult's into a single trait.
There's now one unified way to return things from a macro, instead of being able to choose the `AnyMacro` trait or the `MRItem`/`MRExpr` variants of the `MacResult` enum. This does simplify the logic handling the expansions, but the biggest value of this is it makes macros in (for example) type position easier to implement, as there's this single thing to modify. By my measurements (using `-Z time-passes` on libstd and librustc etc.), this appears to have little-to-no impact on expansion speed. There are presumably larger costs than the small number of extra allocations and virtual calls this adds (notably, all `macro_rules!`-defined macros have not changed in behaviour, since they had to use the `AnyMacro` trait anyway).
Diffstat (limited to 'src/libsyntax/ext/source_util.rs')
| -rw-r--r-- | src/libsyntax/ext/source_util.rs | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/src/libsyntax/ext/source_util.rs b/src/libsyntax/ext/source_util.rs index 008532bcafe..7f1d8172255 100644 --- a/src/libsyntax/ext/source_util.rs +++ b/src/libsyntax/ext/source_util.rs @@ -29,63 +29,63 @@ use std::str; /* line!(): expands to the current line number */ pub fn expand_line(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) - -> base::MacResult { + -> ~base::MacResult { base::check_zero_tts(cx, sp, tts, "line!"); let topmost = topmost_expn_info(cx.backtrace().unwrap()); let loc = cx.codemap().lookup_char_pos(topmost.call_site.lo); - base::MRExpr(cx.expr_uint(topmost.call_site, loc.line)) + base::MacExpr::new(cx.expr_uint(topmost.call_site, loc.line)) } /* col!(): expands to the current column number */ pub fn expand_col(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) - -> base::MacResult { + -> ~base::MacResult { base::check_zero_tts(cx, sp, tts, "col!"); let topmost = topmost_expn_info(cx.backtrace().unwrap()); let loc = cx.codemap().lookup_char_pos(topmost.call_site.lo); - base::MRExpr(cx.expr_uint(topmost.call_site, loc.col.to_uint())) + base::MacExpr::new(cx.expr_uint(topmost.call_site, loc.col.to_uint())) } /* file!(): expands to the current filename */ /* The filemap (`loc.file`) contains a bunch more information we could spit * out if we wanted. */ pub fn expand_file(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) - -> base::MacResult { + -> ~base::MacResult { base::check_zero_tts(cx, sp, tts, "file!"); let topmost = topmost_expn_info(cx.backtrace().unwrap()); let loc = cx.codemap().lookup_char_pos(topmost.call_site.lo); let filename = token::intern_and_get_ident(loc.file.name); - base::MRExpr(cx.expr_str(topmost.call_site, filename)) + base::MacExpr::new(cx.expr_str(topmost.call_site, filename)) } pub fn expand_stringify(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) - -> base::MacResult { + -> ~base::MacResult { let s = pprust::tts_to_str(tts); - base::MRExpr(cx.expr_str(sp, token::intern_and_get_ident(s))) + base::MacExpr::new(cx.expr_str(sp, token::intern_and_get_ident(s))) } pub fn expand_mod(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) - -> base::MacResult { + -> ~base::MacResult { base::check_zero_tts(cx, sp, tts, "module_path!"); let string = cx.mod_path() .iter() .map(|x| token::get_ident(*x).get().to_str()) .collect::<Vec<~str>>() .connect("::"); - base::MRExpr(cx.expr_str(sp, token::intern_and_get_ident(string))) + base::MacExpr::new(cx.expr_str(sp, token::intern_and_get_ident(string))) } // 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]) - -> base::MacResult { + -> ~base::MacResult { let file = match get_single_str_from_tts(cx, sp, tts, "include!") { Some(f) => f, - None => return MacResult::dummy_expr(sp), + None => return DummyResult::expr(sp), }; // The file will be added to the code map by the parser let mut p = @@ -95,21 +95,21 @@ pub fn expand_include(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) sp, &Path::new(file)), sp); - base::MRExpr(p.parse_expr()) + base::MacExpr::new(p.parse_expr()) } // include_str! : read the given file, insert it as a literal string expr pub fn expand_include_str(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) - -> base::MacResult { + -> ~base::MacResult { let file = match get_single_str_from_tts(cx, sp, tts, "include_str!") { Some(f) => f, - None => return MacResult::dummy_expr(sp) + None => return DummyResult::expr(sp) }; let file = res_rel_file(cx, sp, &Path::new(file)); let bytes = match File::open(&file).read_to_end() { Err(e) => { cx.span_err(sp, format!("couldn't read {}: {}", file.display(), e)); - return MacResult::dummy_expr(sp); + return DummyResult::expr(sp); } Ok(bytes) => bytes, }; @@ -121,31 +121,31 @@ pub fn expand_include_str(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) let interned = token::intern_and_get_ident(src); cx.codemap().new_filemap(filename, src.to_owned()); - base::MRExpr(cx.expr_str(sp, interned)) + base::MacExpr::new(cx.expr_str(sp, interned)) } None => { cx.span_err(sp, format!("{} wasn't a utf-8 file", file.display())); - return MacResult::dummy_expr(sp); + return DummyResult::expr(sp); } } } pub fn expand_include_bin(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) - -> base::MacResult + -> ~base::MacResult { let file = match get_single_str_from_tts(cx, sp, tts, "include_bin!") { Some(f) => f, - None => return MacResult::dummy_expr(sp) + None => return DummyResult::expr(sp) }; let file = res_rel_file(cx, sp, &Path::new(file)); match File::open(&file).read_to_end() { Err(e) => { cx.span_err(sp, format!("couldn't read {}: {}", file.display(), e)); - return MacResult::dummy_expr(sp); + return DummyResult::expr(sp); } Ok(bytes) => { let bytes = bytes.iter().map(|x| *x).collect(); - base::MRExpr(cx.expr_lit(sp, ast::LitBinary(Rc::new(bytes)))) + base::MacExpr::new(cx.expr_lit(sp, ast::LitBinary(Rc::new(bytes)))) } } } |
