1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*fn check_arg(cx: &mut ExtCtxt, sp: Span, args: &[TokenTree]) -> Box<MacResult + 'static> {
fn find_seq_it_ident(tts: &[TokenTree]) -> Option<Ident> {
for tt in tts {
let res = find_it_ident(tt);
if res.is_some() {
return res;
}
}
None
}
fn find_it_ident(tt: &TokenTree) -> Option<Ident> {
match tt {
&TokenTree::Token(_, Token::Ident(ident, _)) if ident.name.as_str() == "it" => Some(ident),
&TokenTree::Token(..) => None,
&TokenTree::Delimited(_, ref delimited) => find_seq_it_ident(&delimited.tts[..]),
&TokenTree::Sequence(_, ref seq) => find_seq_it_ident(&seq.tts[..]),
}
}
for tt in args {
if let Some(it) = find_it_ident(tt) {
let mut parser = cx.new_parser_from_tts(args);
let expr = match parser.parse_expr() {
Ok(expr) => expr,
Err(mut err) => {
err.emit();
return DummyResult::any(sp)
}
};
let pattern_str = syntax::print::pprust::tts_to_string(args);
let res = quote_expr!(cx, {
let pattern_str = $pattern_str;
let descr = "".to_owned(); //format!("check!({})", pattern_str);
::mockers::FnMatchArg::new(descr, move |$it| {
if $expr {
Ok(())
} else {
Err(format!("{:?} didn't pass check: {}", $it, pattern_str))
}
})
}).unwrap();
return MacEager::expr(P(res))
}
}
cx.span_err(sp, "Expression doesn't contain references to `it`");
DummyResult::any(sp)
}*/