]>
Commit | Line | Data |
---|---|---|
b7449926 | 1 | // run-pass |
04454e1e | 2 | #![allow(dead_code, unused_imports, unused_macro_rules)] |
cc61c64b XL |
3 | |
4 | /** | |
5 | Ensure that `:vis` matches can be captured in existing positions, and passed | |
6 | through without the need for reparse tricks. | |
7 | */ | |
8 | macro_rules! vis_passthru { | |
9 | ($vis:vis const $name:ident: $ty:ty = $e:expr;) => { $vis const $name: $ty = $e; }; | |
10 | ($vis:vis enum $name:ident {}) => { $vis struct $name {} }; | |
11 | ($vis:vis extern "C" fn $name:ident() {}) => { $vis extern "C" fn $name() {} }; | |
12 | ($vis:vis fn $name:ident() {}) => { $vis fn $name() {} }; | |
13 | ($vis:vis mod $name:ident {}) => { $vis mod $name {} }; | |
14 | ($vis:vis static $name:ident: $ty:ty = $e:expr;) => { $vis static $name: $ty = $e; }; | |
15 | ($vis:vis struct $name:ident;) => { $vis struct $name; }; | |
16 | ($vis:vis trait $name:ident {}) => { $vis trait $name {} }; | |
17 | ($vis:vis type $name:ident = $ty:ty;) => { $vis type $name = $ty; }; | |
18 | ($vis:vis use $path:ident as $name:ident;) => { $vis use self::$path as $name; }; | |
19 | } | |
20 | ||
21 | mod with_pub { | |
22 | vis_passthru! { pub const A: i32 = 0; } | |
23 | vis_passthru! { pub enum B {} } | |
24 | vis_passthru! { pub extern "C" fn c() {} } | |
25 | vis_passthru! { pub mod d {} } | |
26 | vis_passthru! { pub static E: i32 = 0; } | |
27 | vis_passthru! { pub struct F; } | |
28 | vis_passthru! { pub trait G {} } | |
29 | vis_passthru! { pub type H = i32; } | |
30 | vis_passthru! { pub use A as I; } | |
31 | } | |
32 | ||
33 | mod without_pub { | |
34 | vis_passthru! { const A: i32 = 0; } | |
35 | vis_passthru! { enum B {} } | |
36 | vis_passthru! { extern "C" fn c() {} } | |
37 | vis_passthru! { mod d {} } | |
38 | vis_passthru! { static E: i32 = 0; } | |
39 | vis_passthru! { struct F; } | |
40 | vis_passthru! { trait G {} } | |
41 | vis_passthru! { type H = i32; } | |
42 | vis_passthru! { use A as I; } | |
43 | } | |
44 | ||
45 | mod with_pub_restricted { | |
46 | vis_passthru! { pub(crate) const A: i32 = 0; } | |
47 | vis_passthru! { pub(crate) enum B {} } | |
48 | vis_passthru! { pub(crate) extern "C" fn c() {} } | |
49 | vis_passthru! { pub(crate) mod d {} } | |
50 | vis_passthru! { pub(crate) static E: i32 = 0; } | |
51 | vis_passthru! { pub(crate) struct F; } | |
52 | vis_passthru! { pub(crate) trait G {} } | |
53 | vis_passthru! { pub(crate) type H = i32; } | |
54 | vis_passthru! { pub(crate) use A as I; } | |
55 | } | |
56 | ||
abe05a73 | 57 | mod with_crate { |
923072b8 FG |
58 | vis_passthru! { pub(crate) const A: i32 = 0; } |
59 | vis_passthru! { pub(crate) enum B {} } | |
60 | vis_passthru! { pub(crate) extern "C" fn c() {} } | |
61 | vis_passthru! { pub(crate) mod d {} } | |
62 | vis_passthru! { pub(crate) static E: i32 = 0; } | |
63 | vis_passthru! { pub(crate) struct F; } | |
64 | vis_passthru! { pub(crate) trait G {} } | |
65 | vis_passthru! { pub(crate) type H = i32; } | |
66 | vis_passthru! { pub(crate) use A as I; } | |
abe05a73 XL |
67 | } |
68 | ||
cc61c64b XL |
69 | mod garden { |
70 | mod with_pub_restricted_path { | |
71 | vis_passthru! { pub(in garden) const A: i32 = 0; } | |
72 | vis_passthru! { pub(in garden) enum B {} } | |
73 | vis_passthru! { pub(in garden) extern "C" fn c() {} } | |
74 | vis_passthru! { pub(in garden) mod d {} } | |
75 | vis_passthru! { pub(in garden) static E: i32 = 0; } | |
76 | vis_passthru! { pub(in garden) struct F; } | |
77 | vis_passthru! { pub(in garden) trait G {} } | |
78 | vis_passthru! { pub(in garden) type H = i32; } | |
79 | vis_passthru! { pub(in garden) use A as I; } | |
80 | } | |
81 | } | |
82 | ||
83 | /* | |
84 | Ensure that the `:vis` matcher works in a more complex situation: parsing a | |
85 | struct definition. | |
86 | */ | |
87 | macro_rules! vis_parse_struct { | |
88 | ($(#[$($attrs:tt)*])* $vis:vis struct $name:ident {$($body:tt)*}) => { | |
89 | vis_parse_struct! { @parse_fields $(#[$($attrs)*])*, $vis, $name, $($body)* } | |
90 | }; | |
91 | ||
92 | ($(#[$($attrs:tt)*])* $vis:vis struct $name:ident ($($body:tt)*);) => { | |
93 | vis_parse_struct! { @parse_tuple $(#[$($attrs)*])*, $vis, $name, $($body)* } | |
94 | }; | |
95 | ||
96 | (@parse_fields | |
97 | $(#[$attrs:meta])*, $vis:vis, $name:ident, $($fvis:vis $fname:ident: $fty:ty),* $(,)*) => { | |
98 | $(#[$attrs])* $vis struct $name { $($fvis $fname: $fty,)* } | |
99 | }; | |
100 | ||
101 | (@parse_tuple | |
102 | $(#[$attrs:meta])*, $vis:vis, $name:ident, $($fvis:vis $fty:ty),* $(,)*) => { | |
103 | $(#[$attrs])* $vis struct $name ( $($fvis $fty,)* ); | |
104 | }; | |
105 | } | |
106 | ||
107 | mod test_struct { | |
108 | vis_parse_struct! { pub(crate) struct A { pub a: i32, b: i32, pub(crate) c: i32 } } | |
109 | vis_parse_struct! { pub struct B { a: i32, pub(crate) b: i32, pub c: i32 } } | |
110 | vis_parse_struct! { struct C { pub(crate) a: i32, pub b: i32, c: i32 } } | |
111 | ||
112 | vis_parse_struct! { pub(crate) struct D (pub i32, i32, pub(crate) i32); } | |
113 | vis_parse_struct! { pub struct E (i32, pub(crate) i32, pub i32); } | |
114 | vis_parse_struct! { struct F (pub(crate) i32, pub i32, i32); } | |
115 | } | |
116 | ||
117 | fn main() {} |