]>
Commit | Line | Data |
---|---|---|
1 | // Copyright 2015 The Rust Project Developers. See the COPYRIGHT | |
2 | // file at the top-level directory of this distribution and at | |
3 | // http://rust-lang.org/COPYRIGHT. | |
4 | // | |
5 | // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
6 | // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
7 | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | |
8 | // option. This file may not be copied, modified, or distributed | |
9 | // except according to those terms. | |
10 | ||
11 | // ignore-cross-compile | |
12 | ||
13 | #![feature(quote, rustc_private)] | |
14 | ||
15 | extern crate syntax; | |
16 | ||
17 | use syntax::codemap::DUMMY_SP; | |
18 | use syntax::print::pprust::*; | |
19 | use syntax::parse::token::intern; | |
20 | ||
21 | fn main() { | |
22 | let ps = syntax::parse::ParseSess::new(); | |
23 | let mut feature_gated_cfgs = vec![]; | |
24 | let mut cx = syntax::ext::base::ExtCtxt::new( | |
25 | &ps, vec![], | |
26 | syntax::ext::expand::ExpansionConfig::default("qquote".to_string()), | |
27 | &mut feature_gated_cfgs); | |
28 | cx.bt_push(syntax::codemap::ExpnInfo { | |
29 | call_site: DUMMY_SP, | |
30 | callee: syntax::codemap::NameAndSpan { | |
31 | format: syntax::codemap::MacroBang(intern("")), | |
32 | allow_internal_unstable: false, | |
33 | span: None, | |
34 | } | |
35 | }); | |
36 | let cx = &mut cx; | |
37 | ||
38 | macro_rules! check { | |
39 | ($f: ident, $($e: expr),+; $expect: expr) => ({ | |
40 | $(assert_eq!($f(&$e), $expect);)+ | |
41 | }); | |
42 | } | |
43 | ||
44 | let abc = quote_expr!(cx, 23); | |
45 | check!(expr_to_string, abc, *quote_expr!(cx, $abc); "23"); | |
46 | ||
47 | let ty = quote_ty!(cx, isize); | |
48 | check!(ty_to_string, ty, *quote_ty!(cx, $ty); "isize"); | |
49 | ||
50 | let item = quote_item!(cx, static x: $ty = 10;).unwrap(); | |
51 | check!(item_to_string, item, quote_item!(cx, $item).unwrap(); "static x: isize = 10;"); | |
52 | ||
53 | let twenty: u16 = 20; | |
54 | let stmt = quote_stmt!(cx, let x = $twenty;).unwrap(); | |
55 | check!(stmt_to_string, stmt, *quote_stmt!(cx, $stmt).unwrap(); "let x = 20u16;"); | |
56 | ||
57 | let pat = quote_pat!(cx, Some(_)); | |
58 | check!(pat_to_string, pat, *quote_pat!(cx, $pat); "Some(_)"); | |
59 | ||
60 | let expr = quote_expr!(cx, (x, y)); | |
61 | let arm = quote_arm!(cx, (ref x, ref y) => $expr,); | |
62 | check!(arm_to_string, arm, quote_arm!(cx, $arm); " (ref x, ref y) => (x, y),"); | |
63 | ||
64 | let attr = quote_attr!(cx, #![cfg(foo = "bar")]); | |
65 | check!(attribute_to_string, attr, quote_attr!(cx, $attr); r#"#![cfg(foo = "bar")]"#); | |
66 | ||
67 | // quote_arg! | |
68 | ||
69 | let arg = quote_arg!(cx, foo: i32); | |
70 | check!(arg_to_string, arg, quote_arg!(cx, $arg); "foo: i32"); | |
71 | ||
72 | let function = quote_item!(cx, fn f($arg) { }).unwrap(); | |
73 | check!(item_to_string, function; "fn f(foo: i32) { }"); | |
74 | ||
75 | let args = vec![arg, quote_arg!(cx, bar: u32)]; | |
76 | let args = &args[..]; | |
77 | let function = quote_item!(cx, fn f($args) { }).unwrap(); | |
78 | check!(item_to_string, function; "fn f(foo: i32, bar: u32) { }"); | |
79 | ||
80 | // quote_block! | |
81 | ||
82 | let block = quote_block!(cx, { $stmt let y = 40u32; }); | |
83 | check!(block_to_string, block, *quote_block!(cx, $block); "{ let x = 20u16; let y = 40u32; }"); | |
84 | ||
85 | let function = quote_item!(cx, fn f() $block).unwrap(); | |
86 | check!(item_to_string, function; "fn f() { let x = 20u16; let y = 40u32; }"); | |
87 | ||
88 | // quote_path! | |
89 | ||
90 | let path = quote_path!(cx, ::syntax::ptr::P<MetaItem>); | |
91 | check!(path_to_string, path, quote_path!(cx, $path); "::syntax::ptr::P<MetaItem>"); | |
92 | ||
93 | let ty = quote_ty!(cx, $path); | |
94 | check!(ty_to_string, ty; "::syntax::ptr::P<MetaItem>"); | |
95 | ||
96 | // quote_meta_item! | |
97 | ||
98 | let meta = quote_meta_item!(cx, cfg(foo = "bar")); | |
99 | check!(meta_item_to_string, meta, *quote_meta_item!(cx, $meta); r#"cfg(foo = "bar")"#); | |
100 | ||
101 | let attr = quote_attr!(cx, #![$meta]); | |
102 | check!(attribute_to_string, attr; r#"#![cfg(foo = "bar")]"#); | |
103 | } |