blob: a433512508a9da74abca3a25c8b3f56ff9151d3c [file] [log] [blame]
David Tolnayb79ee962016-09-04 09:39:20 -07001use super::*;
Alex Crichtonccbb45d2017-05-23 10:58:24 -07002use delimited::Delimited;
David Tolnayb79ee962016-09-04 09:39:20 -07003
Alex Crichton62a0a592017-05-22 13:58:53 -07004ast_struct! {
5 /// An item
6 ///
7 /// The name might be a dummy name in case of anonymous items
8 pub struct Item {
9 pub ident: Ident,
10 pub vis: Visibility,
11 pub attrs: Vec<Attribute>,
12 pub node: ItemKind,
13 }
David Tolnayb79ee962016-09-04 09:39:20 -070014}
15
Alex Crichton62a0a592017-05-22 13:58:53 -070016ast_enum_of_structs! {
17 pub enum ItemKind {
18 /// An`extern crate` item, with optional original crate name.
19 ///
20 /// E.g. `extern crate foo` or `extern crate foo_bar as foo`
21 pub ExternCrate(ItemExternCrate {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070022 pub extern_token: tokens::Extern,
23 pub crate_token: tokens::Crate,
24 pub as_token: Option<tokens::As>,
Alex Crichton62a0a592017-05-22 13:58:53 -070025 pub original: Option<Ident>,
Alex Crichtonccbb45d2017-05-23 10:58:24 -070026 pub semi_token: tokens::Semi,
Alex Crichton62a0a592017-05-22 13:58:53 -070027 }),
28 /// A use declaration (`use` or `pub use`) item.
29 ///
30 /// E.g. `use foo;`, `use foo::bar;` or `use foo::bar as FooBar;`
31 pub Use(ItemUse {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070032 pub use_token: tokens::Use,
Alex Crichton62a0a592017-05-22 13:58:53 -070033 pub path: Box<ViewPath>,
Alex Crichtonccbb45d2017-05-23 10:58:24 -070034 pub semi_token: tokens::Semi,
Alex Crichton62a0a592017-05-22 13:58:53 -070035 }),
36 /// A static item (`static` or `pub static`).
37 ///
38 /// E.g. `static FOO: i32 = 42;` or `static FOO: &'static str = "bar";`
39 pub Static(ItemStatic {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070040 pub static_token: tokens::Static,
41 pub colon_token: tokens::Colon,
42 pub eq_token: tokens::Eq,
43 pub semi_token: tokens::Semi,
Alex Crichton62a0a592017-05-22 13:58:53 -070044 pub ty: Box<Ty>,
45 pub mutbl: Mutability,
46 pub expr: Box<Expr>,
47 }),
48 /// A constant item (`const` or `pub const`).
49 ///
50 /// E.g. `const FOO: i32 = 42;`
51 pub Const(ItemConst {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070052 pub const_token: tokens::Const,
53 pub colon_token: tokens::Colon,
54 pub eq_token: tokens::Eq,
55 pub semi_token: tokens::Semi,
Alex Crichton62a0a592017-05-22 13:58:53 -070056 pub ty: Box<Ty>,
57 pub expr: Box<Expr>,
58 }),
59 /// A function declaration (`fn` or `pub fn`).
60 ///
61 /// E.g. `fn foo(bar: usize) -> usize { .. }`
62 pub Fn(ItemFn {
63 pub decl: Box<FnDecl>,
64 pub unsafety: Unsafety,
65 pub constness: Constness,
66 pub abi: Option<Abi>,
Alex Crichton62a0a592017-05-22 13:58:53 -070067 pub block: Box<Block>,
68 }),
69 /// A module declaration (`mod` or `pub mod`).
70 ///
71 /// E.g. `mod foo;` or `mod foo { .. }`
72 pub Mod(ItemMod {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070073 pub mod_token: tokens::Mod,
74 pub semi_token: Option<tokens::Semi>,
75 pub items: Option<(Vec<Item>, tokens::Brace)>,
Alex Crichton62a0a592017-05-22 13:58:53 -070076 }),
77 /// An external module (`extern` or `pub extern`).
78 ///
79 /// E.g. `extern {}` or `extern "C" {}`
Alex Crichtonccbb45d2017-05-23 10:58:24 -070080 pub ForeignMod(ItemForeignMod {
81 pub brace_token: tokens::Brace,
82 pub abi: Abi,
83 pub items: Vec<ForeignItem>,
84 }),
85
Alex Crichton62a0a592017-05-22 13:58:53 -070086 /// A type alias (`type` or `pub type`).
87 ///
88 /// E.g. `type Foo = Bar<u8>;`
89 pub Ty(ItemTy {
Alex Crichtonccbb45d2017-05-23 10:58:24 -070090 pub type_token: tokens::Type,
91 pub eq_token: tokens::Eq,
92 pub semi_token: tokens::Semi,
Alex Crichton62a0a592017-05-22 13:58:53 -070093 pub ty: Box<Ty>,
94 pub generics: Generics,
95 }),
96 /// An enum definition (`enum` or `pub enum`).
97 ///
98 /// E.g. `enum Foo<A, B> { C<A>, D<B> }`
99 pub Enum(ItemEnum {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700100 pub enum_token: tokens::Enum,
101 pub brace_token: tokens::Brace,
102 pub variants: Delimited<Variant, tokens::Comma>,
Alex Crichton62a0a592017-05-22 13:58:53 -0700103 pub generics: Generics,
104 }),
105 /// A struct definition (`struct` or `pub struct`).
106 ///
107 /// E.g. `struct Foo<A> { x: A }`
108 pub Struct(ItemStruct {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700109 pub struct_token: tokens::Struct,
Alex Crichton62a0a592017-05-22 13:58:53 -0700110 pub data: VariantData,
111 pub generics: Generics,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700112 pub semi_token: Option<tokens::Semi>,
Alex Crichton62a0a592017-05-22 13:58:53 -0700113 }),
114 /// A union definition (`union` or `pub union`).
115 ///
116 /// E.g. `union Foo<A, B> { x: A, y: B }`
117 pub Union(ItemUnion {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700118 pub union_token: tokens::Union,
Alex Crichton62a0a592017-05-22 13:58:53 -0700119 pub data: VariantData,
120 pub generics: Generics,
121 }),
122 /// A Trait declaration (`trait` or `pub trait`).
123 ///
124 /// E.g. `trait Foo { .. }` or `trait Foo<T> { .. }`
125 pub Trait(ItemTrait {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700126 pub trait_token: tokens::Trait,
Alex Crichton62a0a592017-05-22 13:58:53 -0700127 pub unsafety: Unsafety,
128 pub generics: Generics,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700129 pub colon_token: Option<tokens::Colon>,
130 pub supertraits: Delimited<TyParamBound, tokens::Add>,
131 pub brace_token: tokens::Brace,
Alex Crichton62a0a592017-05-22 13:58:53 -0700132 pub items: Vec<TraitItem>,
133 }),
134 /// Default trait implementation.
135 ///
136 /// E.g. `impl Trait for .. {}` or `impl<T> Trait<T> for .. {}`
137 pub DefaultImpl(ItemDefaultImpl {
138 pub unsafety: Unsafety,
139 pub path: Path,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700140 pub impl_token: tokens::Impl,
141 pub for_token: tokens::For,
142 pub dot2_token: tokens::Dot2,
143 pub brace_token: tokens::Brace,
Alex Crichton62a0a592017-05-22 13:58:53 -0700144 }),
145 /// An implementation.
146 ///
147 /// E.g. `impl<A> Foo<A> { .. }` or `impl<A> Trait for Foo<A> { .. }`
148 pub Impl(ItemImpl {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700149 pub impl_token: tokens::Impl,
Alex Crichton62a0a592017-05-22 13:58:53 -0700150 pub unsafety: Unsafety,
151 pub polarity: ImplPolarity,
152 pub generics: Generics,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700153 pub for_token: Option<tokens::For>,
Alex Crichton62a0a592017-05-22 13:58:53 -0700154 pub trait_: Option<Path>, // (optional) trait this impl implements
155 pub self_ty: Box<Ty>, // self
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700156 pub brace_token: tokens::Brace,
Alex Crichton62a0a592017-05-22 13:58:53 -0700157 pub items: Vec<ImplItem>,
158 }),
159 /// A macro invocation (which includes macro definition).
160 ///
161 /// E.g. `macro_rules! foo { .. }` or `foo!(..)`
162 pub Mac(Mac),
163 }
164
165 do_not_generate_to_tokens
David Tolnayb79ee962016-09-04 09:39:20 -0700166}
167
David Tolnay0e837402016-12-22 17:25:55 -0500168impl From<DeriveInput> for Item {
169 fn from(input: DeriveInput) -> Item {
David Tolnay453cfd12016-10-23 11:00:14 -0700170 Item {
171 ident: input.ident,
172 vis: input.vis,
173 attrs: input.attrs,
174 node: match input.body {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700175 Body::Enum(data) => {
Alex Crichton62a0a592017-05-22 13:58:53 -0700176 ItemEnum {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700177 variants: data.variants,
Alex Crichton62a0a592017-05-22 13:58:53 -0700178 generics: input.generics,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700179 brace_token: data.brace_token,
180 enum_token: data.enum_token,
Alex Crichton62a0a592017-05-22 13:58:53 -0700181 }.into()
182 }
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700183 Body::Struct(data) => {
Alex Crichton62a0a592017-05-22 13:58:53 -0700184 ItemStruct {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700185 data: data.data,
Alex Crichton62a0a592017-05-22 13:58:53 -0700186 generics: input.generics,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700187 semi_token: data.semi_token,
188 struct_token: data.struct_token,
Alex Crichton62a0a592017-05-22 13:58:53 -0700189 }.into()
190 }
David Tolnay453cfd12016-10-23 11:00:14 -0700191 },
192 }
193 }
194}
195
Alex Crichton62a0a592017-05-22 13:58:53 -0700196ast_enum_of_structs! {
197 pub enum ViewPath {
198 /// `foo::bar::baz as quux`
199 ///
200 /// or just
201 ///
202 /// `foo::bar::baz` (with `as baz` implicitly on the right)
203 pub Simple(PathSimple {
204 pub path: Path,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700205 pub as_token: Option<tokens::As>,
Alex Crichton62a0a592017-05-22 13:58:53 -0700206 pub rename: Option<Ident>,
207 }),
208
209 /// `foo::bar::*`
210 pub Glob(PathGlob {
211 pub path: Path,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700212 pub colon2_token: tokens::Colon2,
213 pub star_token: tokens::Star,
Alex Crichton62a0a592017-05-22 13:58:53 -0700214 }),
215
216 /// `foo::bar::{a, b, c}`
217 pub List(PathList {
218 pub path: Path,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700219 pub colon2_token: tokens::Colon2,
220 pub brace_token: tokens::Brace,
221 pub items: Delimited<PathListItem, tokens::Comma>,
Alex Crichton62a0a592017-05-22 13:58:53 -0700222 }),
223 }
224}
225
226ast_struct! {
227 pub struct PathListItem {
228 pub name: Ident,
229 /// renamed in list, e.g. `use foo::{bar as baz};`
230 pub rename: Option<Ident>,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700231 pub as_token: Option<tokens::As>,
Alex Crichton62a0a592017-05-22 13:58:53 -0700232 }
233}
234
235ast_enum! {
Alex Crichton2e0229c2017-05-23 09:34:50 -0700236 #[cfg_attr(feature = "clone-impls", derive(Copy))]
Alex Crichton62a0a592017-05-22 13:58:53 -0700237 pub enum Constness {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700238 Const(tokens::Const),
Alex Crichton62a0a592017-05-22 13:58:53 -0700239 NotConst,
240 }
241}
242
243ast_enum! {
Alex Crichton2e0229c2017-05-23 09:34:50 -0700244 #[cfg_attr(feature = "clone-impls", derive(Copy))]
Alex Crichton62a0a592017-05-22 13:58:53 -0700245 pub enum Defaultness {
Alex Crichton954046c2017-05-30 21:49:42 -0700246 Default(tokens::Default_),
Alex Crichton62a0a592017-05-22 13:58:53 -0700247 Final,
248 }
249}
250
251ast_struct! {
Alex Crichton62a0a592017-05-22 13:58:53 -0700252 pub struct ForeignItem {
253 pub ident: Ident,
254 pub attrs: Vec<Attribute>,
255 pub node: ForeignItemKind,
256 pub vis: Visibility,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700257 pub semi_token: tokens::Semi,
Alex Crichton62a0a592017-05-22 13:58:53 -0700258 }
259}
260
261ast_enum_of_structs! {
262 /// An item within an `extern` block
263 pub enum ForeignItemKind {
264 /// A foreign function
265 pub Fn(ForeignItemFn {
266 pub decl: Box<FnDecl>,
Alex Crichton62a0a592017-05-22 13:58:53 -0700267 }),
268 /// A foreign static item (`static ext: u8`)
269 pub Static(ForeignItemStatic {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700270 pub static_token: tokens::Static,
Alex Crichton62a0a592017-05-22 13:58:53 -0700271 pub ty: Box<Ty>,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700272 pub colon_token: tokens::Colon,
Alex Crichton62a0a592017-05-22 13:58:53 -0700273 pub mutbl: Mutability,
274 }),
275 }
276
277 do_not_generate_to_tokens
278}
279
280ast_struct! {
281 /// Represents an item declaration within a trait declaration,
282 /// possibly including a default implementation. A trait item is
283 /// either required (meaning it doesn't have an implementation, just a
284 /// signature) or provided (meaning it has a default implementation).
285 pub struct TraitItem {
286 pub ident: Ident,
287 pub attrs: Vec<Attribute>,
288 pub node: TraitItemKind,
289 }
290}
291
292ast_enum_of_structs! {
293 pub enum TraitItemKind {
294 pub Const(TraitItemConst {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700295 pub const_token: tokens::Const,
296 pub colon_token: tokens::Colon,
Alex Crichton62a0a592017-05-22 13:58:53 -0700297 pub ty: Ty,
298 pub default: Option<Expr>,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700299 pub eq_token: Option<tokens::Eq>,
300 pub semi_token: tokens::Semi,
Alex Crichton62a0a592017-05-22 13:58:53 -0700301 }),
302 pub Method(TraitItemMethod {
303 pub sig: MethodSig,
304 pub default: Option<Block>,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700305 pub semi_token: Option<tokens::Semi>,
Alex Crichton62a0a592017-05-22 13:58:53 -0700306 }),
307 pub Type(TraitItemType {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700308 pub type_token: tokens::Type,
309 pub colon_token: Option<tokens::Colon>,
310 pub bounds: Delimited<TyParamBound, tokens::Add>,
311 pub eq_token: Option<tokens::Eq>,
Alex Crichton62a0a592017-05-22 13:58:53 -0700312 pub default: Option<Ty>,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700313 pub semi_token: tokens::Semi,
Alex Crichton62a0a592017-05-22 13:58:53 -0700314 }),
315 pub Macro(Mac),
316 }
317
318 do_not_generate_to_tokens
319}
320
321ast_enum! {
Alex Crichton2e0229c2017-05-23 09:34:50 -0700322 #[cfg_attr(feature = "clone-impls", derive(Copy))]
Alex Crichton62a0a592017-05-22 13:58:53 -0700323 pub enum ImplPolarity {
324 /// `impl Trait for Type`
325 Positive,
326 /// `impl !Trait for Type`
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700327 Negative(tokens::Bang),
Alex Crichton62a0a592017-05-22 13:58:53 -0700328 }
329}
330
331ast_struct! {
332 pub struct ImplItem {
333 pub ident: Ident,
334 pub vis: Visibility,
335 pub defaultness: Defaultness,
336 pub attrs: Vec<Attribute>,
337 pub node: ImplItemKind,
338 }
339}
340
341ast_enum_of_structs! {
342 pub enum ImplItemKind {
343 pub Const(ImplItemConst {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700344 pub const_token: tokens::Const,
345 pub colon_token: tokens::Colon,
346 pub eq_token: tokens::Eq,
347 pub semi_token: tokens::Semi,
Alex Crichton62a0a592017-05-22 13:58:53 -0700348 pub ty: Ty,
349 pub expr: Expr,
350 }),
351 pub Method(ImplItemMethod {
352 pub sig: MethodSig,
353 pub block: Block,
354 }),
355 pub Type(ImplItemType {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700356 pub type_token: tokens::Type,
357 pub eq_token: tokens::Eq,
358 pub semi_token: tokens::Semi,
Alex Crichton62a0a592017-05-22 13:58:53 -0700359 pub ty: Ty,
360 }),
361 pub Macro(Mac),
362 }
363
364 do_not_generate_to_tokens
365}
366
367ast_struct! {
368 /// Represents a method's signature in a trait declaration,
369 /// or in an implementation.
370 pub struct MethodSig {
371 pub unsafety: Unsafety,
372 pub constness: Constness,
373 pub abi: Option<Abi>,
374 pub decl: FnDecl,
Alex Crichton62a0a592017-05-22 13:58:53 -0700375 }
376}
377
378ast_struct! {
379 /// Header (not the body) of a function declaration.
David Tolnayf38cdf62016-09-23 19:07:09 -0700380 ///
Alex Crichton62a0a592017-05-22 13:58:53 -0700381 /// E.g. `fn foo(bar: baz)`
382 pub struct FnDecl {
Alex Crichton954046c2017-05-30 21:49:42 -0700383 pub fn_token: tokens::Fn_,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700384 pub paren_token: tokens::Paren,
385 pub inputs: Delimited<FnArg, tokens::Comma>,
Alex Crichton62a0a592017-05-22 13:58:53 -0700386 pub output: FunctionRetTy,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700387 pub generics: Generics,
Alex Crichton62a0a592017-05-22 13:58:53 -0700388 pub variadic: bool,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700389 pub dot_tokens: Option<tokens::Dot3>,
Alex Crichton62a0a592017-05-22 13:58:53 -0700390 }
David Tolnayf38cdf62016-09-23 19:07:09 -0700391}
392
Alex Crichton62a0a592017-05-22 13:58:53 -0700393ast_enum_of_structs! {
394 /// An argument in a function header.
395 ///
396 /// E.g. `bar: usize` as in `fn foo(bar: usize)`
397 pub enum FnArg {
398 pub SelfRef(ArgSelfRef {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700399 pub and_token: tokens::And,
400 pub self_token: tokens::Self_,
Alex Crichton62a0a592017-05-22 13:58:53 -0700401 pub lifetime: Option<Lifetime>,
402 pub mutbl: Mutability,
403 }),
404 pub SelfValue(ArgSelf {
405 pub mutbl: Mutability,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700406 pub self_token: tokens::Self_,
Alex Crichton62a0a592017-05-22 13:58:53 -0700407 }),
408 pub Captured(ArgCaptured {
409 pub pat: Pat,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700410 pub colon_token: tokens::Colon,
Alex Crichton62a0a592017-05-22 13:58:53 -0700411 pub ty: Ty,
412 }),
413 pub Ignored(Ty),
414 }
David Tolnay62f374c2016-10-02 13:37:00 -0700415}
416
David Tolnayedf2b992016-09-23 20:43:45 -0700417#[cfg(feature = "parsing")]
418pub mod parsing {
419 use super::*;
David Tolnayedf2b992016-09-23 20:43:45 -0700420
Michael Layzell92639a52017-06-01 00:07:44 -0400421 use synom::Synom;
Alex Crichton954046c2017-05-30 21:49:42 -0700422 use synom::tokens::*;
423 use synom::tokens;
David Tolnay84aa0752016-10-02 23:01:13 -0700424
Alex Crichton954046c2017-05-30 21:49:42 -0700425 impl Synom for Item {
Michael Layzell92639a52017-06-01 00:07:44 -0400426 named!(parse -> Self, alt!(
427 item_extern_crate
428 |
429 item_use
430 |
431 item_static
432 |
433 item_const
434 |
435 item_fn
436 |
437 item_mod
438 |
439 item_foreign_mod
440 |
441 item_ty
442 |
443 item_struct_or_enum
444 |
445 item_union
446 |
447 item_trait
448 |
449 item_default_impl
450 |
451 item_impl
452 |
453 item_mac
454 ));
Alex Crichton954046c2017-05-30 21:49:42 -0700455
456 fn description() -> Option<&'static str> {
457 Some("item")
458 }
459 }
David Tolnay453cfd12016-10-23 11:00:14 -0700460
David Tolnay84aa0752016-10-02 23:01:13 -0700461 named!(item_mac -> Item, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700462 attrs: many0!(call!(Attribute::parse_outer)) >>
463 what: syn!(Path) >>
464 bang: syn!(Bang) >>
465 name: option!(syn!(Ident)) >>
466 body: call!(::TokenTree::parse_delimited) >>
467 cond!(!body.is_braced(), syn!(Semi)) >>
David Tolnay84aa0752016-10-02 23:01:13 -0700468 (Item {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700469 ident: name.unwrap_or_else(|| Ident::from("")),
470 vis: VisInherited {}.into(),
David Tolnay84aa0752016-10-02 23:01:13 -0700471 attrs: attrs,
472 node: ItemKind::Mac(Mac {
Alex Crichton954046c2017-05-30 21:49:42 -0700473 bang_token: bang,
David Tolnay5d55ef72016-12-21 20:20:04 -0500474 path: what,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700475 tokens: vec![body],
David Tolnay84aa0752016-10-02 23:01:13 -0700476 }),
477 })
David Tolnayedf2b992016-09-23 20:43:45 -0700478 ));
479
David Tolnaya96a3fa2016-09-24 07:17:42 -0700480 named!(item_extern_crate -> Item, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700481 attrs: many0!(call!(Attribute::parse_outer)) >>
482 vis: syn!(Visibility) >>
483 extern_: syn!(Extern) >>
484 crate_: syn!(tokens::Crate) >>
485 id: syn!(Ident) >>
486 rename: option!(tuple!(syn!(As), syn!(Ident))) >>
487 semi: syn!(Semi) >>
David Tolnayedf2b992016-09-23 20:43:45 -0700488 ({
Alex Crichton954046c2017-05-30 21:49:42 -0700489 let (name, original_name, as_) = match rename {
490 Some((as_, rename)) => (rename, Some(id), Some(as_)),
491 None => (id, None, None),
David Tolnayedf2b992016-09-23 20:43:45 -0700492 };
493 Item {
494 ident: name,
495 vis: vis,
496 attrs: attrs,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700497 node: ItemExternCrate {
Alex Crichton954046c2017-05-30 21:49:42 -0700498 as_token: as_,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700499 original: original_name,
Alex Crichton954046c2017-05-30 21:49:42 -0700500 extern_token: extern_,
501 crate_token: crate_,
502 semi_token: semi,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700503 }.into(),
David Tolnayedf2b992016-09-23 20:43:45 -0700504 }
505 })
506 ));
507
David Tolnay4a057422016-10-08 00:02:31 -0700508 named!(item_use -> Item, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700509 attrs: many0!(call!(Attribute::parse_outer)) >>
510 vis: syn!(Visibility) >>
511 use_: syn!(Use) >>
512 what: syn!(ViewPath) >>
513 semi: syn!(Semi) >>
David Tolnay4a057422016-10-08 00:02:31 -0700514 (Item {
515 ident: "".into(),
516 vis: vis,
517 attrs: attrs,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700518 node: ItemUse {
519 path: Box::new(what),
Alex Crichton954046c2017-05-30 21:49:42 -0700520 use_token: use_,
521 semi_token: semi,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700522 }.into(),
David Tolnay4a057422016-10-08 00:02:31 -0700523 })
524 ));
525
Alex Crichton954046c2017-05-30 21:49:42 -0700526 impl Synom for ViewPath {
Michael Layzell92639a52017-06-01 00:07:44 -0400527 named!(parse -> Self, alt!(
528 syn!(PathGlob) => { ViewPath::Glob }
529 |
530 syn!(PathList) => { ViewPath::List }
531 |
532 syn!(PathSimple) => { ViewPath::Simple } // must be last
533 ));
Alex Crichton954046c2017-05-30 21:49:42 -0700534 }
David Tolnay4a057422016-10-08 00:02:31 -0700535
Alex Crichton954046c2017-05-30 21:49:42 -0700536 impl Synom for PathSimple {
Michael Layzell92639a52017-06-01 00:07:44 -0400537 named!(parse -> Self, do_parse!(
538 path: syn!(Path) >>
539 rename: option!(tuple!(syn!(As), syn!(Ident))) >>
540 (PathSimple {
541 path: path,
542 as_token: rename.as_ref().map(|p| As((p.0).0)),
543 rename: rename.map(|p| p.1),
544 })
545 ));
Alex Crichton954046c2017-05-30 21:49:42 -0700546 }
David Tolnay4a057422016-10-08 00:02:31 -0700547
Alex Crichton954046c2017-05-30 21:49:42 -0700548 impl Synom for PathGlob {
Michael Layzell92639a52017-06-01 00:07:44 -0400549 named!(parse -> Self, do_parse!(
550 path: syn!(Path) >>
551 colon2: syn!(Colon2) >>
552 star: syn!(Star) >>
553 (PathGlob {
554 path: path,
555 colon2_token: colon2,
556 star_token: star,
557 })
558 ));
Alex Crichton954046c2017-05-30 21:49:42 -0700559 }
David Tolnay4a057422016-10-08 00:02:31 -0700560
Alex Crichton954046c2017-05-30 21:49:42 -0700561 impl Synom for PathList {
Michael Layzell92639a52017-06-01 00:07:44 -0400562 named!(parse -> Self, alt!(
563 do_parse!(
564 path: syn!(Path) >>
565 colon2: syn!(Colon2) >>
566 items: braces!(call!(Delimited::parse_terminated)) >>
567 (PathList {
568 path: path,
569 items: items.0,
570 brace_token: items.1,
571 colon2_token: colon2,
572 })
573 )
574 |
575 do_parse!(
576 global: option!(syn!(Colon2)) >>
577 items: braces!(call!(Delimited::parse_terminated)) >>
578 (PathList {
579 path: Path {
580 global: global.is_some(),
581 segments: Delimited::new(),
582 leading_colon: None,
583 },
584 colon2_token: global.unwrap_or_default(),
585 brace_token: items.1,
586 items: items.0,
587 })
588 )
589 ));
Alex Crichton954046c2017-05-30 21:49:42 -0700590 }
David Tolnay4a057422016-10-08 00:02:31 -0700591
Alex Crichton954046c2017-05-30 21:49:42 -0700592 impl Synom for PathListItem {
Michael Layzell92639a52017-06-01 00:07:44 -0400593 named!(parse -> Self, do_parse!(
594 name: alt!(
595 syn!(Ident)
596 |
597 map!(syn!(Self_), Into::into)
598 ) >>
599 rename: option!(tuple!(syn!(As), syn!(Ident))) >>
600 (PathListItem {
601 name: name,
602 as_token: rename.as_ref().map(|p| As((p.0).0)),
603 rename: rename.map(|p| p.1),
604 })
605 ));
Alex Crichton954046c2017-05-30 21:49:42 -0700606 }
David Tolnay4a057422016-10-08 00:02:31 -0700607
David Tolnay47a877c2016-10-01 16:50:55 -0700608 named!(item_static -> Item, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700609 attrs: many0!(call!(Attribute::parse_outer)) >>
610 vis: syn!(Visibility) >>
611 static_: syn!(Static) >>
612 mutability: syn!(Mutability) >>
613 id: syn!(Ident) >>
614 colon: syn!(Colon) >>
615 ty: syn!(Ty) >>
616 eq: syn!(Eq) >>
617 value: syn!(Expr) >>
618 semi: syn!(Semi) >>
David Tolnay47a877c2016-10-01 16:50:55 -0700619 (Item {
620 ident: id,
621 vis: vis,
622 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700623 node: ItemStatic {
624 ty: Box::new(ty),
625 mutbl: mutability,
626 expr: Box::new(value),
Alex Crichton954046c2017-05-30 21:49:42 -0700627 static_token: static_,
628 colon_token: colon,
629 eq_token: eq,
630 semi_token: semi,
Alex Crichton62a0a592017-05-22 13:58:53 -0700631 }.into(),
David Tolnay47a877c2016-10-01 16:50:55 -0700632 })
633 ));
634
635 named!(item_const -> Item, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700636 attrs: many0!(call!(Attribute::parse_outer)) >>
637 vis: syn!(Visibility) >>
638 const_: syn!(Const) >>
639 id: syn!(Ident) >>
640 colon: syn!(Colon) >>
641 ty: syn!(Ty) >>
642 eq: syn!(Eq) >>
643 value: syn!(Expr) >>
644 semi: syn!(Semi) >>
David Tolnay47a877c2016-10-01 16:50:55 -0700645 (Item {
646 ident: id,
647 vis: vis,
648 attrs: attrs,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700649 node: ItemConst {
650 ty: Box::new(ty),
651 expr: Box::new(value),
Alex Crichton954046c2017-05-30 21:49:42 -0700652 const_token: const_,
653 colon_token: colon,
654 eq_token: eq,
655 semi_token: semi,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700656 }.into(),
David Tolnay47a877c2016-10-01 16:50:55 -0700657 })
658 ));
659
David Tolnay42602292016-10-01 22:25:45 -0700660 named!(item_fn -> Item, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700661 outer_attrs: many0!(call!(Attribute::parse_outer)) >>
662 vis: syn!(Visibility) >>
663 constness: syn!(Constness) >>
664 unsafety: syn!(Unsafety) >>
665 abi: option!(syn!(Abi)) >>
666 fn_: syn!(Fn_) >>
667 name: syn!(Ident) >>
668 generics: syn!(Generics) >>
669 inputs: parens!(Delimited::parse_terminated) >>
670 ret: syn!(FunctionRetTy) >>
671 where_clause: syn!(WhereClause) >>
672 inner_attrs_stmts: braces!(tuple!(
673 many0!(call!(Attribute::parse_inner)),
674 call!(Block::parse_within)
Michael Layzell416724e2017-05-24 21:12:34 -0400675 )) >>
David Tolnay42602292016-10-01 22:25:45 -0700676 (Item {
677 ident: name,
678 vis: vis,
David Tolnay3b9783a2016-10-29 22:37:09 -0700679 attrs: {
680 let mut attrs = outer_attrs;
Alex Crichton954046c2017-05-30 21:49:42 -0700681 attrs.extend((inner_attrs_stmts.0).0);
David Tolnay3b9783a2016-10-29 22:37:09 -0700682 attrs
683 },
Alex Crichton62a0a592017-05-22 13:58:53 -0700684 node: ItemFn {
685 decl: Box::new(FnDecl {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700686 dot_tokens: None,
Alex Crichton954046c2017-05-30 21:49:42 -0700687 fn_token: fn_,
688 paren_token: inputs.1,
689 inputs: inputs.0,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700690 output: ret,
David Tolnay292e6002016-10-29 22:03:51 -0700691 variadic: false,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700692 generics: Generics {
693 where_clause: where_clause,
694 .. generics
695 },
David Tolnay42602292016-10-01 22:25:45 -0700696 }),
Alex Crichton62a0a592017-05-22 13:58:53 -0700697 unsafety: unsafety,
698 constness: constness,
699 abi: abi,
Alex Crichton62a0a592017-05-22 13:58:53 -0700700 block: Box::new(Block {
Alex Crichton954046c2017-05-30 21:49:42 -0700701 brace_token: inner_attrs_stmts.1,
702 stmts: (inner_attrs_stmts.0).1,
David Tolnay3b9783a2016-10-29 22:37:09 -0700703 }),
Alex Crichton62a0a592017-05-22 13:58:53 -0700704 }.into(),
David Tolnay42602292016-10-01 22:25:45 -0700705 })
706 ));
707
Alex Crichton954046c2017-05-30 21:49:42 -0700708 impl Synom for FnArg {
Michael Layzell92639a52017-06-01 00:07:44 -0400709 named!(parse -> Self, alt!(
710 do_parse!(
711 and: syn!(And) >>
712 lt: option!(syn!(Lifetime)) >>
713 mutability: syn!(Mutability) >>
714 self_: syn!(Self_) >>
715 not!(syn!(Colon)) >>
716 (ArgSelfRef {
717 lifetime: lt,
718 mutbl: mutability,
719 and_token: and,
720 self_token: self_,
721 }.into())
722 )
723 |
724 do_parse!(
725 mutability: syn!(Mutability) >>
726 self_: syn!(Self_) >>
727 not!(syn!(Colon)) >>
728 (ArgSelf {
729 mutbl: mutability,
730 self_token: self_,
731 }.into())
732 )
733 |
734 do_parse!(
735 pat: syn!(Pat) >>
736 colon: syn!(Colon) >>
737 ty: syn!(Ty) >>
738 (ArgCaptured {
739 pat: pat,
740 ty: ty,
741 colon_token: colon,
742 }.into())
743 )
744 |
745 syn!(Ty) => { FnArg::Ignored }
746 ));
Alex Crichton954046c2017-05-30 21:49:42 -0700747 }
David Tolnay62f374c2016-10-02 13:37:00 -0700748
David Tolnay35902302016-10-06 01:11:08 -0700749 named!(item_mod -> Item, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700750 outer_attrs: many0!(call!(Attribute::parse_outer)) >>
751 vis: syn!(Visibility) >>
752 mod_: syn!(Mod) >>
753 id: syn!(Ident) >>
David Tolnay7b8009b2016-10-25 22:36:00 -0700754 content: alt!(
Alex Crichton954046c2017-05-30 21:49:42 -0700755 syn!(Semi) => { Ok }
David Tolnay37d10332016-10-13 20:51:04 -0700756 |
Alex Crichton954046c2017-05-30 21:49:42 -0700757 braces!(
David Tolnay7b8009b2016-10-25 22:36:00 -0700758 tuple!(
Alex Crichton954046c2017-05-30 21:49:42 -0700759 many0!(call!(Attribute::parse_inner)),
760 many0!(syn!(Item))
Michael Layzell416724e2017-05-24 21:12:34 -0400761 )
Alex Crichton954046c2017-05-30 21:49:42 -0700762 ) => { Err }
David Tolnay37d10332016-10-13 20:51:04 -0700763 ) >>
David Tolnay7b8009b2016-10-25 22:36:00 -0700764 (match content {
Alex Crichton954046c2017-05-30 21:49:42 -0700765 Err(((inner_attrs, items), braces)) => Item {
David Tolnay7b8009b2016-10-25 22:36:00 -0700766 ident: id,
767 vis: vis,
768 attrs: {
769 let mut attrs = outer_attrs;
770 attrs.extend(inner_attrs);
771 attrs
772 },
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700773 node: ItemMod {
Alex Crichton954046c2017-05-30 21:49:42 -0700774 mod_token: mod_,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700775 semi_token: None,
Alex Crichton954046c2017-05-30 21:49:42 -0700776 items: Some((items, braces)),
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700777 }.into(),
David Tolnay7b8009b2016-10-25 22:36:00 -0700778 },
Alex Crichton954046c2017-05-30 21:49:42 -0700779 Ok(semi) => Item {
David Tolnay7b8009b2016-10-25 22:36:00 -0700780 ident: id,
781 vis: vis,
782 attrs: outer_attrs,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700783 node: ItemMod {
784 items: None,
Alex Crichton954046c2017-05-30 21:49:42 -0700785 mod_token: mod_,
786 semi_token: Some(semi),
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700787 }.into(),
David Tolnay7b8009b2016-10-25 22:36:00 -0700788 },
David Tolnay35902302016-10-06 01:11:08 -0700789 })
790 ));
791
792 named!(item_foreign_mod -> Item, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700793 attrs: many0!(call!(Attribute::parse_outer)) >>
794 abi: syn!(Abi) >>
795 items: braces!(many0!(syn!(ForeignItem))) >>
David Tolnay35902302016-10-06 01:11:08 -0700796 (Item {
797 ident: "".into(),
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700798 vis: VisInherited {}.into(),
David Tolnay35902302016-10-06 01:11:08 -0700799 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700800 node: ItemForeignMod {
Alex Crichton954046c2017-05-30 21:49:42 -0700801 brace_token: items.1,
David Tolnayb8d8ef52016-10-29 14:30:08 -0700802 abi: abi,
Alex Crichton954046c2017-05-30 21:49:42 -0700803 items: items.0,
Alex Crichton62a0a592017-05-22 13:58:53 -0700804 }.into(),
David Tolnay35902302016-10-06 01:11:08 -0700805 })
806 ));
807
Alex Crichton954046c2017-05-30 21:49:42 -0700808 impl Synom for ForeignItem {
Michael Layzell92639a52017-06-01 00:07:44 -0400809 named!(parse -> Self, alt!(
810 foreign_fn
811 |
812 foreign_static
813 ));
Alex Crichton954046c2017-05-30 21:49:42 -0700814 }
David Tolnay35902302016-10-06 01:11:08 -0700815
816 named!(foreign_fn -> ForeignItem, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700817 attrs: many0!(call!(Attribute::parse_outer)) >>
818 vis: syn!(Visibility) >>
819 fn_: syn!(Fn_) >>
820 name: syn!(Ident) >>
821 generics: syn!(Generics) >>
822 inputs: parens!(do_parse!(
823 args: call!(Delimited::parse_terminated) >>
824 variadic: cond!(args.is_empty() || args.trailing_delim(),
825 option!(syn!(Dot3))) >>
826 (args, variadic)
827 )) >>
828 ret: syn!(FunctionRetTy) >>
829 where_clause: syn!(WhereClause) >>
830 semi: syn!(Semi) >>
831 ({
832 let ((inputs, variadic), parens) = inputs;
833 let variadic = variadic.and_then(|v| v);
834 ForeignItem {
835 ident: name,
836 attrs: attrs,
837 semi_token: semi,
838 node: ForeignItemFn {
839 decl: Box::new(FnDecl {
840 fn_token: fn_,
841 paren_token: parens,
842 inputs: inputs,
843 variadic: variadic.is_some(),
844 dot_tokens: variadic,
845 output: ret,
846 generics: Generics {
847 where_clause: where_clause,
848 .. generics
849 },
850 }),
851 }.into(),
852 vis: vis,
853 }
David Tolnay35902302016-10-06 01:11:08 -0700854 })
855 ));
856
857 named!(foreign_static -> ForeignItem, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700858 attrs: many0!(call!(Attribute::parse_outer)) >>
859 vis: syn!(Visibility) >>
860 static_: syn!(Static) >>
861 mutability: syn!(Mutability) >>
862 id: syn!(Ident) >>
863 colon: syn!(Colon) >>
864 ty: syn!(Ty) >>
865 semi: syn!(Semi) >>
David Tolnay35902302016-10-06 01:11:08 -0700866 (ForeignItem {
867 ident: id,
868 attrs: attrs,
Alex Crichton954046c2017-05-30 21:49:42 -0700869 semi_token: semi,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700870 node: ForeignItemStatic {
871 ty: Box::new(ty),
872 mutbl: mutability,
Alex Crichton954046c2017-05-30 21:49:42 -0700873 static_token: static_,
874 colon_token: colon,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700875 }.into(),
David Tolnay35902302016-10-06 01:11:08 -0700876 vis: vis,
877 })
878 ));
879
David Tolnay3cf52982016-10-01 17:11:37 -0700880 named!(item_ty -> Item, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700881 attrs: many0!(call!(Attribute::parse_outer)) >>
882 vis: syn!(Visibility) >>
883 type_: syn!(Type) >>
884 id: syn!(Ident) >>
885 generics: syn!(Generics) >>
886 where_clause: syn!(WhereClause) >>
887 eq: syn!(Eq) >>
888 ty: syn!(Ty) >>
889 semi: syn!(Semi) >>
David Tolnay3cf52982016-10-01 17:11:37 -0700890 (Item {
891 ident: id,
892 vis: vis,
893 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700894 node: ItemTy {
Alex Crichton954046c2017-05-30 21:49:42 -0700895 type_token: type_,
896 eq_token: eq,
897 semi_token: semi,
Alex Crichton62a0a592017-05-22 13:58:53 -0700898 ty: Box::new(ty),
899 generics: Generics {
David Tolnay04bb3ad2016-10-30 10:59:01 -0700900 where_clause: where_clause,
901 ..generics
902 },
Alex Crichton62a0a592017-05-22 13:58:53 -0700903 }.into(),
David Tolnay3cf52982016-10-01 17:11:37 -0700904 })
905 ));
906
David Tolnaya96a3fa2016-09-24 07:17:42 -0700907 named!(item_struct_or_enum -> Item, map!(
Alex Crichton954046c2017-05-30 21:49:42 -0700908 syn!(DeriveInput),
David Tolnay0e837402016-12-22 17:25:55 -0500909 |def: DeriveInput| Item {
David Tolnayedf2b992016-09-23 20:43:45 -0700910 ident: def.ident,
911 vis: def.vis,
912 attrs: def.attrs,
913 node: match def.body {
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700914 Body::Enum(data) => {
915 ItemEnum {
916 variants: data.variants,
917 brace_token: data.brace_token,
918 enum_token: data.enum_token,
919 generics: def.generics,
920 }.into()
David Tolnayedf2b992016-09-23 20:43:45 -0700921 }
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700922 Body::Struct(data) => {
923 ItemStruct {
924 data: data.data,
925 struct_token: data.struct_token,
926 semi_token: data.semi_token,
927 generics: def.generics,
928 }.into()
David Tolnayedf2b992016-09-23 20:43:45 -0700929 }
930 }
931 }
932 ));
David Tolnay42602292016-10-01 22:25:45 -0700933
David Tolnay2f9fa632016-10-03 22:08:48 -0700934 named!(item_union -> Item, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700935 attrs: many0!(call!(Attribute::parse_outer)) >>
936 vis: syn!(Visibility) >>
937 union_: syn!(Union) >>
938 id: syn!(Ident) >>
939 generics: syn!(Generics) >>
940 where_clause: syn!(WhereClause) >>
941 fields: braces!(call!(Delimited::parse_terminated_with,
942 Field::parse_struct)) >>
David Tolnay2f9fa632016-10-03 22:08:48 -0700943 (Item {
944 ident: id,
945 vis: vis,
946 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700947 node: ItemUnion {
Alex Crichton954046c2017-05-30 21:49:42 -0700948 union_token: union_,
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700949 data: VariantData::Struct(fields.0, fields.1),
Alex Crichton62a0a592017-05-22 13:58:53 -0700950 generics: Generics {
David Tolnay2f9fa632016-10-03 22:08:48 -0700951 where_clause: where_clause,
952 .. generics
953 },
Alex Crichton62a0a592017-05-22 13:58:53 -0700954 }.into(),
David Tolnay2f9fa632016-10-03 22:08:48 -0700955 })
956 ));
957
David Tolnay0aecb732016-10-03 23:03:50 -0700958 named!(item_trait -> Item, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700959 attrs: many0!(call!(Attribute::parse_outer)) >>
960 vis: syn!(Visibility) >>
961 unsafety: syn!(Unsafety) >>
962 trait_: syn!(Trait) >>
963 id: syn!(Ident) >>
964 generics: syn!(Generics) >>
965 colon: option!(syn!(Colon)) >>
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700966 bounds: cond!(colon.is_some(),
Alex Crichton954046c2017-05-30 21:49:42 -0700967 call!(Delimited::parse_separated_nonempty)
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700968 ) >>
Alex Crichton954046c2017-05-30 21:49:42 -0700969 where_clause: syn!(WhereClause) >>
970 body: braces!(many0!(syn!(TraitItem))) >>
David Tolnay0aecb732016-10-03 23:03:50 -0700971 (Item {
972 ident: id,
973 vis: vis,
974 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700975 node: ItemTrait {
Alex Crichton954046c2017-05-30 21:49:42 -0700976 trait_token: trait_,
977 brace_token: body.1,
978 colon_token: colon,
Alex Crichton62a0a592017-05-22 13:58:53 -0700979 unsafety: unsafety,
980 generics: Generics {
David Tolnay0aecb732016-10-03 23:03:50 -0700981 where_clause: where_clause,
982 .. generics
983 },
Alex Crichtonccbb45d2017-05-23 10:58:24 -0700984 supertraits: bounds.unwrap_or_default(),
Alex Crichton954046c2017-05-30 21:49:42 -0700985 items: body.0,
Alex Crichton62a0a592017-05-22 13:58:53 -0700986 }.into(),
David Tolnay0aecb732016-10-03 23:03:50 -0700987 })
988 ));
989
David Tolnayf94e2362016-10-04 00:29:51 -0700990 named!(item_default_impl -> Item, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -0700991 attrs: many0!(call!(Attribute::parse_outer)) >>
992 unsafety: syn!(Unsafety) >>
993 impl_: syn!(Impl) >>
994 path: syn!(Path) >>
995 for_: syn!(For) >>
996 dot2: syn!(Dot2) >>
997 braces: braces!(epsilon!()) >>
David Tolnayf94e2362016-10-04 00:29:51 -0700998 (Item {
999 ident: "".into(),
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001000 vis: VisInherited {}.into(),
David Tolnayf94e2362016-10-04 00:29:51 -07001001 attrs: attrs,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001002 node: ItemDefaultImpl {
1003 unsafety: unsafety,
1004 path: path,
Alex Crichton954046c2017-05-30 21:49:42 -07001005 impl_token: impl_,
1006 for_token: for_,
1007 dot2_token: dot2,
1008 brace_token: braces.1,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001009 }.into(),
David Tolnayf94e2362016-10-04 00:29:51 -07001010 })
1011 ));
1012
Alex Crichton954046c2017-05-30 21:49:42 -07001013 impl Synom for TraitItem {
Michael Layzell92639a52017-06-01 00:07:44 -04001014 named!(parse -> Self, alt!(
1015 trait_item_const
1016 |
1017 trait_item_method
1018 |
1019 trait_item_type
1020 |
1021 trait_item_mac
1022 ));
Alex Crichton954046c2017-05-30 21:49:42 -07001023 }
David Tolnay0aecb732016-10-03 23:03:50 -07001024
1025 named!(trait_item_const -> TraitItem, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -07001026 attrs: many0!(call!(Attribute::parse_outer)) >>
1027 const_: syn!(Const) >>
1028 id: syn!(Ident) >>
1029 colon: syn!(Colon) >>
1030 ty: syn!(Ty) >>
1031 value: option!(tuple!(syn!(Eq), syn!(Expr))) >>
1032 semi: syn!(Semi) >>
David Tolnay0aecb732016-10-03 23:03:50 -07001033 (TraitItem {
1034 ident: id,
1035 attrs: attrs,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001036 node: TraitItemConst {
1037 ty: ty,
Alex Crichton954046c2017-05-30 21:49:42 -07001038 const_token: const_,
1039 colon_token: colon,
1040 eq_token: value.as_ref().map(|p| Eq((p.0).0)),
1041 default: value.map(|p| p.1),
1042 semi_token: semi,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001043 }.into(),
David Tolnay0aecb732016-10-03 23:03:50 -07001044 })
1045 ));
1046
1047 named!(trait_item_method -> TraitItem, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -07001048 outer_attrs: many0!(call!(Attribute::parse_outer)) >>
1049 constness: syn!(Constness) >>
1050 unsafety: syn!(Unsafety) >>
1051 abi: option!(syn!(Abi)) >>
1052 fn_: syn!(Fn_) >>
1053 name: syn!(Ident) >>
1054 generics: syn!(Generics) >>
1055 inputs: parens!(call!(Delimited::parse_terminated)) >>
1056 ret: syn!(FunctionRetTy) >>
1057 where_clause: syn!(WhereClause) >>
1058 body: option!(braces!(
1059 tuple!(many0!(call!(Attribute::parse_inner)),
1060 call!(Block::parse_within))
David Tolnay5859df12016-10-29 22:49:54 -07001061 )) >>
Alex Crichton954046c2017-05-30 21:49:42 -07001062 semi: cond!(body.is_none(), syn!(Semi)) >>
David Tolnay5859df12016-10-29 22:49:54 -07001063 ({
1064 let (inner_attrs, stmts) = match body {
Alex Crichton954046c2017-05-30 21:49:42 -07001065 Some(((inner_attrs, stmts), b)) => (inner_attrs, Some((stmts, b))),
David Tolnay5859df12016-10-29 22:49:54 -07001066 None => (Vec::new(), None),
1067 };
1068 TraitItem {
1069 ident: name,
1070 attrs: {
1071 let mut attrs = outer_attrs;
1072 attrs.extend(inner_attrs);
1073 attrs
David Tolnay0aecb732016-10-03 23:03:50 -07001074 },
Alex Crichton62a0a592017-05-22 13:58:53 -07001075 node: TraitItemMethod {
Alex Crichton954046c2017-05-30 21:49:42 -07001076 semi_token: semi,
Alex Crichton62a0a592017-05-22 13:58:53 -07001077 sig: MethodSig {
David Tolnay5859df12016-10-29 22:49:54 -07001078 unsafety: unsafety,
1079 constness: constness,
1080 abi: abi,
1081 decl: FnDecl {
Alex Crichton954046c2017-05-30 21:49:42 -07001082 inputs: inputs.0,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001083 output: ret,
David Tolnay5859df12016-10-29 22:49:54 -07001084 variadic: false,
Alex Crichton954046c2017-05-30 21:49:42 -07001085 fn_token: fn_,
1086 paren_token: inputs.1,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001087 dot_tokens: None,
1088 generics: Generics {
1089 where_clause: where_clause,
1090 .. generics
1091 },
David Tolnay5859df12016-10-29 22:49:54 -07001092 },
1093 },
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001094 default: stmts.map(|stmts| {
1095 Block {
Alex Crichton954046c2017-05-30 21:49:42 -07001096 stmts: stmts.0,
1097 brace_token: stmts.1,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001098 }
1099 }),
Alex Crichton62a0a592017-05-22 13:58:53 -07001100 }.into(),
David Tolnay5859df12016-10-29 22:49:54 -07001101 }
David Tolnay0aecb732016-10-03 23:03:50 -07001102 })
1103 ));
1104
1105 named!(trait_item_type -> TraitItem, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -07001106 attrs: many0!(call!(Attribute::parse_outer)) >>
1107 type_: syn!(Type) >>
1108 id: syn!(Ident) >>
1109 colon: option!(syn!(Colon)) >>
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001110 bounds: cond!(colon.is_some(),
Alex Crichton954046c2017-05-30 21:49:42 -07001111 call!(Delimited::parse_separated_nonempty)
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001112 ) >>
Alex Crichton954046c2017-05-30 21:49:42 -07001113 default: option!(tuple!(syn!(Eq), syn!(Ty))) >>
1114 semi: syn!(Semi) >>
David Tolnay0aecb732016-10-03 23:03:50 -07001115 (TraitItem {
1116 ident: id,
1117 attrs: attrs,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001118 node: TraitItemType {
Alex Crichton954046c2017-05-30 21:49:42 -07001119 type_token: type_,
1120 colon_token: colon,
1121 eq_token: default.as_ref().map(|p| Eq((p.0).0)),
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001122 bounds: bounds.unwrap_or_default(),
Alex Crichton954046c2017-05-30 21:49:42 -07001123 semi_token: semi,
1124 default: default.map(|p| p.1),
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001125 }.into(),
David Tolnay0aecb732016-10-03 23:03:50 -07001126 })
1127 ));
1128
1129 named!(trait_item_mac -> TraitItem, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -07001130 attrs: many0!(call!(Attribute::parse_outer)) >>
1131 mac: syn!(Mac) >>
1132 cond!(!mac.is_braced(), syn!(Semi)) >>
David Tolnay0aecb732016-10-03 23:03:50 -07001133 (TraitItem {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001134 ident: "".into(),
David Tolnay0aecb732016-10-03 23:03:50 -07001135 attrs: attrs,
Alex Crichton954046c2017-05-30 21:49:42 -07001136 node: TraitItemKind::Macro(mac),
David Tolnay0aecb732016-10-03 23:03:50 -07001137 })
1138 ));
1139
David Tolnay4c9be372016-10-06 00:47:37 -07001140 named!(item_impl -> Item, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -07001141 attrs: many0!(call!(Attribute::parse_outer)) >>
1142 unsafety: syn!(Unsafety) >>
1143 impl_: syn!(Impl) >>
1144 generics: syn!(Generics) >>
David Tolnay4c9be372016-10-06 00:47:37 -07001145 polarity_path: alt!(
1146 do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -07001147 polarity: syn!(ImplPolarity) >>
1148 path: syn!(Path) >>
1149 for_: syn!(For) >>
1150 (polarity, Some(path), Some(for_))
David Tolnay4c9be372016-10-06 00:47:37 -07001151 )
1152 |
Alex Crichton954046c2017-05-30 21:49:42 -07001153 epsilon!() => { |_| (ImplPolarity::Positive, None, None) }
David Tolnay4c9be372016-10-06 00:47:37 -07001154 ) >>
Alex Crichton954046c2017-05-30 21:49:42 -07001155 self_ty: syn!(Ty) >>
1156 where_clause: syn!(WhereClause) >>
1157 body: braces!(many0!(syn!(ImplItem))) >>
David Tolnay4c9be372016-10-06 00:47:37 -07001158 (Item {
1159 ident: "".into(),
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001160 vis: VisInherited {}.into(),
David Tolnay4c9be372016-10-06 00:47:37 -07001161 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -07001162 node: ItemImpl {
Alex Crichton954046c2017-05-30 21:49:42 -07001163 impl_token: impl_,
1164 brace_token: body.1,
1165 for_token: polarity_path.2,
Alex Crichton62a0a592017-05-22 13:58:53 -07001166 unsafety: unsafety,
1167 polarity: polarity_path.0,
1168 generics: Generics {
David Tolnay4c9be372016-10-06 00:47:37 -07001169 where_clause: where_clause,
1170 .. generics
1171 },
Alex Crichton62a0a592017-05-22 13:58:53 -07001172 trait_: polarity_path.1,
1173 self_ty: Box::new(self_ty),
Alex Crichton954046c2017-05-30 21:49:42 -07001174 items: body.0,
Alex Crichton62a0a592017-05-22 13:58:53 -07001175 }.into(),
David Tolnay4c9be372016-10-06 00:47:37 -07001176 })
1177 ));
1178
Alex Crichton954046c2017-05-30 21:49:42 -07001179 impl Synom for ImplItem {
Michael Layzell92639a52017-06-01 00:07:44 -04001180 named!(parse -> Self, alt!(
1181 impl_item_const
1182 |
1183 impl_item_method
1184 |
1185 impl_item_type
1186 |
1187 impl_item_macro
1188 ));
Alex Crichton954046c2017-05-30 21:49:42 -07001189 }
David Tolnay4c9be372016-10-06 00:47:37 -07001190
1191 named!(impl_item_const -> ImplItem, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -07001192 attrs: many0!(call!(Attribute::parse_outer)) >>
1193 vis: syn!(Visibility) >>
1194 defaultness: syn!(Defaultness) >>
1195 const_: syn!(Const) >>
1196 id: syn!(Ident) >>
1197 colon: syn!(Colon) >>
1198 ty: syn!(Ty) >>
1199 eq: syn!(Eq) >>
1200 value: syn!(Expr) >>
1201 semi: syn!(Semi) >>
David Tolnay4c9be372016-10-06 00:47:37 -07001202 (ImplItem {
1203 ident: id,
1204 vis: vis,
1205 defaultness: defaultness,
1206 attrs: attrs,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001207 node: ImplItemConst {
1208 ty: ty,
1209 expr: value,
Alex Crichton954046c2017-05-30 21:49:42 -07001210 const_token: const_,
1211 colon_token: colon,
1212 eq_token: eq,
1213 semi_token: semi,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001214 }.into(),
David Tolnay4c9be372016-10-06 00:47:37 -07001215 })
1216 ));
1217
1218 named!(impl_item_method -> ImplItem, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -07001219 outer_attrs: many0!(call!(Attribute::parse_outer)) >>
1220 vis: syn!(Visibility) >>
1221 defaultness: syn!(Defaultness) >>
1222 constness: syn!(Constness) >>
1223 unsafety: syn!(Unsafety) >>
1224 abi: option!(syn!(Abi)) >>
1225 fn_: syn!(Fn_) >>
1226 name: syn!(Ident) >>
1227 generics: syn!(Generics) >>
1228 inputs: parens!(call!(Delimited::parse_terminated)) >>
1229 ret: syn!(FunctionRetTy) >>
1230 where_clause: syn!(WhereClause) >>
1231 inner_attrs_stmts: braces!(tuple!(
1232 many0!(call!(Attribute::parse_inner)),
1233 call!(Block::parse_within)
Michael Layzell416724e2017-05-24 21:12:34 -04001234 )) >>
David Tolnay4c9be372016-10-06 00:47:37 -07001235 (ImplItem {
1236 ident: name,
1237 vis: vis,
1238 defaultness: defaultness,
David Tolnay3b9783a2016-10-29 22:37:09 -07001239 attrs: {
1240 let mut attrs = outer_attrs;
Alex Crichton954046c2017-05-30 21:49:42 -07001241 attrs.extend((inner_attrs_stmts.0).0);
David Tolnay3b9783a2016-10-29 22:37:09 -07001242 attrs
1243 },
Alex Crichton62a0a592017-05-22 13:58:53 -07001244 node: ImplItemMethod {
1245 sig: MethodSig {
David Tolnay4c9be372016-10-06 00:47:37 -07001246 unsafety: unsafety,
1247 constness: constness,
David Tolnayb8d8ef52016-10-29 14:30:08 -07001248 abi: abi,
David Tolnay4c9be372016-10-06 00:47:37 -07001249 decl: FnDecl {
Alex Crichton954046c2017-05-30 21:49:42 -07001250 fn_token: fn_,
1251 paren_token: inputs.1,
1252 inputs: inputs.0,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001253 output: ret,
David Tolnay292e6002016-10-29 22:03:51 -07001254 variadic: false,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001255 generics: Generics {
1256 where_clause: where_clause,
1257 .. generics
1258 },
1259 dot_tokens: None,
David Tolnay4c9be372016-10-06 00:47:37 -07001260 },
1261 },
Alex Crichton62a0a592017-05-22 13:58:53 -07001262 block: Block {
Alex Crichton954046c2017-05-30 21:49:42 -07001263 brace_token: inner_attrs_stmts.1,
1264 stmts: (inner_attrs_stmts.0).1,
David Tolnay3b9783a2016-10-29 22:37:09 -07001265 },
Alex Crichton62a0a592017-05-22 13:58:53 -07001266 }.into(),
David Tolnay4c9be372016-10-06 00:47:37 -07001267 })
1268 ));
1269
1270 named!(impl_item_type -> ImplItem, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -07001271 attrs: many0!(call!(Attribute::parse_outer)) >>
1272 vis: syn!(Visibility) >>
1273 defaultness: syn!(Defaultness) >>
1274 type_: syn!(Type) >>
1275 id: syn!(Ident) >>
1276 eq: syn!(Eq) >>
1277 ty: syn!(Ty) >>
1278 semi: syn!(Semi) >>
David Tolnay4c9be372016-10-06 00:47:37 -07001279 (ImplItem {
1280 ident: id,
1281 vis: vis,
1282 defaultness: defaultness,
1283 attrs: attrs,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001284 node: ImplItemType {
Alex Crichton954046c2017-05-30 21:49:42 -07001285 type_token: type_,
1286 eq_token: eq,
1287 semi_token: semi,
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001288 ty: ty,
1289 }.into(),
David Tolnay4c9be372016-10-06 00:47:37 -07001290 })
1291 ));
1292
1293 named!(impl_item_macro -> ImplItem, do_parse!(
Alex Crichton954046c2017-05-30 21:49:42 -07001294 attrs: many0!(call!(Attribute::parse_outer)) >>
1295 mac: syn!(Mac) >>
1296 cond!(!mac.is_braced(), syn!(Semi)) >>
David Tolnay4c9be372016-10-06 00:47:37 -07001297 (ImplItem {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001298 ident: "".into(),
1299 vis: VisInherited {}.into(),
David Tolnay4c9be372016-10-06 00:47:37 -07001300 defaultness: Defaultness::Final,
1301 attrs: attrs,
Alex Crichton954046c2017-05-30 21:49:42 -07001302 node: ImplItemKind::Macro(mac),
David Tolnay4c9be372016-10-06 00:47:37 -07001303 })
1304 ));
1305
Alex Crichton954046c2017-05-30 21:49:42 -07001306 impl Synom for ImplPolarity {
Michael Layzell92639a52017-06-01 00:07:44 -04001307 named!(parse -> Self, alt!(
1308 syn!(Bang) => { ImplPolarity::Negative }
1309 |
1310 epsilon!() => { |_| ImplPolarity::Positive }
1311 ));
Alex Crichton954046c2017-05-30 21:49:42 -07001312 }
David Tolnay4c9be372016-10-06 00:47:37 -07001313
Alex Crichton954046c2017-05-30 21:49:42 -07001314 impl Synom for Constness {
Michael Layzell92639a52017-06-01 00:07:44 -04001315 named!(parse -> Self, alt!(
1316 syn!(Const) => { Constness::Const }
1317 |
1318 epsilon!() => { |_| Constness::NotConst }
1319 ));
Alex Crichton954046c2017-05-30 21:49:42 -07001320 }
David Tolnay42602292016-10-01 22:25:45 -07001321
Alex Crichton954046c2017-05-30 21:49:42 -07001322 impl Synom for Defaultness {
Michael Layzell92639a52017-06-01 00:07:44 -04001323 named!(parse -> Self, alt!(
1324 syn!(Default_) => { Defaultness::Default }
1325 |
1326 epsilon!() => { |_| Defaultness::Final }
1327 ));
Alex Crichton954046c2017-05-30 21:49:42 -07001328 }
David Tolnayedf2b992016-09-23 20:43:45 -07001329}
David Tolnay4a51dc72016-10-01 00:40:31 -07001330
1331#[cfg(feature = "printing")]
1332mod printing {
1333 use super::*;
1334 use attr::FilterAttrs;
David Tolnay47a877c2016-10-01 16:50:55 -07001335 use data::VariantData;
David Tolnay4a51dc72016-10-01 00:40:31 -07001336 use quote::{Tokens, ToTokens};
1337
1338 impl ToTokens for Item {
1339 fn to_tokens(&self, tokens: &mut Tokens) {
David Tolnayca085422016-10-04 00:12:38 -07001340 tokens.append_all(self.attrs.outer());
David Tolnay4a51dc72016-10-01 00:40:31 -07001341 match self.node {
Alex Crichton62a0a592017-05-22 13:58:53 -07001342 ItemKind::ExternCrate(ref item) => {
David Tolnaycbd9f7d2016-10-30 00:26:29 -07001343 self.vis.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001344 item.extern_token.to_tokens(tokens);
1345 item.crate_token.to_tokens(tokens);
1346 item.original.to_tokens(tokens);
1347 item.as_token.to_tokens(tokens);
David Tolnay4a51dc72016-10-01 00:40:31 -07001348 self.ident.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001349 item.semi_token.to_tokens(tokens);
David Tolnay4a51dc72016-10-01 00:40:31 -07001350 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001351 ItemKind::Use(ref item) => {
David Tolnay4a057422016-10-08 00:02:31 -07001352 self.vis.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001353 item.use_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001354 item.path.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001355 item.semi_token.to_tokens(tokens);
David Tolnay4a057422016-10-08 00:02:31 -07001356 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001357 ItemKind::Static(ref item) => {
David Tolnay47a877c2016-10-01 16:50:55 -07001358 self.vis.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001359 item.static_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001360 item.mutbl.to_tokens(tokens);
David Tolnay47a877c2016-10-01 16:50:55 -07001361 self.ident.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001362 item.colon_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001363 item.ty.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001364 item.eq_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001365 item.expr.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001366 item.semi_token.to_tokens(tokens);
David Tolnay47a877c2016-10-01 16:50:55 -07001367 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001368 ItemKind::Const(ref item) => {
David Tolnay47a877c2016-10-01 16:50:55 -07001369 self.vis.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001370 item.const_token.to_tokens(tokens);
David Tolnay47a877c2016-10-01 16:50:55 -07001371 self.ident.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001372 item.colon_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001373 item.ty.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001374 item.eq_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001375 item.expr.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001376 item.semi_token.to_tokens(tokens);
David Tolnay47a877c2016-10-01 16:50:55 -07001377 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001378 ItemKind::Fn(ref item) => {
David Tolnay42602292016-10-01 22:25:45 -07001379 self.vis.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001380 item.constness.to_tokens(tokens);
1381 item.unsafety.to_tokens(tokens);
1382 item.abi.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001383 NamedDecl(&item.decl, &self.ident).to_tokens(tokens);
1384 item.block.brace_token.surround(tokens, |tokens| {
1385 tokens.append_all(self.attrs.inner());
1386 tokens.append_all(&item.block.stmts);
1387 });
David Tolnay42602292016-10-01 22:25:45 -07001388 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001389 ItemKind::Mod(ref item) => {
David Tolnay35902302016-10-06 01:11:08 -07001390 self.vis.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001391 item.mod_token.to_tokens(tokens);
David Tolnay35902302016-10-06 01:11:08 -07001392 self.ident.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001393 if let Some((ref items, ref brace)) = item.items {
1394 brace.surround(tokens, |tokens| {
David Tolnay7b8009b2016-10-25 22:36:00 -07001395 tokens.append_all(self.attrs.inner());
David Tolnay37d10332016-10-13 20:51:04 -07001396 tokens.append_all(items);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001397 });
David Tolnay37d10332016-10-13 20:51:04 -07001398 }
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001399 item.semi_token.to_tokens(tokens);
David Tolnay35902302016-10-06 01:11:08 -07001400 }
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001401 ItemKind::ForeignMod(ref item) => {
David Tolnay35902302016-10-06 01:11:08 -07001402 self.vis.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001403 item.abi.to_tokens(tokens);
1404 item.brace_token.surround(tokens, |tokens| {
1405 tokens.append_all(&item.items);
1406 });
David Tolnay35902302016-10-06 01:11:08 -07001407 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001408 ItemKind::Ty(ref item) => {
David Tolnay3cf52982016-10-01 17:11:37 -07001409 self.vis.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001410 item.type_token.to_tokens(tokens);
David Tolnay3cf52982016-10-01 17:11:37 -07001411 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001412 item.generics.to_tokens(tokens);
1413 item.generics.where_clause.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001414 item.eq_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001415 item.ty.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001416 item.semi_token.to_tokens(tokens);
David Tolnay3cf52982016-10-01 17:11:37 -07001417 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001418 ItemKind::Enum(ref item) => {
David Tolnay47a877c2016-10-01 16:50:55 -07001419 self.vis.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001420 item.enum_token.to_tokens(tokens);
David Tolnay4a51dc72016-10-01 00:40:31 -07001421 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001422 item.generics.to_tokens(tokens);
1423 item.generics.where_clause.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001424 item.brace_token.surround(tokens, |tokens| {
1425 item.variants.to_tokens(tokens);
1426 });
David Tolnay4a51dc72016-10-01 00:40:31 -07001427 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001428 ItemKind::Struct(ref item) => {
David Tolnay47a877c2016-10-01 16:50:55 -07001429 self.vis.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001430 item.struct_token.to_tokens(tokens);
David Tolnay4a51dc72016-10-01 00:40:31 -07001431 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001432 item.generics.to_tokens(tokens);
1433 match item.data {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001434 VariantData::Struct(..) => {
Alex Crichton62a0a592017-05-22 13:58:53 -07001435 item.generics.where_clause.to_tokens(tokens);
1436 item.data.to_tokens(tokens);
David Tolnaydaaf7742016-10-03 11:11:43 -07001437 }
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001438 VariantData::Tuple(..) => {
Alex Crichton62a0a592017-05-22 13:58:53 -07001439 item.data.to_tokens(tokens);
1440 item.generics.where_clause.to_tokens(tokens);
David Tolnay28c1db62016-10-27 22:48:18 -07001441 }
1442 VariantData::Unit => {
Alex Crichton62a0a592017-05-22 13:58:53 -07001443 item.generics.where_clause.to_tokens(tokens);
David Tolnay28c1db62016-10-27 22:48:18 -07001444 }
David Tolnay4a51dc72016-10-01 00:40:31 -07001445 }
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001446 item.semi_token.to_tokens(tokens);
David Tolnay4a51dc72016-10-01 00:40:31 -07001447 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001448 ItemKind::Union(ref item) => {
David Tolnay2f9fa632016-10-03 22:08:48 -07001449 self.vis.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001450 item.union_token.to_tokens(tokens);
David Tolnay2f9fa632016-10-03 22:08:48 -07001451 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001452 item.generics.to_tokens(tokens);
1453 item.generics.where_clause.to_tokens(tokens);
1454 item.data.to_tokens(tokens);
David Tolnay2f9fa632016-10-03 22:08:48 -07001455 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001456 ItemKind::Trait(ref item) => {
David Tolnayca085422016-10-04 00:12:38 -07001457 self.vis.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001458 item.unsafety.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001459 item.trait_token.to_tokens(tokens);
David Tolnayca085422016-10-04 00:12:38 -07001460 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001461 item.generics.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001462 item.colon_token.to_tokens(tokens);
1463 item.supertraits.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001464 item.generics.where_clause.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001465 item.brace_token.surround(tokens, |tokens| {
1466 tokens.append_all(&item.items);
1467 });
David Tolnayca085422016-10-04 00:12:38 -07001468 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001469 ItemKind::DefaultImpl(ref item) => {
1470 item.unsafety.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001471 item.impl_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001472 item.path.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001473 item.for_token.to_tokens(tokens);
1474 item.dot2_token.to_tokens(tokens);
1475 item.brace_token.surround(tokens, |_tokens| {});
David Tolnayf94e2362016-10-04 00:29:51 -07001476 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001477 ItemKind::Impl(ref item) => {
1478 item.unsafety.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001479 item.impl_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001480 item.generics.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001481 item.polarity.to_tokens(tokens);
1482 item.trait_.to_tokens(tokens);
1483 item.for_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001484 item.self_ty.to_tokens(tokens);
1485 item.generics.where_clause.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001486 item.brace_token.surround(tokens, |tokens| {
1487 tokens.append_all(&item.items);
1488 });
David Tolnay4c9be372016-10-06 00:47:37 -07001489 }
David Tolnaycc3d66e2016-10-02 23:36:05 -07001490 ItemKind::Mac(ref mac) => {
1491 mac.path.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001492 mac.bang_token.to_tokens(tokens);
David Tolnaycc3d66e2016-10-02 23:36:05 -07001493 self.ident.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001494 tokens.append_all(&mac.tokens);
1495 if !mac.is_braced() {
1496 tokens::Semi::default().to_tokens(tokens);
David Tolnaycc3d66e2016-10-02 23:36:05 -07001497 }
1498 }
David Tolnay4a51dc72016-10-01 00:40:31 -07001499 }
1500 }
1501 }
David Tolnay42602292016-10-01 22:25:45 -07001502
Alex Crichton62a0a592017-05-22 13:58:53 -07001503 impl ToTokens for PathSimple {
David Tolnay4a057422016-10-08 00:02:31 -07001504 fn to_tokens(&self, tokens: &mut Tokens) {
Alex Crichton62a0a592017-05-22 13:58:53 -07001505 self.path.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001506 self.as_token.to_tokens(tokens);
1507 self.rename.to_tokens(tokens);
David Tolnay4a057422016-10-08 00:02:31 -07001508 }
1509 }
1510
Alex Crichton62a0a592017-05-22 13:58:53 -07001511 impl ToTokens for PathGlob {
1512 fn to_tokens(&self, tokens: &mut Tokens) {
1513 self.path.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001514 self.colon2_token.to_tokens(tokens);
1515 self.star_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001516 }
1517 }
1518
1519 impl ToTokens for PathList {
1520 fn to_tokens(&self, tokens: &mut Tokens) {
1521 self.path.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001522 self.colon2_token.to_tokens(tokens);
1523 self.brace_token.surround(tokens, |tokens| {
1524 self.items.to_tokens(tokens);
1525 });
Alex Crichton62a0a592017-05-22 13:58:53 -07001526 }
1527 }
1528
David Tolnay4a057422016-10-08 00:02:31 -07001529 impl ToTokens for PathListItem {
1530 fn to_tokens(&self, tokens: &mut Tokens) {
1531 self.name.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001532 self.as_token.to_tokens(tokens);
1533 self.rename.to_tokens(tokens);
David Tolnay4a057422016-10-08 00:02:31 -07001534 }
1535 }
1536
David Tolnayca085422016-10-04 00:12:38 -07001537 impl ToTokens for TraitItem {
1538 fn to_tokens(&self, tokens: &mut Tokens) {
1539 tokens.append_all(self.attrs.outer());
1540 match self.node {
Alex Crichton62a0a592017-05-22 13:58:53 -07001541 TraitItemKind::Const(ref item) => {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001542 item.const_token.to_tokens(tokens);
David Tolnayca085422016-10-04 00:12:38 -07001543 self.ident.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001544 item.colon_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001545 item.ty.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001546 item.eq_token.to_tokens(tokens);
1547 item.default.to_tokens(tokens);
1548 item.semi_token.to_tokens(tokens);
David Tolnayca085422016-10-04 00:12:38 -07001549 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001550 TraitItemKind::Method(ref item) => {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001551 NamedMethod(&item.sig, &self.ident).to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001552 match item.default {
David Tolnay3b9783a2016-10-29 22:37:09 -07001553 Some(ref block) => {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001554 block.brace_token.surround(tokens, |tokens| {
1555 tokens.append_all(self.attrs.inner());
1556 tokens.append_all(&block.stmts);
1557 });
David Tolnay3b9783a2016-10-29 22:37:09 -07001558 }
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001559 None => {
1560 item.semi_token.to_tokens(tokens);
1561 }
David Tolnayca085422016-10-04 00:12:38 -07001562 }
1563 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001564 TraitItemKind::Type(ref item) => {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001565 item.type_token.to_tokens(tokens);
David Tolnayca085422016-10-04 00:12:38 -07001566 self.ident.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001567 item.colon_token.to_tokens(tokens);
1568 item.bounds.to_tokens(tokens);
1569 item.eq_token.to_tokens(tokens);
1570 item.default.to_tokens(tokens);
1571 item.semi_token.to_tokens(tokens);
David Tolnayca085422016-10-04 00:12:38 -07001572 }
1573 TraitItemKind::Macro(ref mac) => {
1574 mac.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001575 if !mac.is_braced() {
1576 tokens::Semi::default().to_tokens(tokens);
David Tolnaye3198932016-10-04 00:21:34 -07001577 }
David Tolnayca085422016-10-04 00:12:38 -07001578 }
1579 }
1580 }
1581 }
1582
David Tolnay4c9be372016-10-06 00:47:37 -07001583 impl ToTokens for ImplItem {
1584 fn to_tokens(&self, tokens: &mut Tokens) {
1585 tokens.append_all(self.attrs.outer());
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001586 self.vis.to_tokens(tokens);
1587 self.defaultness.to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001588 match self.node {
Alex Crichton62a0a592017-05-22 13:58:53 -07001589 ImplItemKind::Const(ref item) => {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001590 item.const_token.to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001591 self.ident.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001592 item.colon_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001593 item.ty.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001594 item.eq_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001595 item.expr.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001596 item.semi_token.to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001597 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001598 ImplItemKind::Method(ref item) => {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001599 NamedMethod(&item.sig, &self.ident).to_tokens(tokens);
1600 item.block.brace_token.surround(tokens, |tokens| {
1601 tokens.append_all(self.attrs.inner());
1602 tokens.append_all(&item.block.stmts);
1603 });
David Tolnay4c9be372016-10-06 00:47:37 -07001604 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001605 ImplItemKind::Type(ref item) => {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001606 item.type_token.to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001607 self.ident.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001608 item.eq_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001609 item.ty.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001610 item.semi_token.to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001611 }
1612 ImplItemKind::Macro(ref mac) => {
1613 mac.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001614 if !mac.is_braced() {
1615 tokens::Semi::default().to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001616 }
1617 }
1618 }
1619 }
1620 }
1621
David Tolnay35902302016-10-06 01:11:08 -07001622 impl ToTokens for ForeignItem {
1623 fn to_tokens(&self, tokens: &mut Tokens) {
1624 tokens.append_all(self.attrs.outer());
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001625 self.vis.to_tokens(tokens);
David Tolnay35902302016-10-06 01:11:08 -07001626 match self.node {
Alex Crichton62a0a592017-05-22 13:58:53 -07001627 ForeignItemKind::Fn(ref item) => {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001628 NamedDecl(&item.decl, &self.ident).to_tokens(tokens)
David Tolnay35902302016-10-06 01:11:08 -07001629 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001630 ForeignItemKind::Static(ref item) => {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001631 item.static_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001632 item.mutbl.to_tokens(tokens);
David Tolnay35902302016-10-06 01:11:08 -07001633 self.ident.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001634 item.colon_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001635 item.ty.to_tokens(tokens);
David Tolnay35902302016-10-06 01:11:08 -07001636 }
1637 }
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001638 self.semi_token.to_tokens(tokens);
1639 }
1640 }
1641
1642 struct NamedMethod<'a>(&'a MethodSig, &'a Ident);
1643
1644 impl<'a> ToTokens for NamedMethod<'a> {
1645 fn to_tokens(&self, tokens: &mut Tokens) {
1646 self.0.constness.to_tokens(tokens);
1647 self.0.unsafety.to_tokens(tokens);
1648 self.0.abi.to_tokens(tokens);
1649 NamedDecl(&self.0.decl, self.1).to_tokens(tokens);
1650 }
1651 }
1652
1653 struct NamedDecl<'a>(&'a FnDecl, &'a Ident);
1654
1655 impl<'a> ToTokens for NamedDecl<'a> {
1656 fn to_tokens(&self, tokens: &mut Tokens) {
1657 self.0.fn_token.to_tokens(tokens);
1658 self.1.to_tokens(tokens);
1659 self.0.generics.to_tokens(tokens);
1660 self.0.paren_token.surround(tokens, |tokens| {
1661 self.0.inputs.to_tokens(tokens);
1662 self.0.dot_tokens.to_tokens(tokens);
1663 });
1664 self.0.output.to_tokens(tokens);
1665 self.0.generics.where_clause.to_tokens(tokens);
David Tolnay35902302016-10-06 01:11:08 -07001666 }
1667 }
1668
Alex Crichton62a0a592017-05-22 13:58:53 -07001669 impl ToTokens for ArgSelfRef {
David Tolnay62f374c2016-10-02 13:37:00 -07001670 fn to_tokens(&self, tokens: &mut Tokens) {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001671 self.and_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001672 self.lifetime.to_tokens(tokens);
1673 self.mutbl.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001674 self.self_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001675 }
1676 }
1677
1678 impl ToTokens for ArgSelf {
1679 fn to_tokens(&self, tokens: &mut Tokens) {
1680 self.mutbl.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001681 self.self_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001682 }
1683 }
1684
1685 impl ToTokens for ArgCaptured {
1686 fn to_tokens(&self, tokens: &mut Tokens) {
1687 self.pat.to_tokens(tokens);
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001688 self.colon_token.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001689 self.ty.to_tokens(tokens);
David Tolnay62f374c2016-10-02 13:37:00 -07001690 }
1691 }
1692
David Tolnay42602292016-10-01 22:25:45 -07001693 impl ToTokens for Constness {
1694 fn to_tokens(&self, tokens: &mut Tokens) {
1695 match *self {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001696 Constness::Const(ref t) => t.to_tokens(tokens),
David Tolnaydaaf7742016-10-03 11:11:43 -07001697 Constness::NotConst => {
1698 // nothing
1699 }
David Tolnay42602292016-10-01 22:25:45 -07001700 }
1701 }
1702 }
1703
David Tolnay4c9be372016-10-06 00:47:37 -07001704 impl ToTokens for Defaultness {
1705 fn to_tokens(&self, tokens: &mut Tokens) {
1706 match *self {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001707 Defaultness::Default(ref t) => t.to_tokens(tokens),
David Tolnay4c9be372016-10-06 00:47:37 -07001708 Defaultness::Final => {
1709 // nothing
1710 }
1711 }
1712 }
1713 }
1714
1715 impl ToTokens for ImplPolarity {
1716 fn to_tokens(&self, tokens: &mut Tokens) {
1717 match *self {
Alex Crichtonccbb45d2017-05-23 10:58:24 -07001718 ImplPolarity::Negative(ref t) => t.to_tokens(tokens),
David Tolnay4c9be372016-10-06 00:47:37 -07001719 ImplPolarity::Positive => {
1720 // nothing
1721 }
1722 }
1723 }
1724 }
David Tolnay4a51dc72016-10-01 00:40:31 -07001725}