syntax: allow trace_macros! and log_syntax! in item position.

Previously

    trace_macros!(true)
    fn main() {}

would complain about `trace_macros` being an expression macro in item
position. This is a pointless limitation, because the macro is purely
compile-time, with no runtime effect. (And similarly for log_syntax.)

This also changes the behaviour of `trace_macros!` very slightly, it
used to be equivalent to

    macro_rules! trace_macros {
        (true $($_x: tt)*) => { true };
        (false $($_x: tt)*) => { false }
    }

I.e. you could invoke it with arbitrary trailing arguments, which were
ignored. It is changed to accept only exactly `true` or `false` (with no
trailing arguments) and expands to `()`.
This commit is contained in:
Huon Wilson
2014-03-18 23:14:08 +11:00
parent af9368452d
commit cda33346d0
6 changed files with 92 additions and 36 deletions

View File

@@ -10,11 +10,10 @@
use ast;
use codemap;
use ext::base::*;
use ext::base;
use print;
pub fn expand_syntax_ext(cx: &mut ExtCtxt,
pub fn expand_syntax_ext(cx: &mut base::ExtCtxt,
sp: codemap::Span,
tt: &[ast::TokenTree])
-> base::MacResult {
@@ -23,13 +22,6 @@ pub fn expand_syntax_ext(cx: &mut ExtCtxt,
println!("{}", print::pprust::tt_to_str(&ast::TTDelim(
@tt.iter().map(|x| (*x).clone()).collect())));
//trivial expression
MRExpr(@ast::Expr {
id: ast::DUMMY_NODE_ID,
node: ast::ExprLit(@codemap::Spanned {
node: ast::LitNil,
span: sp
}),
span: sp,
})
// any so that `log_syntax` can be invoked as an expression and item.
base::MacResult::dummy_any(sp)
}