blob: 7b25f2ff421a06415420f7cc2de66d4c6705f410 [file] [log] [blame]
David Tolnayb79ee962016-09-04 09:39:20 -07001use super::*;
2
Alex Crichton62a0a592017-05-22 13:58:53 -07003ast_struct! {
4 /// An item
5 ///
6 /// The name might be a dummy name in case of anonymous items
7 pub struct Item {
8 pub ident: Ident,
9 pub vis: Visibility,
10 pub attrs: Vec<Attribute>,
11 pub node: ItemKind,
12 }
David Tolnayb79ee962016-09-04 09:39:20 -070013}
14
Alex Crichton62a0a592017-05-22 13:58:53 -070015ast_enum_of_structs! {
16 pub enum ItemKind {
17 /// An`extern crate` item, with optional original crate name.
18 ///
19 /// E.g. `extern crate foo` or `extern crate foo_bar as foo`
20 pub ExternCrate(ItemExternCrate {
21 pub original: Option<Ident>,
22 }),
23 /// A use declaration (`use` or `pub use`) item.
24 ///
25 /// E.g. `use foo;`, `use foo::bar;` or `use foo::bar as FooBar;`
26 pub Use(ItemUse {
27 pub path: Box<ViewPath>,
28 }),
29 /// A static item (`static` or `pub static`).
30 ///
31 /// E.g. `static FOO: i32 = 42;` or `static FOO: &'static str = "bar";`
32 pub Static(ItemStatic {
33 pub ty: Box<Ty>,
34 pub mutbl: Mutability,
35 pub expr: Box<Expr>,
36 }),
37 /// A constant item (`const` or `pub const`).
38 ///
39 /// E.g. `const FOO: i32 = 42;`
40 pub Const(ItemConst {
41 pub ty: Box<Ty>,
42 pub expr: Box<Expr>,
43 }),
44 /// A function declaration (`fn` or `pub fn`).
45 ///
46 /// E.g. `fn foo(bar: usize) -> usize { .. }`
47 pub Fn(ItemFn {
48 pub decl: Box<FnDecl>,
49 pub unsafety: Unsafety,
50 pub constness: Constness,
51 pub abi: Option<Abi>,
52 pub generics: Generics,
53 pub block: Box<Block>,
54 }),
55 /// A module declaration (`mod` or `pub mod`).
56 ///
57 /// E.g. `mod foo;` or `mod foo { .. }`
58 pub Mod(ItemMod {
59 pub items: Option<Vec<Item>>,
60 }),
61 /// An external module (`extern` or `pub extern`).
62 ///
63 /// E.g. `extern {}` or `extern "C" {}`
64 pub ForeignMod(ItemForeignMod),
65 /// A type alias (`type` or `pub type`).
66 ///
67 /// E.g. `type Foo = Bar<u8>;`
68 pub Ty(ItemTy {
69 pub ty: Box<Ty>,
70 pub generics: Generics,
71 }),
72 /// An enum definition (`enum` or `pub enum`).
73 ///
74 /// E.g. `enum Foo<A, B> { C<A>, D<B> }`
75 pub Enum(ItemEnum {
76 pub variants: Vec<Variant>,
77 pub generics: Generics,
78 }),
79 /// A struct definition (`struct` or `pub struct`).
80 ///
81 /// E.g. `struct Foo<A> { x: A }`
82 pub Struct(ItemStruct {
83 pub data: VariantData,
84 pub generics: Generics,
85 }),
86 /// A union definition (`union` or `pub union`).
87 ///
88 /// E.g. `union Foo<A, B> { x: A, y: B }`
89 pub Union(ItemUnion {
90 pub data: VariantData,
91 pub generics: Generics,
92 }),
93 /// A Trait declaration (`trait` or `pub trait`).
94 ///
95 /// E.g. `trait Foo { .. }` or `trait Foo<T> { .. }`
96 pub Trait(ItemTrait {
97 pub unsafety: Unsafety,
98 pub generics: Generics,
99 pub supertraits: Vec<TyParamBound>,
100 pub items: Vec<TraitItem>,
101 }),
102 /// Default trait implementation.
103 ///
104 /// E.g. `impl Trait for .. {}` or `impl<T> Trait<T> for .. {}`
105 pub DefaultImpl(ItemDefaultImpl {
106 pub unsafety: Unsafety,
107 pub path: Path,
108 }),
109 /// An implementation.
110 ///
111 /// E.g. `impl<A> Foo<A> { .. }` or `impl<A> Trait for Foo<A> { .. }`
112 pub Impl(ItemImpl {
113 pub unsafety: Unsafety,
114 pub polarity: ImplPolarity,
115 pub generics: Generics,
116 pub trait_: Option<Path>, // (optional) trait this impl implements
117 pub self_ty: Box<Ty>, // self
118 pub items: Vec<ImplItem>,
119 }),
120 /// A macro invocation (which includes macro definition).
121 ///
122 /// E.g. `macro_rules! foo { .. }` or `foo!(..)`
123 pub Mac(Mac),
124 }
125
126 do_not_generate_to_tokens
David Tolnayb79ee962016-09-04 09:39:20 -0700127}
128
David Tolnay0e837402016-12-22 17:25:55 -0500129impl From<DeriveInput> for Item {
130 fn from(input: DeriveInput) -> Item {
David Tolnay453cfd12016-10-23 11:00:14 -0700131 Item {
132 ident: input.ident,
133 vis: input.vis,
134 attrs: input.attrs,
135 node: match input.body {
Alex Crichton62a0a592017-05-22 13:58:53 -0700136 Body::Enum(variants) => {
137 ItemEnum {
138 variants: variants,
139 generics: input.generics,
140 }.into()
141 }
142 Body::Struct(variant_data) => {
143 ItemStruct {
144 data: variant_data,
145 generics: input.generics,
146 }.into()
147 }
David Tolnay453cfd12016-10-23 11:00:14 -0700148 },
149 }
150 }
151}
152
Alex Crichton62a0a592017-05-22 13:58:53 -0700153ast_enum_of_structs! {
154 pub enum ViewPath {
155 /// `foo::bar::baz as quux`
156 ///
157 /// or just
158 ///
159 /// `foo::bar::baz` (with `as baz` implicitly on the right)
160 pub Simple(PathSimple {
161 pub path: Path,
162 pub rename: Option<Ident>,
163 }),
164
165 /// `foo::bar::*`
166 pub Glob(PathGlob {
167 pub path: Path,
168 }),
169
170 /// `foo::bar::{a, b, c}`
171 pub List(PathList {
172 pub path: Path,
173 pub items: Vec<PathListItem>,
174 }),
175 }
176}
177
178ast_struct! {
179 pub struct PathListItem {
180 pub name: Ident,
181 /// renamed in list, e.g. `use foo::{bar as baz};`
182 pub rename: Option<Ident>,
183 }
184}
185
186ast_enum! {
187 #[derive(Copy)]
188 pub enum Constness {
189 Const,
190 NotConst,
191 }
192}
193
194ast_enum! {
195 #[derive(Copy)]
196 pub enum Defaultness {
197 Default,
198 Final,
199 }
200}
201
202ast_struct! {
203 /// Foreign module declaration.
David Tolnayf38cdf62016-09-23 19:07:09 -0700204 ///
Alex Crichton62a0a592017-05-22 13:58:53 -0700205 /// E.g. `extern { .. }` or `extern "C" { .. }`
206 pub struct ItemForeignMod {
207 pub abi: Abi,
208 pub items: Vec<ForeignItem>,
209 }
210}
211
212ast_struct! {
213 pub struct ForeignItem {
214 pub ident: Ident,
215 pub attrs: Vec<Attribute>,
216 pub node: ForeignItemKind,
217 pub vis: Visibility,
218 }
219}
220
221ast_enum_of_structs! {
222 /// An item within an `extern` block
223 pub enum ForeignItemKind {
224 /// A foreign function
225 pub Fn(ForeignItemFn {
226 pub decl: Box<FnDecl>,
227 pub generics: Generics,
228 }),
229 /// A foreign static item (`static ext: u8`)
230 pub Static(ForeignItemStatic {
231 pub ty: Box<Ty>,
232 pub mutbl: Mutability,
233 }),
234 }
235
236 do_not_generate_to_tokens
237}
238
239ast_struct! {
240 /// Represents an item declaration within a trait declaration,
241 /// possibly including a default implementation. A trait item is
242 /// either required (meaning it doesn't have an implementation, just a
243 /// signature) or provided (meaning it has a default implementation).
244 pub struct TraitItem {
245 pub ident: Ident,
246 pub attrs: Vec<Attribute>,
247 pub node: TraitItemKind,
248 }
249}
250
251ast_enum_of_structs! {
252 pub enum TraitItemKind {
253 pub Const(TraitItemConst {
254 pub ty: Ty,
255 pub default: Option<Expr>,
256 }),
257 pub Method(TraitItemMethod {
258 pub sig: MethodSig,
259 pub default: Option<Block>,
260 }),
261 pub Type(TraitItemType {
262 pub bounds: Vec<TyParamBound>,
263 pub default: Option<Ty>,
264 }),
265 pub Macro(Mac),
266 }
267
268 do_not_generate_to_tokens
269}
270
271ast_enum! {
272 #[derive(Copy)]
273 pub enum ImplPolarity {
274 /// `impl Trait for Type`
275 Positive,
276 /// `impl !Trait for Type`
277 Negative,
278 }
279}
280
281ast_struct! {
282 pub struct ImplItem {
283 pub ident: Ident,
284 pub vis: Visibility,
285 pub defaultness: Defaultness,
286 pub attrs: Vec<Attribute>,
287 pub node: ImplItemKind,
288 }
289}
290
291ast_enum_of_structs! {
292 pub enum ImplItemKind {
293 pub Const(ImplItemConst {
294 pub ty: Ty,
295 pub expr: Expr,
296 }),
297 pub Method(ImplItemMethod {
298 pub sig: MethodSig,
299 pub block: Block,
300 }),
301 pub Type(ImplItemType {
302 pub ty: Ty,
303 }),
304 pub Macro(Mac),
305 }
306
307 do_not_generate_to_tokens
308}
309
310ast_struct! {
311 /// Represents a method's signature in a trait declaration,
312 /// or in an implementation.
313 pub struct MethodSig {
314 pub unsafety: Unsafety,
315 pub constness: Constness,
316 pub abi: Option<Abi>,
317 pub decl: FnDecl,
318 pub generics: Generics,
319 }
320}
321
322ast_struct! {
323 /// Header (not the body) of a function declaration.
David Tolnayf38cdf62016-09-23 19:07:09 -0700324 ///
Alex Crichton62a0a592017-05-22 13:58:53 -0700325 /// E.g. `fn foo(bar: baz)`
326 pub struct FnDecl {
327 pub inputs: Vec<FnArg>,
328 pub output: FunctionRetTy,
329 pub variadic: bool,
330 }
David Tolnayf38cdf62016-09-23 19:07:09 -0700331}
332
Alex Crichton62a0a592017-05-22 13:58:53 -0700333ast_enum_of_structs! {
334 /// An argument in a function header.
335 ///
336 /// E.g. `bar: usize` as in `fn foo(bar: usize)`
337 pub enum FnArg {
338 pub SelfRef(ArgSelfRef {
339 pub lifetime: Option<Lifetime>,
340 pub mutbl: Mutability,
341 }),
342 pub SelfValue(ArgSelf {
343 pub mutbl: Mutability,
344 }),
345 pub Captured(ArgCaptured {
346 pub pat: Pat,
347 pub ty: Ty,
348 }),
349 pub Ignored(Ty),
350 }
David Tolnay62f374c2016-10-02 13:37:00 -0700351}
352
David Tolnayedf2b992016-09-23 20:43:45 -0700353#[cfg(feature = "parsing")]
354pub mod parsing {
355 use super::*;
David Tolnay3b9783a2016-10-29 22:37:09 -0700356 use {Block, DelimToken, FunctionRetTy, Generics, Ident, Mac, Path, TokenTree, VariantData,
357 Visibility};
David Tolnay7b8009b2016-10-25 22:36:00 -0700358 use attr::parsing::{inner_attr, outer_attr};
David Tolnay2f9fa632016-10-03 22:08:48 -0700359 use data::parsing::{struct_like_body, visibility};
David Tolnay5859df12016-10-29 22:49:54 -0700360 use expr::parsing::{expr, pat, within_block};
David Tolnayca085422016-10-04 00:12:38 -0700361 use generics::parsing::{generics, lifetime, ty_param_bound, where_clause};
David Tolnayedf2b992016-09-23 20:43:45 -0700362 use ident::parsing::ident;
David Tolnay84aa0752016-10-02 23:01:13 -0700363 use mac::parsing::delimited;
David Tolnay0e837402016-12-22 17:25:55 -0500364 use derive::{Body, DeriveInput};
365 use derive::parsing::derive_input;
David Tolnayb8d8ef52016-10-29 14:30:08 -0700366 use ty::parsing::{abi, mutability, path, ty, unsafety};
David Tolnayedf2b992016-09-23 20:43:45 -0700367
368 named!(pub item -> Item, alt!(
David Tolnaya96a3fa2016-09-24 07:17:42 -0700369 item_extern_crate
David Tolnay4a057422016-10-08 00:02:31 -0700370 |
371 item_use
David Tolnay47a877c2016-10-01 16:50:55 -0700372 |
373 item_static
374 |
375 item_const
David Tolnay42602292016-10-01 22:25:45 -0700376 |
377 item_fn
David Tolnay35902302016-10-06 01:11:08 -0700378 |
379 item_mod
380 |
381 item_foreign_mod
David Tolnay3cf52982016-10-01 17:11:37 -0700382 |
383 item_ty
David Tolnayedf2b992016-09-23 20:43:45 -0700384 |
David Tolnaya96a3fa2016-09-24 07:17:42 -0700385 item_struct_or_enum
David Tolnay2f9fa632016-10-03 22:08:48 -0700386 |
387 item_union
David Tolnay0aecb732016-10-03 23:03:50 -0700388 |
389 item_trait
David Tolnayf94e2362016-10-04 00:29:51 -0700390 |
391 item_default_impl
David Tolnay4c9be372016-10-06 00:47:37 -0700392 |
393 item_impl
David Tolnay84aa0752016-10-02 23:01:13 -0700394 |
395 item_mac
396 ));
397
David Tolnay453cfd12016-10-23 11:00:14 -0700398 named!(pub items -> Vec<Item>, many0!(item));
399
David Tolnay84aa0752016-10-02 23:01:13 -0700400 named!(item_mac -> Item, do_parse!(
401 attrs: many0!(outer_attr) >>
David Tolnay5d55ef72016-12-21 20:20:04 -0500402 what: path >>
David Tolnay84aa0752016-10-02 23:01:13 -0700403 punct!("!") >>
404 name: option!(ident) >>
405 body: delimited >>
David Tolnay1a8b3522016-10-08 22:27:00 -0700406 cond!(match body.delim {
407 DelimToken::Paren | DelimToken::Bracket => true,
408 DelimToken::Brace => false,
409 }, punct!(";")) >>
David Tolnay84aa0752016-10-02 23:01:13 -0700410 (Item {
411 ident: name.unwrap_or_else(|| Ident::new("")),
412 vis: Visibility::Inherited,
413 attrs: attrs,
414 node: ItemKind::Mac(Mac {
David Tolnay5d55ef72016-12-21 20:20:04 -0500415 path: what,
David Tolnay84aa0752016-10-02 23:01:13 -0700416 tts: vec![TokenTree::Delimited(body)],
417 }),
418 })
David Tolnayedf2b992016-09-23 20:43:45 -0700419 ));
420
David Tolnaya96a3fa2016-09-24 07:17:42 -0700421 named!(item_extern_crate -> Item, do_parse!(
David Tolnay4a51dc72016-10-01 00:40:31 -0700422 attrs: many0!(outer_attr) >>
David Tolnayedf2b992016-09-23 20:43:45 -0700423 vis: visibility >>
David Tolnay10413f02016-09-30 09:12:02 -0700424 keyword!("extern") >>
425 keyword!("crate") >>
David Tolnayedf2b992016-09-23 20:43:45 -0700426 id: ident >>
427 rename: option!(preceded!(
David Tolnay10413f02016-09-30 09:12:02 -0700428 keyword!("as"),
David Tolnayedf2b992016-09-23 20:43:45 -0700429 ident
430 )) >>
431 punct!(";") >>
432 ({
433 let (name, original_name) = match rename {
434 Some(rename) => (rename, Some(id)),
435 None => (id, None),
436 };
437 Item {
438 ident: name,
439 vis: vis,
440 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700441 node: ItemExternCrate { original: original_name }.into(),
David Tolnayedf2b992016-09-23 20:43:45 -0700442 }
443 })
444 ));
445
David Tolnay4a057422016-10-08 00:02:31 -0700446 named!(item_use -> Item, do_parse!(
447 attrs: many0!(outer_attr) >>
448 vis: visibility >>
449 keyword!("use") >>
450 what: view_path >>
451 punct!(";") >>
452 (Item {
453 ident: "".into(),
454 vis: vis,
455 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700456 node: ItemUse { path: Box::new(what) }.into(),
David Tolnay4a057422016-10-08 00:02:31 -0700457 })
458 ));
459
460 named!(view_path -> ViewPath, alt!(
461 view_path_glob
462 |
463 view_path_list
464 |
465 view_path_list_root
466 |
467 view_path_simple // must be last
468 ));
469
470
471 named!(view_path_simple -> ViewPath, do_parse!(
472 path: path >>
473 rename: option!(preceded!(keyword!("as"), ident)) >>
Alex Crichton62a0a592017-05-22 13:58:53 -0700474 (PathSimple { path: path, rename: rename }.into())
David Tolnay4a057422016-10-08 00:02:31 -0700475 ));
476
477 named!(view_path_glob -> ViewPath, do_parse!(
478 path: path >>
479 punct!("::") >>
480 punct!("*") >>
Alex Crichton62a0a592017-05-22 13:58:53 -0700481 (PathGlob { path: path }.into())
David Tolnay4a057422016-10-08 00:02:31 -0700482 ));
483
484 named!(view_path_list -> ViewPath, do_parse!(
485 path: path >>
486 punct!("::") >>
487 punct!("{") >>
David Tolnayaab03bf2016-10-30 13:26:07 -0700488 items: terminated_list!(punct!(","), path_list_item) >>
David Tolnay4a057422016-10-08 00:02:31 -0700489 punct!("}") >>
Alex Crichton62a0a592017-05-22 13:58:53 -0700490 (PathList { path: path, items: items }.into())
David Tolnay4a057422016-10-08 00:02:31 -0700491 ));
492
493 named!(view_path_list_root -> ViewPath, do_parse!(
494 global: option!(punct!("::")) >>
495 punct!("{") >>
David Tolnayaab03bf2016-10-30 13:26:07 -0700496 items: terminated_list!(punct!(","), path_list_item) >>
David Tolnay4a057422016-10-08 00:02:31 -0700497 punct!("}") >>
Alex Crichton62a0a592017-05-22 13:58:53 -0700498 (PathList {
499 path: Path {
500 global: global.is_some(),
501 segments: Vec::new(),
502 },
503 items: items,
504 }.into())
David Tolnay4a057422016-10-08 00:02:31 -0700505 ));
506
507 named!(path_list_item -> PathListItem, do_parse!(
David Tolnaye6e42542016-10-24 22:37:11 -0700508 name: alt!(
509 ident
510 |
511 map!(keyword!("self"), Into::into)
512 ) >>
David Tolnay4a057422016-10-08 00:02:31 -0700513 rename: option!(preceded!(keyword!("as"), ident)) >>
514 (PathListItem {
515 name: name,
516 rename: rename,
517 })
518 ));
519
David Tolnay47a877c2016-10-01 16:50:55 -0700520 named!(item_static -> Item, do_parse!(
521 attrs: many0!(outer_attr) >>
522 vis: visibility >>
523 keyword!("static") >>
524 mutability: mutability >>
525 id: ident >>
526 punct!(":") >>
527 ty: ty >>
528 punct!("=") >>
529 value: expr >>
530 punct!(";") >>
531 (Item {
532 ident: id,
533 vis: vis,
534 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700535 node: ItemStatic {
536 ty: Box::new(ty),
537 mutbl: mutability,
538 expr: Box::new(value),
539 }.into(),
David Tolnay47a877c2016-10-01 16:50:55 -0700540 })
541 ));
542
543 named!(item_const -> Item, do_parse!(
544 attrs: many0!(outer_attr) >>
545 vis: visibility >>
546 keyword!("const") >>
547 id: ident >>
548 punct!(":") >>
549 ty: ty >>
550 punct!("=") >>
551 value: expr >>
552 punct!(";") >>
553 (Item {
554 ident: id,
555 vis: vis,
556 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700557 node: ItemConst { ty: Box::new(ty), expr: Box::new(value) }.into(),
David Tolnay47a877c2016-10-01 16:50:55 -0700558 })
559 ));
560
David Tolnay42602292016-10-01 22:25:45 -0700561 named!(item_fn -> Item, do_parse!(
David Tolnay3b9783a2016-10-29 22:37:09 -0700562 outer_attrs: many0!(outer_attr) >>
David Tolnay42602292016-10-01 22:25:45 -0700563 vis: visibility >>
564 constness: constness >>
565 unsafety: unsafety >>
David Tolnayb8d8ef52016-10-29 14:30:08 -0700566 abi: option!(abi) >>
David Tolnay42602292016-10-01 22:25:45 -0700567 keyword!("fn") >>
568 name: ident >>
569 generics: generics >>
570 punct!("(") >>
David Tolnayff46fd22016-10-08 13:53:28 -0700571 inputs: terminated_list!(punct!(","), fn_arg) >>
David Tolnay42602292016-10-01 22:25:45 -0700572 punct!(")") >>
573 ret: option!(preceded!(punct!("->"), ty)) >>
574 where_clause: where_clause >>
David Tolnay3b9783a2016-10-29 22:37:09 -0700575 punct!("{") >>
576 inner_attrs: many0!(inner_attr) >>
577 stmts: within_block >>
578 punct!("}") >>
David Tolnay42602292016-10-01 22:25:45 -0700579 (Item {
580 ident: name,
581 vis: vis,
David Tolnay3b9783a2016-10-29 22:37:09 -0700582 attrs: {
583 let mut attrs = outer_attrs;
584 attrs.extend(inner_attrs);
585 attrs
586 },
Alex Crichton62a0a592017-05-22 13:58:53 -0700587 node: ItemFn {
588 decl: Box::new(FnDecl {
David Tolnay42602292016-10-01 22:25:45 -0700589 inputs: inputs,
590 output: ret.map(FunctionRetTy::Ty).unwrap_or(FunctionRetTy::Default),
David Tolnay292e6002016-10-29 22:03:51 -0700591 variadic: false,
David Tolnay42602292016-10-01 22:25:45 -0700592 }),
Alex Crichton62a0a592017-05-22 13:58:53 -0700593 unsafety: unsafety,
594 constness: constness,
595 abi: abi,
596 generics: Generics {
David Tolnay42602292016-10-01 22:25:45 -0700597 where_clause: where_clause,
598 .. generics
599 },
Alex Crichton62a0a592017-05-22 13:58:53 -0700600 block: Box::new(Block {
David Tolnay3b9783a2016-10-29 22:37:09 -0700601 stmts: stmts,
602 }),
Alex Crichton62a0a592017-05-22 13:58:53 -0700603 }.into(),
David Tolnay42602292016-10-01 22:25:45 -0700604 })
605 ));
606
David Tolnayca085422016-10-04 00:12:38 -0700607 named!(fn_arg -> FnArg, alt!(
608 do_parse!(
609 punct!("&") >>
610 lt: option!(lifetime) >>
611 mutability: mutability >>
612 keyword!("self") >>
David Tolnay1f16b602017-02-07 20:06:55 -0500613 not!(punct!(":")) >>
Alex Crichton62a0a592017-05-22 13:58:53 -0700614 (ArgSelfRef { lifetime: lt, mutbl: mutability }.into())
David Tolnayca085422016-10-04 00:12:38 -0700615 )
616 |
617 do_parse!(
618 mutability: mutability >>
619 keyword!("self") >>
David Tolnay1f16b602017-02-07 20:06:55 -0500620 not!(punct!(":")) >>
Alex Crichton62a0a592017-05-22 13:58:53 -0700621 (ArgSelf { mutbl: mutability }.into())
David Tolnayca085422016-10-04 00:12:38 -0700622 )
623 |
624 do_parse!(
625 pat: pat >>
626 punct!(":") >>
627 ty: ty >>
Alex Crichton62a0a592017-05-22 13:58:53 -0700628 (ArgCaptured { pat: pat, ty: ty }.into())
David Tolnayca085422016-10-04 00:12:38 -0700629 )
630 |
631 ty => { FnArg::Ignored }
David Tolnay62f374c2016-10-02 13:37:00 -0700632 ));
633
David Tolnay35902302016-10-06 01:11:08 -0700634 named!(item_mod -> Item, do_parse!(
David Tolnay7b8009b2016-10-25 22:36:00 -0700635 outer_attrs: many0!(outer_attr) >>
David Tolnay35902302016-10-06 01:11:08 -0700636 vis: visibility >>
637 keyword!("mod") >>
638 id: ident >>
David Tolnay7b8009b2016-10-25 22:36:00 -0700639 content: alt!(
David Tolnay37d10332016-10-13 20:51:04 -0700640 punct!(";") => { |_| None }
641 |
David Tolnay7b8009b2016-10-25 22:36:00 -0700642 delimited!(
643 punct!("{"),
644 tuple!(
645 many0!(inner_attr),
646 items
647 ),
648 punct!("}")
649 ) => { Some }
David Tolnay37d10332016-10-13 20:51:04 -0700650 ) >>
David Tolnay7b8009b2016-10-25 22:36:00 -0700651 (match content {
652 Some((inner_attrs, items)) => Item {
653 ident: id,
654 vis: vis,
655 attrs: {
656 let mut attrs = outer_attrs;
657 attrs.extend(inner_attrs);
658 attrs
659 },
Alex Crichton62a0a592017-05-22 13:58:53 -0700660 node: ItemMod { items: Some(items) }.into(),
David Tolnay7b8009b2016-10-25 22:36:00 -0700661 },
662 None => Item {
663 ident: id,
664 vis: vis,
665 attrs: outer_attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700666 node: ItemMod { items: None }.into(),
David Tolnay7b8009b2016-10-25 22:36:00 -0700667 },
David Tolnay35902302016-10-06 01:11:08 -0700668 })
669 ));
670
671 named!(item_foreign_mod -> Item, do_parse!(
672 attrs: many0!(outer_attr) >>
David Tolnayb8d8ef52016-10-29 14:30:08 -0700673 abi: abi >>
David Tolnay35902302016-10-06 01:11:08 -0700674 punct!("{") >>
675 items: many0!(foreign_item) >>
676 punct!("}") >>
677 (Item {
678 ident: "".into(),
679 vis: Visibility::Inherited,
680 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700681 node: ItemForeignMod {
David Tolnayb8d8ef52016-10-29 14:30:08 -0700682 abi: abi,
David Tolnay35902302016-10-06 01:11:08 -0700683 items: items,
Alex Crichton62a0a592017-05-22 13:58:53 -0700684 }.into(),
David Tolnay35902302016-10-06 01:11:08 -0700685 })
686 ));
687
688 named!(foreign_item -> ForeignItem, alt!(
689 foreign_fn
690 |
691 foreign_static
692 ));
693
694 named!(foreign_fn -> ForeignItem, do_parse!(
695 attrs: many0!(outer_attr) >>
696 vis: visibility >>
697 keyword!("fn") >>
698 name: ident >>
699 generics: generics >>
700 punct!("(") >>
David Tolnay292e6002016-10-29 22:03:51 -0700701 inputs: separated_list!(punct!(","), fn_arg) >>
702 trailing_comma: option!(punct!(",")) >>
703 variadic: option!(cond_reduce!(trailing_comma.is_some(), punct!("..."))) >>
David Tolnay35902302016-10-06 01:11:08 -0700704 punct!(")") >>
705 ret: option!(preceded!(punct!("->"), ty)) >>
706 where_clause: where_clause >>
707 punct!(";") >>
708 (ForeignItem {
709 ident: name,
710 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700711 node: ForeignItemFn {
712 decl: Box::new(FnDecl {
David Tolnay35902302016-10-06 01:11:08 -0700713 inputs: inputs,
714 output: ret.map(FunctionRetTy::Ty).unwrap_or(FunctionRetTy::Default),
David Tolnay292e6002016-10-29 22:03:51 -0700715 variadic: variadic.is_some(),
David Tolnay35902302016-10-06 01:11:08 -0700716 }),
Alex Crichton62a0a592017-05-22 13:58:53 -0700717 generics: Generics {
David Tolnay35902302016-10-06 01:11:08 -0700718 where_clause: where_clause,
719 .. generics
720 },
Alex Crichton62a0a592017-05-22 13:58:53 -0700721 }.into(),
David Tolnay35902302016-10-06 01:11:08 -0700722 vis: vis,
723 })
724 ));
725
726 named!(foreign_static -> ForeignItem, do_parse!(
727 attrs: many0!(outer_attr) >>
728 vis: visibility >>
729 keyword!("static") >>
730 mutability: mutability >>
731 id: ident >>
732 punct!(":") >>
733 ty: ty >>
734 punct!(";") >>
735 (ForeignItem {
736 ident: id,
737 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700738 node: ForeignItemStatic { ty: Box::new(ty), mutbl: mutability }.into(),
David Tolnay35902302016-10-06 01:11:08 -0700739 vis: vis,
740 })
741 ));
742
David Tolnay3cf52982016-10-01 17:11:37 -0700743 named!(item_ty -> Item, do_parse!(
744 attrs: many0!(outer_attr) >>
745 vis: visibility >>
746 keyword!("type") >>
747 id: ident >>
748 generics: generics >>
David Tolnay04bb3ad2016-10-30 10:59:01 -0700749 where_clause: where_clause >>
David Tolnay3cf52982016-10-01 17:11:37 -0700750 punct!("=") >>
751 ty: ty >>
752 punct!(";") >>
753 (Item {
754 ident: id,
755 vis: vis,
756 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700757 node: ItemTy {
758 ty: Box::new(ty),
759 generics: Generics {
David Tolnay04bb3ad2016-10-30 10:59:01 -0700760 where_clause: where_clause,
761 ..generics
762 },
Alex Crichton62a0a592017-05-22 13:58:53 -0700763 }.into(),
David Tolnay3cf52982016-10-01 17:11:37 -0700764 })
765 ));
766
David Tolnaya96a3fa2016-09-24 07:17:42 -0700767 named!(item_struct_or_enum -> Item, map!(
David Tolnay0e837402016-12-22 17:25:55 -0500768 derive_input,
769 |def: DeriveInput| Item {
David Tolnayedf2b992016-09-23 20:43:45 -0700770 ident: def.ident,
771 vis: def.vis,
772 attrs: def.attrs,
773 node: match def.body {
774 Body::Enum(variants) => {
Alex Crichton62a0a592017-05-22 13:58:53 -0700775 ItemEnum { variants: variants, generics: def.generics }.into()
David Tolnayedf2b992016-09-23 20:43:45 -0700776 }
777 Body::Struct(variant_data) => {
Alex Crichton62a0a592017-05-22 13:58:53 -0700778 ItemStruct { data: variant_data, generics: def.generics }.into()
David Tolnayedf2b992016-09-23 20:43:45 -0700779 }
780 }
781 }
782 ));
David Tolnay42602292016-10-01 22:25:45 -0700783
David Tolnay2f9fa632016-10-03 22:08:48 -0700784 named!(item_union -> Item, do_parse!(
785 attrs: many0!(outer_attr) >>
786 vis: visibility >>
787 keyword!("union") >>
788 id: ident >>
789 generics: generics >>
790 where_clause: where_clause >>
791 fields: struct_like_body >>
792 (Item {
793 ident: id,
794 vis: vis,
795 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700796 node: ItemUnion {
797 data: VariantData::Struct(fields),
798 generics: Generics {
David Tolnay2f9fa632016-10-03 22:08:48 -0700799 where_clause: where_clause,
800 .. generics
801 },
Alex Crichton62a0a592017-05-22 13:58:53 -0700802 }.into(),
David Tolnay2f9fa632016-10-03 22:08:48 -0700803 })
804 ));
805
David Tolnay0aecb732016-10-03 23:03:50 -0700806 named!(item_trait -> Item, do_parse!(
807 attrs: many0!(outer_attr) >>
808 vis: visibility >>
809 unsafety: unsafety >>
810 keyword!("trait") >>
811 id: ident >>
812 generics: generics >>
813 bounds: opt_vec!(preceded!(
814 punct!(":"),
815 separated_nonempty_list!(punct!("+"), ty_param_bound)
816 )) >>
817 where_clause: where_clause >>
818 punct!("{") >>
819 body: many0!(trait_item) >>
820 punct!("}") >>
821 (Item {
822 ident: id,
823 vis: vis,
824 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700825 node: ItemTrait {
826 unsafety: unsafety,
827 generics: Generics {
David Tolnay0aecb732016-10-03 23:03:50 -0700828 where_clause: where_clause,
829 .. generics
830 },
Alex Crichton62a0a592017-05-22 13:58:53 -0700831 supertraits: bounds,
832 items: body,
833 }.into(),
David Tolnay0aecb732016-10-03 23:03:50 -0700834 })
835 ));
836
David Tolnayf94e2362016-10-04 00:29:51 -0700837 named!(item_default_impl -> Item, do_parse!(
838 attrs: many0!(outer_attr) >>
839 unsafety: unsafety >>
840 keyword!("impl") >>
841 path: path >>
842 keyword!("for") >>
843 punct!("..") >>
844 punct!("{") >>
845 punct!("}") >>
846 (Item {
847 ident: "".into(),
848 vis: Visibility::Inherited,
849 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700850 node: ItemDefaultImpl { unsafety: unsafety, path: path }.into(),
David Tolnayf94e2362016-10-04 00:29:51 -0700851 })
852 ));
853
David Tolnay0aecb732016-10-03 23:03:50 -0700854 named!(trait_item -> TraitItem, alt!(
855 trait_item_const
856 |
857 trait_item_method
858 |
859 trait_item_type
860 |
861 trait_item_mac
862 ));
863
864 named!(trait_item_const -> TraitItem, do_parse!(
865 attrs: many0!(outer_attr) >>
866 keyword!("const") >>
867 id: ident >>
868 punct!(":") >>
869 ty: ty >>
870 value: option!(preceded!(punct!("="), expr)) >>
871 punct!(";") >>
872 (TraitItem {
873 ident: id,
874 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700875 node: TraitItemConst { ty: ty, default: value }.into(),
David Tolnay0aecb732016-10-03 23:03:50 -0700876 })
877 ));
878
879 named!(trait_item_method -> TraitItem, do_parse!(
David Tolnay5859df12016-10-29 22:49:54 -0700880 outer_attrs: many0!(outer_attr) >>
David Tolnay0aecb732016-10-03 23:03:50 -0700881 constness: constness >>
882 unsafety: unsafety >>
David Tolnayb8d8ef52016-10-29 14:30:08 -0700883 abi: option!(abi) >>
David Tolnay0aecb732016-10-03 23:03:50 -0700884 keyword!("fn") >>
885 name: ident >>
886 generics: generics >>
887 punct!("(") >>
David Tolnayff46fd22016-10-08 13:53:28 -0700888 inputs: terminated_list!(punct!(","), fn_arg) >>
David Tolnay0aecb732016-10-03 23:03:50 -0700889 punct!(")") >>
890 ret: option!(preceded!(punct!("->"), ty)) >>
891 where_clause: where_clause >>
David Tolnay5859df12016-10-29 22:49:54 -0700892 body: option!(delimited!(
893 punct!("{"),
894 tuple!(many0!(inner_attr), within_block),
895 punct!("}")
896 )) >>
David Tolnay0aecb732016-10-03 23:03:50 -0700897 cond!(body.is_none(), punct!(";")) >>
David Tolnay5859df12016-10-29 22:49:54 -0700898 ({
899 let (inner_attrs, stmts) = match body {
900 Some((inner_attrs, stmts)) => (inner_attrs, Some(stmts)),
901 None => (Vec::new(), None),
902 };
903 TraitItem {
904 ident: name,
905 attrs: {
906 let mut attrs = outer_attrs;
907 attrs.extend(inner_attrs);
908 attrs
David Tolnay0aecb732016-10-03 23:03:50 -0700909 },
Alex Crichton62a0a592017-05-22 13:58:53 -0700910 node: TraitItemMethod {
911 sig: MethodSig {
David Tolnay5859df12016-10-29 22:49:54 -0700912 unsafety: unsafety,
913 constness: constness,
914 abi: abi,
915 decl: FnDecl {
916 inputs: inputs,
917 output: ret.map(FunctionRetTy::Ty).unwrap_or(FunctionRetTy::Default),
918 variadic: false,
919 },
920 generics: Generics {
921 where_clause: where_clause,
922 .. generics
923 },
924 },
Alex Crichton62a0a592017-05-22 13:58:53 -0700925 default: stmts.map(|stmts| Block { stmts: stmts }),
926 }.into(),
David Tolnay5859df12016-10-29 22:49:54 -0700927 }
David Tolnay0aecb732016-10-03 23:03:50 -0700928 })
929 ));
930
931 named!(trait_item_type -> TraitItem, do_parse!(
932 attrs: many0!(outer_attr) >>
933 keyword!("type") >>
934 id: ident >>
935 bounds: opt_vec!(preceded!(
936 punct!(":"),
937 separated_nonempty_list!(punct!("+"), ty_param_bound)
938 )) >>
939 default: option!(preceded!(punct!("="), ty)) >>
David Tolnayca085422016-10-04 00:12:38 -0700940 punct!(";") >>
David Tolnay0aecb732016-10-03 23:03:50 -0700941 (TraitItem {
942 ident: id,
943 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700944 node: TraitItemType { bounds: bounds, default: default }.into(),
David Tolnay0aecb732016-10-03 23:03:50 -0700945 })
946 ));
947
948 named!(trait_item_mac -> TraitItem, do_parse!(
949 attrs: many0!(outer_attr) >>
David Tolnay5d55ef72016-12-21 20:20:04 -0500950 what: path >>
David Tolnay0aecb732016-10-03 23:03:50 -0700951 punct!("!") >>
952 body: delimited >>
David Tolnaye3198932016-10-04 00:21:34 -0700953 cond!(match body.delim {
954 DelimToken::Paren | DelimToken::Bracket => true,
955 DelimToken::Brace => false,
956 }, punct!(";")) >>
David Tolnay0aecb732016-10-03 23:03:50 -0700957 (TraitItem {
David Tolnay5d55ef72016-12-21 20:20:04 -0500958 ident: Ident::new(""),
David Tolnay0aecb732016-10-03 23:03:50 -0700959 attrs: attrs,
960 node: TraitItemKind::Macro(Mac {
David Tolnay5d55ef72016-12-21 20:20:04 -0500961 path: what,
David Tolnay0aecb732016-10-03 23:03:50 -0700962 tts: vec![TokenTree::Delimited(body)],
963 }),
964 })
965 ));
966
David Tolnay4c9be372016-10-06 00:47:37 -0700967 named!(item_impl -> Item, do_parse!(
968 attrs: many0!(outer_attr) >>
969 unsafety: unsafety >>
970 keyword!("impl") >>
971 generics: generics >>
972 polarity_path: alt!(
973 do_parse!(
974 polarity: impl_polarity >>
975 path: path >>
976 keyword!("for") >>
David Tolnay02a8d472017-02-19 12:59:44 -0800977 (polarity, Some(path))
David Tolnay4c9be372016-10-06 00:47:37 -0700978 )
979 |
980 epsilon!() => { |_| (ImplPolarity::Positive, None) }
981 ) >>
982 self_ty: ty >>
983 where_clause: where_clause >>
984 punct!("{") >>
985 body: many0!(impl_item) >>
986 punct!("}") >>
987 (Item {
988 ident: "".into(),
989 vis: Visibility::Inherited,
990 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -0700991 node: ItemImpl {
992 unsafety: unsafety,
993 polarity: polarity_path.0,
994 generics: Generics {
David Tolnay4c9be372016-10-06 00:47:37 -0700995 where_clause: where_clause,
996 .. generics
997 },
Alex Crichton62a0a592017-05-22 13:58:53 -0700998 trait_: polarity_path.1,
999 self_ty: Box::new(self_ty),
1000 items: body,
1001 }.into(),
David Tolnay4c9be372016-10-06 00:47:37 -07001002 })
1003 ));
1004
1005 named!(impl_item -> ImplItem, alt!(
1006 impl_item_const
1007 |
1008 impl_item_method
1009 |
1010 impl_item_type
1011 |
1012 impl_item_macro
1013 ));
1014
1015 named!(impl_item_const -> ImplItem, do_parse!(
1016 attrs: many0!(outer_attr) >>
1017 vis: visibility >>
1018 defaultness: defaultness >>
1019 keyword!("const") >>
1020 id: ident >>
1021 punct!(":") >>
1022 ty: ty >>
1023 punct!("=") >>
1024 value: expr >>
1025 punct!(";") >>
1026 (ImplItem {
1027 ident: id,
1028 vis: vis,
1029 defaultness: defaultness,
1030 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -07001031 node: ImplItemConst { ty: ty, expr: value}.into(),
David Tolnay4c9be372016-10-06 00:47:37 -07001032 })
1033 ));
1034
1035 named!(impl_item_method -> ImplItem, do_parse!(
David Tolnay3b9783a2016-10-29 22:37:09 -07001036 outer_attrs: many0!(outer_attr) >>
David Tolnay4c9be372016-10-06 00:47:37 -07001037 vis: visibility >>
1038 defaultness: defaultness >>
1039 constness: constness >>
1040 unsafety: unsafety >>
David Tolnayb8d8ef52016-10-29 14:30:08 -07001041 abi: option!(abi) >>
David Tolnay4c9be372016-10-06 00:47:37 -07001042 keyword!("fn") >>
1043 name: ident >>
1044 generics: generics >>
1045 punct!("(") >>
David Tolnayff46fd22016-10-08 13:53:28 -07001046 inputs: terminated_list!(punct!(","), fn_arg) >>
David Tolnay4c9be372016-10-06 00:47:37 -07001047 punct!(")") >>
1048 ret: option!(preceded!(punct!("->"), ty)) >>
1049 where_clause: where_clause >>
David Tolnay3b9783a2016-10-29 22:37:09 -07001050 punct!("{") >>
1051 inner_attrs: many0!(inner_attr) >>
1052 stmts: within_block >>
1053 punct!("}") >>
David Tolnay4c9be372016-10-06 00:47:37 -07001054 (ImplItem {
1055 ident: name,
1056 vis: vis,
1057 defaultness: defaultness,
David Tolnay3b9783a2016-10-29 22:37:09 -07001058 attrs: {
1059 let mut attrs = outer_attrs;
1060 attrs.extend(inner_attrs);
1061 attrs
1062 },
Alex Crichton62a0a592017-05-22 13:58:53 -07001063 node: ImplItemMethod {
1064 sig: MethodSig {
David Tolnay4c9be372016-10-06 00:47:37 -07001065 unsafety: unsafety,
1066 constness: constness,
David Tolnayb8d8ef52016-10-29 14:30:08 -07001067 abi: abi,
David Tolnay4c9be372016-10-06 00:47:37 -07001068 decl: FnDecl {
1069 inputs: inputs,
1070 output: ret.map(FunctionRetTy::Ty).unwrap_or(FunctionRetTy::Default),
David Tolnay292e6002016-10-29 22:03:51 -07001071 variadic: false,
David Tolnay4c9be372016-10-06 00:47:37 -07001072 },
1073 generics: Generics {
1074 where_clause: where_clause,
1075 .. generics
1076 },
1077 },
Alex Crichton62a0a592017-05-22 13:58:53 -07001078 block: Block {
David Tolnay3b9783a2016-10-29 22:37:09 -07001079 stmts: stmts,
1080 },
Alex Crichton62a0a592017-05-22 13:58:53 -07001081 }.into(),
David Tolnay4c9be372016-10-06 00:47:37 -07001082 })
1083 ));
1084
1085 named!(impl_item_type -> ImplItem, do_parse!(
1086 attrs: many0!(outer_attr) >>
1087 vis: visibility >>
1088 defaultness: defaultness >>
1089 keyword!("type") >>
1090 id: ident >>
1091 punct!("=") >>
1092 ty: ty >>
1093 punct!(";") >>
1094 (ImplItem {
1095 ident: id,
1096 vis: vis,
1097 defaultness: defaultness,
1098 attrs: attrs,
Alex Crichton62a0a592017-05-22 13:58:53 -07001099 node: ImplItemType { ty: ty }.into(),
David Tolnay4c9be372016-10-06 00:47:37 -07001100 })
1101 ));
1102
1103 named!(impl_item_macro -> ImplItem, do_parse!(
1104 attrs: many0!(outer_attr) >>
David Tolnay5d55ef72016-12-21 20:20:04 -05001105 what: path >>
David Tolnay4c9be372016-10-06 00:47:37 -07001106 punct!("!") >>
1107 body: delimited >>
1108 cond!(match body.delim {
1109 DelimToken::Paren | DelimToken::Bracket => true,
1110 DelimToken::Brace => false,
1111 }, punct!(";")) >>
1112 (ImplItem {
David Tolnay5d55ef72016-12-21 20:20:04 -05001113 ident: Ident::new(""),
David Tolnay4c9be372016-10-06 00:47:37 -07001114 vis: Visibility::Inherited,
1115 defaultness: Defaultness::Final,
1116 attrs: attrs,
1117 node: ImplItemKind::Macro(Mac {
David Tolnay5d55ef72016-12-21 20:20:04 -05001118 path: what,
David Tolnay4c9be372016-10-06 00:47:37 -07001119 tts: vec![TokenTree::Delimited(body)],
1120 }),
1121 })
1122 ));
1123
1124 named!(impl_polarity -> ImplPolarity, alt!(
1125 punct!("!") => { |_| ImplPolarity::Negative }
1126 |
1127 epsilon!() => { |_| ImplPolarity::Positive }
1128 ));
1129
David Tolnay42602292016-10-01 22:25:45 -07001130 named!(constness -> Constness, alt!(
David Tolnaybd76e572016-10-02 13:43:16 -07001131 keyword!("const") => { |_| Constness::Const }
David Tolnay42602292016-10-01 22:25:45 -07001132 |
1133 epsilon!() => { |_| Constness::NotConst }
1134 ));
1135
David Tolnay4c9be372016-10-06 00:47:37 -07001136 named!(defaultness -> Defaultness, alt!(
1137 keyword!("default") => { |_| Defaultness::Default }
1138 |
1139 epsilon!() => { |_| Defaultness::Final }
1140 ));
David Tolnayedf2b992016-09-23 20:43:45 -07001141}
David Tolnay4a51dc72016-10-01 00:40:31 -07001142
1143#[cfg(feature = "printing")]
1144mod printing {
1145 use super::*;
David Tolnaycc3d66e2016-10-02 23:36:05 -07001146 use {Delimited, DelimToken, FunctionRetTy, TokenTree};
David Tolnay4a51dc72016-10-01 00:40:31 -07001147 use attr::FilterAttrs;
David Tolnay47a877c2016-10-01 16:50:55 -07001148 use data::VariantData;
David Tolnay4a51dc72016-10-01 00:40:31 -07001149 use quote::{Tokens, ToTokens};
1150
1151 impl ToTokens for Item {
1152 fn to_tokens(&self, tokens: &mut Tokens) {
David Tolnayca085422016-10-04 00:12:38 -07001153 tokens.append_all(self.attrs.outer());
David Tolnay4a51dc72016-10-01 00:40:31 -07001154 match self.node {
Alex Crichton62a0a592017-05-22 13:58:53 -07001155 ItemKind::ExternCrate(ref item) => {
David Tolnaycbd9f7d2016-10-30 00:26:29 -07001156 self.vis.to_tokens(tokens);
David Tolnay4a51dc72016-10-01 00:40:31 -07001157 tokens.append("extern");
1158 tokens.append("crate");
Alex Crichton62a0a592017-05-22 13:58:53 -07001159 if let Some(ref original) = item.original {
David Tolnay4a51dc72016-10-01 00:40:31 -07001160 original.to_tokens(tokens);
1161 tokens.append("as");
1162 }
1163 self.ident.to_tokens(tokens);
1164 tokens.append(";");
1165 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001166 ItemKind::Use(ref item) => {
David Tolnay4a057422016-10-08 00:02:31 -07001167 self.vis.to_tokens(tokens);
1168 tokens.append("use");
Alex Crichton62a0a592017-05-22 13:58:53 -07001169 item.path.to_tokens(tokens);
David Tolnay4a057422016-10-08 00:02:31 -07001170 tokens.append(";");
1171 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001172 ItemKind::Static(ref item) => {
David Tolnay47a877c2016-10-01 16:50:55 -07001173 self.vis.to_tokens(tokens);
1174 tokens.append("static");
Alex Crichton62a0a592017-05-22 13:58:53 -07001175 item.mutbl.to_tokens(tokens);
David Tolnay47a877c2016-10-01 16:50:55 -07001176 self.ident.to_tokens(tokens);
1177 tokens.append(":");
Alex Crichton62a0a592017-05-22 13:58:53 -07001178 item.ty.to_tokens(tokens);
David Tolnay47a877c2016-10-01 16:50:55 -07001179 tokens.append("=");
Alex Crichton62a0a592017-05-22 13:58:53 -07001180 item.expr.to_tokens(tokens);
David Tolnay47a877c2016-10-01 16:50:55 -07001181 tokens.append(";");
1182 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001183 ItemKind::Const(ref item) => {
David Tolnay47a877c2016-10-01 16:50:55 -07001184 self.vis.to_tokens(tokens);
1185 tokens.append("const");
1186 self.ident.to_tokens(tokens);
1187 tokens.append(":");
Alex Crichton62a0a592017-05-22 13:58:53 -07001188 item.ty.to_tokens(tokens);
David Tolnay47a877c2016-10-01 16:50:55 -07001189 tokens.append("=");
Alex Crichton62a0a592017-05-22 13:58:53 -07001190 item.expr.to_tokens(tokens);
David Tolnay47a877c2016-10-01 16:50:55 -07001191 tokens.append(";");
1192 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001193 ItemKind::Fn(ref item) => {
David Tolnay42602292016-10-01 22:25:45 -07001194 self.vis.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001195 item.constness.to_tokens(tokens);
1196 item.unsafety.to_tokens(tokens);
1197 item.abi.to_tokens(tokens);
David Tolnay42602292016-10-01 22:25:45 -07001198 tokens.append("fn");
1199 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001200 item.generics.to_tokens(tokens);
David Tolnay62f374c2016-10-02 13:37:00 -07001201 tokens.append("(");
Alex Crichton62a0a592017-05-22 13:58:53 -07001202 tokens.append_separated(&item.decl.inputs, ",");
David Tolnay62f374c2016-10-02 13:37:00 -07001203 tokens.append(")");
Alex Crichton62a0a592017-05-22 13:58:53 -07001204 if let FunctionRetTy::Ty(ref ty) = item.decl.output {
David Tolnay62f374c2016-10-02 13:37:00 -07001205 tokens.append("->");
1206 ty.to_tokens(tokens);
1207 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001208 item.generics.where_clause.to_tokens(tokens);
David Tolnay3b9783a2016-10-29 22:37:09 -07001209 tokens.append("{");
1210 tokens.append_all(self.attrs.inner());
Alex Crichton62a0a592017-05-22 13:58:53 -07001211 tokens.append_all(&item.block.stmts);
David Tolnay3b9783a2016-10-29 22:37:09 -07001212 tokens.append("}");
David Tolnay42602292016-10-01 22:25:45 -07001213 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001214 ItemKind::Mod(ref item) => {
David Tolnay35902302016-10-06 01:11:08 -07001215 self.vis.to_tokens(tokens);
1216 tokens.append("mod");
1217 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001218 match item.items {
David Tolnay37d10332016-10-13 20:51:04 -07001219 Some(ref items) => {
1220 tokens.append("{");
David Tolnay7b8009b2016-10-25 22:36:00 -07001221 tokens.append_all(self.attrs.inner());
David Tolnay37d10332016-10-13 20:51:04 -07001222 tokens.append_all(items);
1223 tokens.append("}");
1224 }
1225 None => tokens.append(";"),
1226 }
David Tolnay35902302016-10-06 01:11:08 -07001227 }
1228 ItemKind::ForeignMod(ref foreign_mod) => {
1229 self.vis.to_tokens(tokens);
David Tolnayb8d8ef52016-10-29 14:30:08 -07001230 foreign_mod.abi.to_tokens(tokens);
David Tolnay35902302016-10-06 01:11:08 -07001231 tokens.append("{");
1232 tokens.append_all(&foreign_mod.items);
1233 tokens.append("}");
1234 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001235 ItemKind::Ty(ref item) => {
David Tolnay3cf52982016-10-01 17:11:37 -07001236 self.vis.to_tokens(tokens);
1237 tokens.append("type");
1238 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001239 item.generics.to_tokens(tokens);
1240 item.generics.where_clause.to_tokens(tokens);
David Tolnay3cf52982016-10-01 17:11:37 -07001241 tokens.append("=");
Alex Crichton62a0a592017-05-22 13:58:53 -07001242 item.ty.to_tokens(tokens);
David Tolnay3cf52982016-10-01 17:11:37 -07001243 tokens.append(";");
1244 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001245 ItemKind::Enum(ref item) => {
David Tolnay47a877c2016-10-01 16:50:55 -07001246 self.vis.to_tokens(tokens);
David Tolnay4a51dc72016-10-01 00:40:31 -07001247 tokens.append("enum");
1248 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001249 item.generics.to_tokens(tokens);
1250 item.generics.where_clause.to_tokens(tokens);
David Tolnay4a51dc72016-10-01 00:40:31 -07001251 tokens.append("{");
Alex Crichton62a0a592017-05-22 13:58:53 -07001252 for variant in &item.variants {
David Tolnay4a51dc72016-10-01 00:40:31 -07001253 variant.to_tokens(tokens);
1254 tokens.append(",");
1255 }
1256 tokens.append("}");
1257 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001258 ItemKind::Struct(ref item) => {
David Tolnay47a877c2016-10-01 16:50:55 -07001259 self.vis.to_tokens(tokens);
David Tolnay4a51dc72016-10-01 00:40:31 -07001260 tokens.append("struct");
1261 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001262 item.generics.to_tokens(tokens);
1263 match item.data {
David Tolnaydaaf7742016-10-03 11:11:43 -07001264 VariantData::Struct(_) => {
Alex Crichton62a0a592017-05-22 13:58:53 -07001265 item.generics.where_clause.to_tokens(tokens);
1266 item.data.to_tokens(tokens);
David Tolnaydaaf7742016-10-03 11:11:43 -07001267 // no semicolon
1268 }
David Tolnay28c1db62016-10-27 22:48:18 -07001269 VariantData::Tuple(_) => {
Alex Crichton62a0a592017-05-22 13:58:53 -07001270 item.data.to_tokens(tokens);
1271 item.generics.where_clause.to_tokens(tokens);
David Tolnay28c1db62016-10-27 22:48:18 -07001272 tokens.append(";");
1273 }
1274 VariantData::Unit => {
Alex Crichton62a0a592017-05-22 13:58:53 -07001275 item.generics.where_clause.to_tokens(tokens);
David Tolnay28c1db62016-10-27 22:48:18 -07001276 tokens.append(";");
1277 }
David Tolnay4a51dc72016-10-01 00:40:31 -07001278 }
1279 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001280 ItemKind::Union(ref item) => {
David Tolnay2f9fa632016-10-03 22:08:48 -07001281 self.vis.to_tokens(tokens);
1282 tokens.append("union");
1283 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001284 item.generics.to_tokens(tokens);
1285 item.generics.where_clause.to_tokens(tokens);
1286 item.data.to_tokens(tokens);
David Tolnay2f9fa632016-10-03 22:08:48 -07001287 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001288 ItemKind::Trait(ref item) => {
David Tolnayca085422016-10-04 00:12:38 -07001289 self.vis.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001290 item.unsafety.to_tokens(tokens);
David Tolnayca085422016-10-04 00:12:38 -07001291 tokens.append("trait");
1292 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001293 item.generics.to_tokens(tokens);
1294 if !item.supertraits.is_empty() {
David Tolnayca085422016-10-04 00:12:38 -07001295 tokens.append(":");
Alex Crichton62a0a592017-05-22 13:58:53 -07001296 tokens.append_separated(&item.supertraits, "+");
David Tolnayca085422016-10-04 00:12:38 -07001297 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001298 item.generics.where_clause.to_tokens(tokens);
David Tolnayca085422016-10-04 00:12:38 -07001299 tokens.append("{");
Alex Crichton62a0a592017-05-22 13:58:53 -07001300 tokens.append_all(&item.items);
David Tolnayca085422016-10-04 00:12:38 -07001301 tokens.append("}");
1302 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001303 ItemKind::DefaultImpl(ref item) => {
1304 item.unsafety.to_tokens(tokens);
David Tolnayf94e2362016-10-04 00:29:51 -07001305 tokens.append("impl");
Alex Crichton62a0a592017-05-22 13:58:53 -07001306 item.path.to_tokens(tokens);
David Tolnayf94e2362016-10-04 00:29:51 -07001307 tokens.append("for");
1308 tokens.append("..");
1309 tokens.append("{");
1310 tokens.append("}");
1311 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001312 ItemKind::Impl(ref item) => {
1313 item.unsafety.to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001314 tokens.append("impl");
Alex Crichton62a0a592017-05-22 13:58:53 -07001315 item.generics.to_tokens(tokens);
1316 if let Some(ref path) = item.trait_ {
1317 item.polarity.to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001318 path.to_tokens(tokens);
1319 tokens.append("for");
1320 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001321 item.self_ty.to_tokens(tokens);
1322 item.generics.where_clause.to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001323 tokens.append("{");
Alex Crichton62a0a592017-05-22 13:58:53 -07001324 tokens.append_all(&item.items);
David Tolnay4c9be372016-10-06 00:47:37 -07001325 tokens.append("}");
1326 }
David Tolnaycc3d66e2016-10-02 23:36:05 -07001327 ItemKind::Mac(ref mac) => {
1328 mac.path.to_tokens(tokens);
1329 tokens.append("!");
1330 self.ident.to_tokens(tokens);
1331 for tt in &mac.tts {
1332 tt.to_tokens(tokens);
1333 }
1334 match mac.tts.last() {
David Tolnaydaaf7742016-10-03 11:11:43 -07001335 Some(&TokenTree::Delimited(Delimited { delim: DelimToken::Brace, .. })) => {
1336 // no semicolon
1337 }
David Tolnaycc3d66e2016-10-02 23:36:05 -07001338 _ => tokens.append(";"),
1339 }
1340 }
David Tolnay4a51dc72016-10-01 00:40:31 -07001341 }
1342 }
1343 }
David Tolnay42602292016-10-01 22:25:45 -07001344
Alex Crichton62a0a592017-05-22 13:58:53 -07001345 impl ToTokens for PathSimple {
David Tolnay4a057422016-10-08 00:02:31 -07001346 fn to_tokens(&self, tokens: &mut Tokens) {
Alex Crichton62a0a592017-05-22 13:58:53 -07001347 self.path.to_tokens(tokens);
1348 if let Some(ref rename) = self.rename {
1349 tokens.append("as");
1350 rename.to_tokens(tokens);
David Tolnay4a057422016-10-08 00:02:31 -07001351 }
1352 }
1353 }
1354
Alex Crichton62a0a592017-05-22 13:58:53 -07001355 impl ToTokens for PathGlob {
1356 fn to_tokens(&self, tokens: &mut Tokens) {
1357 self.path.to_tokens(tokens);
1358 tokens.append("::");
1359 tokens.append("*");
1360 }
1361 }
1362
1363 impl ToTokens for PathList {
1364 fn to_tokens(&self, tokens: &mut Tokens) {
1365 self.path.to_tokens(tokens);
1366 if self.path.global || !self.path.segments.is_empty() {
1367 tokens.append("::");
1368 }
1369 tokens.append("{");
1370 tokens.append_separated(&self.items, ",");
1371 tokens.append("}");
1372 }
1373 }
1374
David Tolnay4a057422016-10-08 00:02:31 -07001375 impl ToTokens for PathListItem {
1376 fn to_tokens(&self, tokens: &mut Tokens) {
1377 self.name.to_tokens(tokens);
1378 if let Some(ref rename) = self.rename {
1379 tokens.append("as");
1380 rename.to_tokens(tokens);
1381 }
1382 }
1383 }
1384
David Tolnayca085422016-10-04 00:12:38 -07001385 impl ToTokens for TraitItem {
1386 fn to_tokens(&self, tokens: &mut Tokens) {
1387 tokens.append_all(self.attrs.outer());
1388 match self.node {
Alex Crichton62a0a592017-05-22 13:58:53 -07001389 TraitItemKind::Const(ref item) => {
David Tolnayca085422016-10-04 00:12:38 -07001390 tokens.append("const");
1391 self.ident.to_tokens(tokens);
1392 tokens.append(":");
Alex Crichton62a0a592017-05-22 13:58:53 -07001393 item.ty.to_tokens(tokens);
1394 if let Some(ref expr) = item.default {
David Tolnayca085422016-10-04 00:12:38 -07001395 tokens.append("=");
1396 expr.to_tokens(tokens);
1397 }
1398 tokens.append(";");
1399 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001400 TraitItemKind::Method(ref item) => {
1401 item.sig.constness.to_tokens(tokens);
1402 item.sig.unsafety.to_tokens(tokens);
1403 item.sig.abi.to_tokens(tokens);
David Tolnayca085422016-10-04 00:12:38 -07001404 tokens.append("fn");
1405 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001406 item.sig.generics.to_tokens(tokens);
David Tolnayca085422016-10-04 00:12:38 -07001407 tokens.append("(");
Alex Crichton62a0a592017-05-22 13:58:53 -07001408 tokens.append_separated(&item.sig.decl.inputs, ",");
David Tolnayca085422016-10-04 00:12:38 -07001409 tokens.append(")");
Alex Crichton62a0a592017-05-22 13:58:53 -07001410 if let FunctionRetTy::Ty(ref ty) = item.sig.decl.output {
David Tolnayca085422016-10-04 00:12:38 -07001411 tokens.append("->");
1412 ty.to_tokens(tokens);
1413 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001414 item.sig.generics.where_clause.to_tokens(tokens);
1415 match item.default {
David Tolnay3b9783a2016-10-29 22:37:09 -07001416 Some(ref block) => {
1417 tokens.append("{");
1418 tokens.append_all(self.attrs.inner());
1419 tokens.append_all(&block.stmts);
1420 tokens.append("}");
1421 }
David Tolnayca085422016-10-04 00:12:38 -07001422 None => tokens.append(";"),
1423 }
1424 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001425 TraitItemKind::Type(ref item) => {
David Tolnayca085422016-10-04 00:12:38 -07001426 tokens.append("type");
1427 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001428 if !item.bounds.is_empty() {
David Tolnayca085422016-10-04 00:12:38 -07001429 tokens.append(":");
Alex Crichton62a0a592017-05-22 13:58:53 -07001430 tokens.append_separated(&item.bounds, "+");
David Tolnayca085422016-10-04 00:12:38 -07001431 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001432 if let Some(ref default) = item.default {
David Tolnayca085422016-10-04 00:12:38 -07001433 tokens.append("=");
1434 default.to_tokens(tokens);
1435 }
1436 tokens.append(";");
1437 }
1438 TraitItemKind::Macro(ref mac) => {
1439 mac.to_tokens(tokens);
David Tolnaye3198932016-10-04 00:21:34 -07001440 match mac.tts.last() {
1441 Some(&TokenTree::Delimited(Delimited { delim: DelimToken::Brace, .. })) => {
1442 // no semicolon
1443 }
1444 _ => tokens.append(";"),
1445 }
David Tolnayca085422016-10-04 00:12:38 -07001446 }
1447 }
1448 }
1449 }
1450
David Tolnay4c9be372016-10-06 00:47:37 -07001451 impl ToTokens for ImplItem {
1452 fn to_tokens(&self, tokens: &mut Tokens) {
1453 tokens.append_all(self.attrs.outer());
1454 match self.node {
Alex Crichton62a0a592017-05-22 13:58:53 -07001455 ImplItemKind::Const(ref item) => {
David Tolnay4c9be372016-10-06 00:47:37 -07001456 self.vis.to_tokens(tokens);
1457 self.defaultness.to_tokens(tokens);
1458 tokens.append("const");
1459 self.ident.to_tokens(tokens);
1460 tokens.append(":");
Alex Crichton62a0a592017-05-22 13:58:53 -07001461 item.ty.to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001462 tokens.append("=");
Alex Crichton62a0a592017-05-22 13:58:53 -07001463 item.expr.to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001464 tokens.append(";");
1465 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001466 ImplItemKind::Method(ref item) => {
David Tolnay4c9be372016-10-06 00:47:37 -07001467 self.vis.to_tokens(tokens);
1468 self.defaultness.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001469 item.sig.constness.to_tokens(tokens);
1470 item.sig.unsafety.to_tokens(tokens);
1471 item.sig.abi.to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001472 tokens.append("fn");
1473 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001474 item.sig.generics.to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001475 tokens.append("(");
Alex Crichton62a0a592017-05-22 13:58:53 -07001476 tokens.append_separated(&item.sig.decl.inputs, ",");
David Tolnay4c9be372016-10-06 00:47:37 -07001477 tokens.append(")");
Alex Crichton62a0a592017-05-22 13:58:53 -07001478 if let FunctionRetTy::Ty(ref ty) = item.sig.decl.output {
David Tolnay4c9be372016-10-06 00:47:37 -07001479 tokens.append("->");
1480 ty.to_tokens(tokens);
1481 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001482 item.sig.generics.where_clause.to_tokens(tokens);
David Tolnay5859df12016-10-29 22:49:54 -07001483 tokens.append("{");
1484 tokens.append_all(self.attrs.inner());
Alex Crichton62a0a592017-05-22 13:58:53 -07001485 tokens.append_all(&item.block.stmts);
David Tolnay5859df12016-10-29 22:49:54 -07001486 tokens.append("}");
David Tolnay4c9be372016-10-06 00:47:37 -07001487 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001488 ImplItemKind::Type(ref item) => {
David Tolnay4c9be372016-10-06 00:47:37 -07001489 self.vis.to_tokens(tokens);
1490 self.defaultness.to_tokens(tokens);
1491 tokens.append("type");
1492 self.ident.to_tokens(tokens);
1493 tokens.append("=");
Alex Crichton62a0a592017-05-22 13:58:53 -07001494 item.ty.to_tokens(tokens);
David Tolnay4c9be372016-10-06 00:47:37 -07001495 tokens.append(";");
1496 }
1497 ImplItemKind::Macro(ref mac) => {
1498 mac.to_tokens(tokens);
1499 match mac.tts.last() {
1500 Some(&TokenTree::Delimited(Delimited { delim: DelimToken::Brace, .. })) => {
1501 // no semicolon
1502 }
1503 _ => tokens.append(";"),
1504 }
1505 }
1506 }
1507 }
1508 }
1509
David Tolnay35902302016-10-06 01:11:08 -07001510 impl ToTokens for ForeignItem {
1511 fn to_tokens(&self, tokens: &mut Tokens) {
1512 tokens.append_all(self.attrs.outer());
1513 match self.node {
Alex Crichton62a0a592017-05-22 13:58:53 -07001514 ForeignItemKind::Fn(ref item) => {
David Tolnay35902302016-10-06 01:11:08 -07001515 self.vis.to_tokens(tokens);
1516 tokens.append("fn");
1517 self.ident.to_tokens(tokens);
Alex Crichton62a0a592017-05-22 13:58:53 -07001518 item.generics.to_tokens(tokens);
David Tolnay35902302016-10-06 01:11:08 -07001519 tokens.append("(");
Alex Crichton62a0a592017-05-22 13:58:53 -07001520 tokens.append_separated(&item.decl.inputs, ",");
1521 if item.decl.variadic {
1522 if !item.decl.inputs.is_empty() {
David Tolnay292e6002016-10-29 22:03:51 -07001523 tokens.append(",");
1524 }
1525 tokens.append("...");
1526 }
David Tolnay35902302016-10-06 01:11:08 -07001527 tokens.append(")");
Alex Crichton62a0a592017-05-22 13:58:53 -07001528 if let FunctionRetTy::Ty(ref ty) = item.decl.output {
David Tolnay35902302016-10-06 01:11:08 -07001529 tokens.append("->");
1530 ty.to_tokens(tokens);
1531 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001532 item.generics.where_clause.to_tokens(tokens);
David Tolnay35902302016-10-06 01:11:08 -07001533 tokens.append(";");
1534 }
Alex Crichton62a0a592017-05-22 13:58:53 -07001535 ForeignItemKind::Static(ref item) => {
David Tolnay35902302016-10-06 01:11:08 -07001536 self.vis.to_tokens(tokens);
1537 tokens.append("static");
Alex Crichton62a0a592017-05-22 13:58:53 -07001538 item.mutbl.to_tokens(tokens);
David Tolnay35902302016-10-06 01:11:08 -07001539 self.ident.to_tokens(tokens);
1540 tokens.append(":");
Alex Crichton62a0a592017-05-22 13:58:53 -07001541 item.ty.to_tokens(tokens);
David Tolnay35902302016-10-06 01:11:08 -07001542 tokens.append(";");
1543 }
1544 }
1545 }
1546 }
1547
Alex Crichton62a0a592017-05-22 13:58:53 -07001548 impl ToTokens for ArgSelfRef {
David Tolnay62f374c2016-10-02 13:37:00 -07001549 fn to_tokens(&self, tokens: &mut Tokens) {
Alex Crichton62a0a592017-05-22 13:58:53 -07001550 tokens.append("&");
1551 self.lifetime.to_tokens(tokens);
1552 self.mutbl.to_tokens(tokens);
1553 tokens.append("self");
1554 }
1555 }
1556
1557 impl ToTokens for ArgSelf {
1558 fn to_tokens(&self, tokens: &mut Tokens) {
1559 self.mutbl.to_tokens(tokens);
1560 tokens.append("self");
1561 }
1562 }
1563
1564 impl ToTokens for ArgCaptured {
1565 fn to_tokens(&self, tokens: &mut Tokens) {
1566 self.pat.to_tokens(tokens);
1567 tokens.append(":");
1568 self.ty.to_tokens(tokens);
David Tolnay62f374c2016-10-02 13:37:00 -07001569 }
1570 }
1571
David Tolnay42602292016-10-01 22:25:45 -07001572 impl ToTokens for Constness {
1573 fn to_tokens(&self, tokens: &mut Tokens) {
1574 match *self {
1575 Constness::Const => tokens.append("const"),
David Tolnaydaaf7742016-10-03 11:11:43 -07001576 Constness::NotConst => {
1577 // nothing
1578 }
David Tolnay42602292016-10-01 22:25:45 -07001579 }
1580 }
1581 }
1582
David Tolnay4c9be372016-10-06 00:47:37 -07001583 impl ToTokens for Defaultness {
1584 fn to_tokens(&self, tokens: &mut Tokens) {
1585 match *self {
1586 Defaultness::Default => tokens.append("default"),
1587 Defaultness::Final => {
1588 // nothing
1589 }
1590 }
1591 }
1592 }
1593
1594 impl ToTokens for ImplPolarity {
1595 fn to_tokens(&self, tokens: &mut Tokens) {
1596 match *self {
1597 ImplPolarity::Negative => tokens.append("!"),
1598 ImplPolarity::Positive => {
1599 // nothing
1600 }
1601 }
1602 }
1603 }
David Tolnay4a51dc72016-10-01 00:40:31 -07001604}