2 use derive
::{Data, DeriveInput}
;
3 use proc_macro2
::TokenStream
;
4 use punctuated
::Punctuated
;
5 use token
::{Brace, Paren}
;
7 #[cfg(feature = "extra-traits")]
8 use std
::hash
::{Hash, Hasher}
;
9 #[cfg(feature = "extra-traits")]
10 use tt
::TokenStreamHelper
;
12 ast_enum_of_structs
! {
13 /// Things that can appear directly inside of a module or scope.
15 /// *This type is available if Syn is built with the `"full"` feature.*
17 /// # Syntax tree enum
19 /// This type is a [syntax tree enum].
21 /// [syntax tree enum]: enum.Expr.html#syntax-tree-enums
23 /// An `extern crate` item: `extern crate serde`.
25 /// *This type is available if Syn is built with the `"full"` feature.*
26 pub ExternCrate(ItemExternCrate
{
27 pub attrs
: Vec
<Attribute
>,
29 pub extern_token
: Token
![extern],
30 pub crate_token
: Token
![crate],
32 pub rename
: Option
<(Token
![as], Ident
)>,
33 pub semi_token
: Token
![;],
36 /// A use declaration: `use std::collections::HashMap`.
38 /// *This type is available if Syn is built with the `"full"` feature.*
40 pub attrs
: Vec
<Attribute
>,
42 pub use_token
: Token
![use],
43 pub leading_colon
: Option
<Token
![::]>,
45 pub semi_token
: Token
![;],
48 /// A static item: `static BIKE: Shed = Shed(42)`.
50 /// *This type is available if Syn is built with the `"full"` feature.*
51 pub Static(ItemStatic
{
52 pub attrs
: Vec
<Attribute
>,
54 pub static_token
: Token
![static],
55 pub mutability
: Option
<Token
![mut]>,
57 pub colon_token
: Token
![:],
59 pub eq_token
: Token
![=],
61 pub semi_token
: Token
![;],
64 /// A constant item: `const MAX: u16 = 65535`.
66 /// *This type is available if Syn is built with the `"full"` feature.*
68 pub attrs
: Vec
<Attribute
>,
70 pub const_token
: Token
![const],
72 pub colon_token
: Token
![:],
74 pub eq_token
: Token
![=],
76 pub semi_token
: Token
![;],
79 /// A free-standing function: `fn process(n: usize) -> Result<()> { ...
82 /// *This type is available if Syn is built with the `"full"` feature.*
84 pub attrs
: Vec
<Attribute
>,
86 pub constness
: Option
<Token
![const]>,
87 pub unsafety
: Option
<Token
![unsafe]>,
88 pub asyncness
: Option
<Token
![async
]>,
91 pub decl
: Box
<FnDecl
>,
92 pub block
: Box
<Block
>,
95 /// A module or module declaration: `mod m` or `mod m { ... }`.
97 /// *This type is available if Syn is built with the `"full"` feature.*
99 pub attrs
: Vec
<Attribute
>,
101 pub mod_token
: Token
![mod],
103 pub content
: Option
<(token
::Brace
, Vec
<Item
>)>,
104 pub semi
: Option
<Token
![;]>,
107 /// A block of foreign items: `extern "C" { ... }`.
109 /// *This type is available if Syn is built with the `"full"` feature.*
110 pub ForeignMod(ItemForeignMod
{
111 pub attrs
: Vec
<Attribute
>,
113 pub brace_token
: token
::Brace
,
114 pub items
: Vec
<ForeignItem
>,
117 /// A type alias: `type Result<T> = std::result::Result<T, MyError>`.
119 /// *This type is available if Syn is built with the `"full"` feature.*
121 pub attrs
: Vec
<Attribute
>,
123 pub type_token
: Token
![type],
125 pub generics
: Generics
,
126 pub eq_token
: Token
![=],
128 pub semi_token
: Token
![;],
131 /// An existential type: `existential type Iter: Iterator<Item = u8>`.
133 /// *This type is available if Syn is built with the `"full"` feature.*
134 pub Existential(ItemExistential
{
135 pub attrs
: Vec
<Attribute
>,
137 pub existential_token
: Token
![existential
],
138 pub type_token
: Token
![type],
140 pub generics
: Generics
,
141 pub colon_token
: Option
<Token
![:]>,
142 pub bounds
: Punctuated
<TypeParamBound
, Token
![+]>,
143 pub semi_token
: Token
![;],
146 /// A struct definition: `struct Foo<A> { x: A }`.
148 /// *This type is available if Syn is built with the `"full"` feature.*
149 pub Struct(ItemStruct
{
150 pub attrs
: Vec
<Attribute
>,
152 pub struct_token
: Token
![struct],
154 pub generics
: Generics
,
156 pub semi_token
: Option
<Token
![;]>,
159 /// An enum definition: `enum Foo<A, B> { C<A>, D<B> }`.
161 /// *This type is available if Syn is built with the `"full"` feature.*
163 pub attrs
: Vec
<Attribute
>,
165 pub enum_token
: Token
![enum],
167 pub generics
: Generics
,
168 pub brace_token
: token
::Brace
,
169 pub variants
: Punctuated
<Variant
, Token
![,]>,
172 /// A union definition: `union Foo<A, B> { x: A, y: B }`.
174 /// *This type is available if Syn is built with the `"full"` feature.*
175 pub Union(ItemUnion
{
176 pub attrs
: Vec
<Attribute
>,
178 pub union_token
: Token
![union],
180 pub generics
: Generics
,
181 pub fields
: FieldsNamed
,
184 /// A trait definition: `pub trait Iterator { ... }`.
186 /// *This type is available if Syn is built with the `"full"` feature.*
187 pub Trait(ItemTrait
{
188 pub attrs
: Vec
<Attribute
>,
190 pub unsafety
: Option
<Token
![unsafe]>,
191 pub auto_token
: Option
<Token
![auto]>,
192 pub trait_token
: Token
![trait],
194 pub generics
: Generics
,
195 pub colon_token
: Option
<Token
![:]>,
196 pub supertraits
: Punctuated
<TypeParamBound
, Token
![+]>,
197 pub brace_token
: token
::Brace
,
198 pub items
: Vec
<TraitItem
>,
201 /// A trait alias: `pub trait SharableIterator = Iterator + Sync`.
203 /// *This type is available if Syn is built with the `"full"` feature.*
204 pub TraitAlias(ItemTraitAlias
{
205 pub attrs
: Vec
<Attribute
>,
207 pub trait_token
: Token
![trait],
209 pub generics
: Generics
,
210 pub eq_token
: Token
![=],
211 pub bounds
: Punctuated
<TypeParamBound
, Token
![+]>,
212 pub semi_token
: Token
![;],
215 /// An impl block providing trait or associated items: `impl<A> Trait
216 /// for Data<A> { ... }`.
218 /// *This type is available if Syn is built with the `"full"` feature.*
220 pub attrs
: Vec
<Attribute
>,
221 pub defaultness
: Option
<Token
![default]>,
222 pub unsafety
: Option
<Token
![unsafe]>,
223 pub impl_token
: Token
![impl],
224 pub generics
: Generics
,
225 /// Trait this impl implements.
226 pub trait_
: Option
<(Option
<Token
![!]>, Path
, Token
![for])>,
227 /// The Self type of the impl.
228 pub self_ty
: Box
<Type
>,
229 pub brace_token
: token
::Brace
,
230 pub items
: Vec
<ImplItem
>,
233 /// A macro invocation, which includes `macro_rules!` definitions.
235 /// *This type is available if Syn is built with the `"full"` feature.*
236 pub Macro(ItemMacro
{
237 pub attrs
: Vec
<Attribute
>,
238 /// The `example` in `macro_rules! example { ... }`.
239 pub ident
: Option
<Ident
>,
241 pub semi_token
: Option
<Token
![;]>,
244 /// A 2.0-style declarative macro introduced by the `macro` keyword.
246 /// *This type is available if Syn is built with the `"full"` feature.*
247 pub Macro2(ItemMacro2
#manual_extra_traits {
248 pub attrs
: Vec
<Attribute
>,
250 pub macro_token
: Token
![macro],
252 pub paren_token
: Paren
,
253 pub args
: TokenStream
,
254 pub brace_token
: Brace
,
255 pub body
: TokenStream
,
258 /// Tokens forming an item not interpreted by Syn.
260 /// *This type is available if Syn is built with the `"full"` feature.*
261 pub Verbatim(ItemVerbatim
#manual_extra_traits {
262 pub tts
: TokenStream
,
267 #[cfg(feature = "extra-traits")]
268 impl Eq
for ItemMacro2 {}
270 #[cfg(feature = "extra-traits")]
271 impl PartialEq
for ItemMacro2
{
272 fn eq(&self, other
: &Self) -> bool
{
273 self.attrs
== other
.attrs
274 && self.vis
== other
.vis
275 && self.macro_token
== other
.macro_token
276 && self.ident
== other
.ident
277 && self.paren_token
== other
.paren_token
278 && TokenStreamHelper(&self.args
) == TokenStreamHelper(&other
.args
)
279 && self.brace_token
== other
.brace_token
280 && TokenStreamHelper(&self.body
) == TokenStreamHelper(&other
.body
)
284 #[cfg(feature = "extra-traits")]
285 impl Hash
for ItemMacro2
{
286 fn hash
<H
>(&self, state
: &mut H
)
290 self.attrs
.hash(state
);
291 self.vis
.hash(state
);
292 self.macro_token
.hash(state
);
293 self.ident
.hash(state
);
294 self.paren_token
.hash(state
);
295 TokenStreamHelper(&self.args
).hash(state
);
296 self.brace_token
.hash(state
);
297 TokenStreamHelper(&self.body
).hash(state
);
301 #[cfg(feature = "extra-traits")]
302 impl Eq
for ItemVerbatim {}
304 #[cfg(feature = "extra-traits")]
305 impl PartialEq
for ItemVerbatim
{
306 fn eq(&self, other
: &Self) -> bool
{
307 TokenStreamHelper(&self.tts
) == TokenStreamHelper(&other
.tts
)
311 #[cfg(feature = "extra-traits")]
312 impl Hash
for ItemVerbatim
{
313 fn hash
<H
>(&self, state
: &mut H
)
317 TokenStreamHelper(&self.tts
).hash(state
);
321 impl From
<DeriveInput
> for Item
{
322 fn from(input
: DeriveInput
) -> Item
{
324 Data
::Struct(data
) => Item
::Struct(ItemStruct
{
327 struct_token
: data
.struct_token
,
329 generics
: input
.generics
,
331 semi_token
: data
.semi_token
,
333 Data
::Enum(data
) => Item
::Enum(ItemEnum
{
336 enum_token
: data
.enum_token
,
338 generics
: input
.generics
,
339 brace_token
: data
.brace_token
,
340 variants
: data
.variants
,
342 Data
::Union(data
) => Item
::Union(ItemUnion
{
345 union_token
: data
.union_token
,
347 generics
: input
.generics
,
354 ast_enum_of_structs
! {
355 /// A suffix of an import tree in a `use` item: `Type as Renamed` or `*`.
357 /// *This type is available if Syn is built with the `"full"` feature.*
359 /// # Syntax tree enum
361 /// This type is a [syntax tree enum].
363 /// [syntax tree enum]: enum.Expr.html#syntax-tree-enums
365 /// A path prefix of imports in a `use` item: `std::...`.
367 /// *This type is available if Syn is built with the `"full"` feature.*
370 pub colon2_token
: Token
![::],
371 pub tree
: Box
<UseTree
>,
374 /// An identifier imported by a `use` item: `HashMap`.
376 /// *This type is available if Syn is built with the `"full"` feature.*
381 /// An renamed identifier imported by a `use` item: `HashMap as Map`.
383 /// *This type is available if Syn is built with the `"full"` feature.*
384 pub Rename(UseRename
{
386 pub as_token
: Token
![as],
390 /// A glob import in a `use` item: `*`.
392 /// *This type is available if Syn is built with the `"full"` feature.*
394 pub star_token
: Token
![*],
397 /// A braced group of imports in a `use` item: `{A, B, C}`.
399 /// *This type is available if Syn is built with the `"full"` feature.*
401 pub brace_token
: token
::Brace
,
402 pub items
: Punctuated
<UseTree
, Token
![,]>,
407 ast_enum_of_structs
! {
408 /// An item within an `extern` block.
410 /// *This type is available if Syn is built with the `"full"` feature.*
412 /// # Syntax tree enum
414 /// This type is a [syntax tree enum].
416 /// [syntax tree enum]: enum.Expr.html#syntax-tree-enums
417 pub enum ForeignItem
{
418 /// A foreign function in an `extern` block.
420 /// *This type is available if Syn is built with the `"full"` feature.*
421 pub Fn(ForeignItemFn
{
422 pub attrs
: Vec
<Attribute
>,
425 pub decl
: Box
<FnDecl
>,
426 pub semi_token
: Token
![;],
429 /// A foreign static item in an `extern` block: `static ext: u8`.
431 /// *This type is available if Syn is built with the `"full"` feature.*
432 pub Static(ForeignItemStatic
{
433 pub attrs
: Vec
<Attribute
>,
435 pub static_token
: Token
![static],
436 pub mutability
: Option
<Token
![mut]>,
438 pub colon_token
: Token
![:],
440 pub semi_token
: Token
![;],
443 /// A foreign type in an `extern` block: `type void`.
445 /// *This type is available if Syn is built with the `"full"` feature.*
446 pub Type(ForeignItemType
{
447 pub attrs
: Vec
<Attribute
>,
449 pub type_token
: Token
![type],
451 pub semi_token
: Token
![;],
454 /// A macro invocation within an extern block.
456 /// *This type is available if Syn is built with the `"full"` feature.*
457 pub Macro(ForeignItemMacro
{
458 pub attrs
: Vec
<Attribute
>,
460 pub semi_token
: Option
<Token
![;]>,
463 /// Tokens in an `extern` block not interpreted by Syn.
465 /// *This type is available if Syn is built with the `"full"` feature.*
466 pub Verbatim(ForeignItemVerbatim
#manual_extra_traits {
467 pub tts
: TokenStream
,
472 #[cfg(feature = "extra-traits")]
473 impl Eq
for ForeignItemVerbatim {}
475 #[cfg(feature = "extra-traits")]
476 impl PartialEq
for ForeignItemVerbatim
{
477 fn eq(&self, other
: &Self) -> bool
{
478 TokenStreamHelper(&self.tts
) == TokenStreamHelper(&other
.tts
)
482 #[cfg(feature = "extra-traits")]
483 impl Hash
for ForeignItemVerbatim
{
484 fn hash
<H
>(&self, state
: &mut H
)
488 TokenStreamHelper(&self.tts
).hash(state
);
492 ast_enum_of_structs
! {
493 /// An item declaration within the definition of a trait.
495 /// *This type is available if Syn is built with the `"full"` feature.*
497 /// # Syntax tree enum
499 /// This type is a [syntax tree enum].
501 /// [syntax tree enum]: enum.Expr.html#syntax-tree-enums
503 /// An associated constant within the definition of a trait.
505 /// *This type is available if Syn is built with the `"full"` feature.*
506 pub Const(TraitItemConst
{
507 pub attrs
: Vec
<Attribute
>,
508 pub const_token
: Token
![const],
510 pub colon_token
: Token
![:],
512 pub default: Option
<(Token
![=], Expr
)>,
513 pub semi_token
: Token
![;],
516 /// A trait method within the definition of a trait.
518 /// *This type is available if Syn is built with the `"full"` feature.*
519 pub Method(TraitItemMethod
{
520 pub attrs
: Vec
<Attribute
>,
522 pub default: Option
<Block
>,
523 pub semi_token
: Option
<Token
![;]>,
526 /// An associated type within the definition of a trait.
528 /// *This type is available if Syn is built with the `"full"` feature.*
529 pub Type(TraitItemType
{
530 pub attrs
: Vec
<Attribute
>,
531 pub type_token
: Token
![type],
533 pub generics
: Generics
,
534 pub colon_token
: Option
<Token
![:]>,
535 pub bounds
: Punctuated
<TypeParamBound
, Token
![+]>,
536 pub default: Option
<(Token
![=], Type
)>,
537 pub semi_token
: Token
![;],
540 /// A macro invocation within the definition of a trait.
542 /// *This type is available if Syn is built with the `"full"` feature.*
543 pub Macro(TraitItemMacro
{
544 pub attrs
: Vec
<Attribute
>,
546 pub semi_token
: Option
<Token
![;]>,
549 /// Tokens within the definition of a trait not interpreted by Syn.
551 /// *This type is available if Syn is built with the `"full"` feature.*
552 pub Verbatim(TraitItemVerbatim
#manual_extra_traits {
553 pub tts
: TokenStream
,
558 #[cfg(feature = "extra-traits")]
559 impl Eq
for TraitItemVerbatim {}
561 #[cfg(feature = "extra-traits")]
562 impl PartialEq
for TraitItemVerbatim
{
563 fn eq(&self, other
: &Self) -> bool
{
564 TokenStreamHelper(&self.tts
) == TokenStreamHelper(&other
.tts
)
568 #[cfg(feature = "extra-traits")]
569 impl Hash
for TraitItemVerbatim
{
570 fn hash
<H
>(&self, state
: &mut H
)
574 TokenStreamHelper(&self.tts
).hash(state
);
578 ast_enum_of_structs
! {
579 /// An item within an impl block.
581 /// *This type is available if Syn is built with the `"full"` feature.*
583 /// # Syntax tree enum
585 /// This type is a [syntax tree enum].
587 /// [syntax tree enum]: enum.Expr.html#syntax-tree-enums
589 /// An associated constant within an impl block.
591 /// *This type is available if Syn is built with the `"full"` feature.*
592 pub Const(ImplItemConst
{
593 pub attrs
: Vec
<Attribute
>,
595 pub defaultness
: Option
<Token
![default]>,
596 pub const_token
: Token
![const],
598 pub colon_token
: Token
![:],
600 pub eq_token
: Token
![=],
602 pub semi_token
: Token
![;],
605 /// A method within an impl block.
607 /// *This type is available if Syn is built with the `"full"` feature.*
608 pub Method(ImplItemMethod
{
609 pub attrs
: Vec
<Attribute
>,
611 pub defaultness
: Option
<Token
![default]>,
616 /// An associated type within an impl block.
618 /// *This type is available if Syn is built with the `"full"` feature.*
619 pub Type(ImplItemType
{
620 pub attrs
: Vec
<Attribute
>,
622 pub defaultness
: Option
<Token
![default]>,
623 pub type_token
: Token
![type],
625 pub generics
: Generics
,
626 pub eq_token
: Token
![=],
628 pub semi_token
: Token
![;],
631 /// An existential type within an impl block.
633 /// *This type is available if Syn is built with the `"full"` feature.*
634 pub Existential(ImplItemExistential
{
635 pub attrs
: Vec
<Attribute
>,
636 pub existential_token
: Token
![existential
],
637 pub type_token
: Token
![type],
639 pub generics
: Generics
,
640 pub colon_token
: Option
<Token
![:]>,
641 pub bounds
: Punctuated
<TypeParamBound
, Token
![+]>,
642 pub semi_token
: Token
![;],
645 /// A macro invocation within an impl block.
647 /// *This type is available if Syn is built with the `"full"` feature.*
648 pub Macro(ImplItemMacro
{
649 pub attrs
: Vec
<Attribute
>,
651 pub semi_token
: Option
<Token
![;]>,
654 /// Tokens within an impl block not interpreted by Syn.
656 /// *This type is available if Syn is built with the `"full"` feature.*
657 pub Verbatim(ImplItemVerbatim
#manual_extra_traits {
658 pub tts
: TokenStream
,
663 #[cfg(feature = "extra-traits")]
664 impl Eq
for ImplItemVerbatim {}
666 #[cfg(feature = "extra-traits")]
667 impl PartialEq
for ImplItemVerbatim
{
668 fn eq(&self, other
: &Self) -> bool
{
669 TokenStreamHelper(&self.tts
) == TokenStreamHelper(&other
.tts
)
673 #[cfg(feature = "extra-traits")]
674 impl Hash
for ImplItemVerbatim
{
675 fn hash
<H
>(&self, state
: &mut H
)
679 TokenStreamHelper(&self.tts
).hash(state
);
684 /// A method's signature in a trait or implementation: `unsafe fn
685 /// initialize(&self)`.
687 /// *This type is available if Syn is built with the `"full"` feature.*
688 pub struct MethodSig
{
689 pub constness
: Option
<Token
![const]>,
690 pub unsafety
: Option
<Token
![unsafe]>,
691 pub asyncness
: Option
<Token
![async
]>,
692 pub abi
: Option
<Abi
>,
699 /// Header of a function declaration, without including the body.
701 /// *This type is available if Syn is built with the `"full"` feature.*
703 pub fn_token
: Token
![fn],
704 pub generics
: Generics
,
705 pub paren_token
: token
::Paren
,
706 pub inputs
: Punctuated
<FnArg
, Token
![,]>,
707 pub variadic
: Option
<Token
![...]>,
708 pub output
: ReturnType
,
712 ast_enum_of_structs
! {
713 /// An argument in a function signature: the `n: usize` in `fn f(n: usize)`.
715 /// *This type is available if Syn is built with the `"full"` feature.*
717 /// # Syntax tree enum
719 /// This type is a [syntax tree enum].
721 /// [syntax tree enum]: enum.Expr.html#syntax-tree-enums
723 /// Self captured by reference in a function signature: `&self` or `&mut
726 /// *This type is available if Syn is built with the `"full"` feature.*
727 pub SelfRef(ArgSelfRef
{
728 pub and_token
: Token
![&],
729 pub lifetime
: Option
<Lifetime
>,
730 pub mutability
: Option
<Token
![mut]>,
731 pub self_token
: Token
![self],
734 /// Self captured by value in a function signature: `self` or `mut
737 /// *This type is available if Syn is built with the `"full"` feature.*
738 pub SelfValue(ArgSelf
{
739 pub mutability
: Option
<Token
![mut]>,
740 pub self_token
: Token
![self],
743 /// An explicitly typed pattern captured by a function signature.
745 /// *This type is available if Syn is built with the `"full"` feature.*
746 pub Captured(ArgCaptured
{
748 pub colon_token
: Token
![:],
752 /// A pattern whose type is inferred captured by a function signature.
754 /// A type not bound to any pattern in a function signature.
759 #[cfg(feature = "parsing")]
764 use parse
::{Parse, ParseStream, Result}
;
765 use proc_macro2
::{Punct, Spacing, TokenTree}
;
766 use std
::iter
::FromIterator
;
768 impl Parse
for Item
{
769 fn parse(input
: ParseStream
) -> Result
<Self> {
770 let ahead
= input
.fork();
771 ahead
.call(Attribute
::parse_outer
)?
;
772 let vis
: Visibility
= ahead
.parse()?
;
774 let lookahead
= ahead
.lookahead1();
775 if lookahead
.peek(Token
![extern]) {
776 ahead
.parse
::<Token
![extern]>()?
;
777 let lookahead
= ahead
.lookahead1();
778 if lookahead
.peek(Token
![crate]) {
779 input
.parse().map(Item
::ExternCrate
)
780 } else if lookahead
.peek(Token
![fn]) {
781 input
.parse().map(Item
::Fn
)
782 } else if lookahead
.peek(token
::Brace
) {
783 input
.parse().map(Item
::ForeignMod
)
784 } else if lookahead
.peek(LitStr
) {
785 ahead
.parse
::<LitStr
>()?
;
786 let lookahead
= ahead
.lookahead1();
787 if lookahead
.peek(token
::Brace
) {
788 input
.parse().map(Item
::ForeignMod
)
789 } else if lookahead
.peek(Token
![fn]) {
790 input
.parse().map(Item
::Fn
)
792 Err(lookahead
.error())
795 Err(lookahead
.error())
797 } else if lookahead
.peek(Token
![use]) {
798 input
.parse().map(Item
::Use
)
799 } else if lookahead
.peek(Token
![static]) {
800 input
.parse().map(Item
::Static
)
801 } else if lookahead
.peek(Token
![const]) {
802 ahead
.parse
::<Token
![const]>()?
;
803 let lookahead
= ahead
.lookahead1();
804 if lookahead
.peek(Ident
) || lookahead
.peek(Token
![_
]) {
805 input
.parse().map(Item
::Const
)
806 } else if lookahead
.peek(Token
![unsafe])
807 || lookahead
.peek(Token
![async
])
808 || lookahead
.peek(Token
![extern])
809 || lookahead
.peek(Token
![fn])
811 input
.parse().map(Item
::Fn
)
813 Err(lookahead
.error())
815 } else if lookahead
.peek(Token
![unsafe]) {
816 ahead
.parse
::<Token
![unsafe]>()?
;
817 let lookahead
= ahead
.lookahead1();
818 if lookahead
.peek(Token
![trait])
819 || lookahead
.peek(Token
![auto]) && ahead
.peek2(Token
![trait])
821 input
.parse().map(Item
::Trait
)
822 } else if lookahead
.peek(Token
![impl ]) {
823 input
.parse().map(Item
::Impl
)
824 } else if lookahead
.peek(Token
![async
])
825 || lookahead
.peek(Token
![extern])
826 || lookahead
.peek(Token
![fn])
828 input
.parse().map(Item
::Fn
)
830 Err(lookahead
.error())
832 } else if lookahead
.peek(Token
![async
]) || lookahead
.peek(Token
![fn]) {
833 input
.parse().map(Item
::Fn
)
834 } else if lookahead
.peek(Token
![mod]) {
835 input
.parse().map(Item
::Mod
)
836 } else if lookahead
.peek(Token
![type]) {
837 input
.parse().map(Item
::Type
)
838 } else if lookahead
.peek(Token
![existential
]) {
839 input
.parse().map(Item
::Existential
)
840 } else if lookahead
.peek(Token
![struct]) {
841 input
.parse().map(Item
::Struct
)
842 } else if lookahead
.peek(Token
![enum]) {
843 input
.parse().map(Item
::Enum
)
844 } else if lookahead
.peek(Token
![union]) && ahead
.peek2(Ident
) {
845 input
.parse().map(Item
::Union
)
846 } else if lookahead
.peek(Token
![trait]) {
847 input
.call(parse_trait_or_trait_alias
)
848 } else if lookahead
.peek(Token
![auto]) && ahead
.peek2(Token
![trait]) {
849 input
.parse().map(Item
::Trait
)
850 } else if lookahead
.peek(Token
![impl ])
851 || lookahead
.peek(Token
![default]) && !ahead
.peek2(Token
![!])
853 input
.parse().map(Item
::Impl
)
854 } else if lookahead
.peek(Token
![macro]) {
855 input
.parse().map(Item
::Macro2
)
856 } else if vis
.is_inherited()
857 && (lookahead
.peek(Ident
)
858 || lookahead
.peek(Token
![self])
859 || lookahead
.peek(Token
![super])
860 || lookahead
.peek(Token
![extern])
861 || lookahead
.peek(Token
![crate])
862 || lookahead
.peek(Token
![::]))
864 input
.parse().map(Item
::Macro
)
866 Err(lookahead
.error())
871 impl Parse
for ItemMacro
{
872 fn parse(input
: ParseStream
) -> Result
<Self> {
873 let attrs
= input
.call(Attribute
::parse_outer
)?
;
874 let path
= input
.call(Path
::parse_mod_style
)?
;
875 let bang_token
: Token
![!] = input
.parse()?
;
876 let ident
: Option
<Ident
> = input
.parse()?
;
877 let (delimiter
, tts
) = input
.call(mac
::parse_delimiter
)?
;
878 let semi_token
: Option
<Token
![;]> = if !delimiter
.is_brace() {
888 bang_token
: bang_token
,
889 delimiter
: delimiter
,
892 semi_token
: semi_token
,
897 // TODO: figure out the actual grammar; is body required to be braced?
898 impl Parse
for ItemMacro2
{
899 fn parse(input
: ParseStream
) -> Result
<Self> {
900 let attrs
= input
.call(Attribute
::parse_outer
)?
;
901 let vis
: Visibility
= input
.parse()?
;
902 let macro_token
: Token
![macro] = input
.parse()?
;
903 let ident
: Ident
= input
.parse()?
;
909 let lookahead
= input
.lookahead1();
910 if lookahead
.peek(token
::Paren
) {
912 paren_token
= parenthesized
!(paren_content
in input
);
913 args
= paren_content
.parse()?
;
916 brace_token
= braced
!(brace_content
in input
);
917 body
= brace_content
.parse()?
;
918 } else if lookahead
.peek(token
::Brace
) {
919 // Hack: the ItemMacro2 syntax tree will need to change so that
920 // we can store None for the args.
922 // https://github.com/dtolnay/syn/issues/548
924 // For now, store some sentinel tokens that are otherwise
926 paren_token
= token
::Paren
::default();
927 args
= TokenStream
::from_iter(vec
![
928 TokenTree
::Punct(Punct
::new('$'
, Spacing
::Alone
)),
929 TokenTree
::Punct(Punct
::new('$'
, Spacing
::Alone
)),
933 brace_token
= braced
!(brace_content
in input
);
934 body
= brace_content
.parse()?
;
936 return Err(lookahead
.error());
942 macro_token
: macro_token
,
944 paren_token
: paren_token
,
946 brace_token
: brace_token
,
952 impl Parse
for ItemExternCrate
{
953 fn parse(input
: ParseStream
) -> Result
<Self> {
955 attrs
: input
.call(Attribute
::parse_outer
)?
,
957 extern_token
: input
.parse()?
,
958 crate_token
: input
.parse()?
,
960 if input
.peek(Token
![self]) {
961 input
.call(Ident
::parse_any
)?
967 if input
.peek(Token
![as]) {
968 let as_token
: Token
![as] = input
.parse()?
;
969 let rename
: Ident
= input
.parse()?
;
970 Some((as_token
, rename
))
975 semi_token
: input
.parse()?
,
980 impl Parse
for ItemUse
{
981 fn parse(input
: ParseStream
) -> Result
<Self> {
983 attrs
: input
.call(Attribute
::parse_outer
)?
,
985 use_token
: input
.parse()?
,
986 leading_colon
: input
.parse()?
,
987 tree
: input
.call(use_tree
)?
,
988 semi_token
: input
.parse()?
,
993 fn use_tree(input
: ParseStream
) -> Result
<UseTree
> {
994 let lookahead
= input
.lookahead1();
995 if lookahead
.peek(Ident
)
996 || lookahead
.peek(Token
![self])
997 || lookahead
.peek(Token
![super])
998 || lookahead
.peek(Token
![crate])
999 || lookahead
.peek(Token
![extern])
1001 let ident
= input
.call(Ident
::parse_any
)?
;
1002 if input
.peek(Token
![::]) {
1003 Ok(UseTree
::Path(UsePath
{
1005 colon2_token
: input
.parse()?
,
1006 tree
: Box
::new(input
.call(use_tree
)?
),
1008 } else if input
.peek(Token
![as]) {
1009 Ok(UseTree
::Rename(UseRename
{
1011 as_token
: input
.parse()?
,
1013 if input
.peek(Ident
) {
1015 } else if input
.peek(Token
![_
]) {
1016 Ident
::from(input
.parse
::<Token
![_
]>()?
)
1018 return Err(input
.error("expected identifier or underscore"));
1023 Ok(UseTree
::Name(UseName { ident: ident }
))
1025 } else if lookahead
.peek(Token
![*]) {
1026 Ok(UseTree
::Glob(UseGlob
{
1027 star_token
: input
.parse()?
,
1029 } else if lookahead
.peek(token
::Brace
) {
1031 Ok(UseTree
::Group(UseGroup
{
1032 brace_token
: braced
!(content
in input
),
1033 items
: content
.parse_terminated(use_tree
)?
,
1036 Err(lookahead
.error())
1040 impl Parse
for ItemStatic
{
1041 fn parse(input
: ParseStream
) -> Result
<Self> {
1043 attrs
: input
.call(Attribute
::parse_outer
)?
,
1044 vis
: input
.parse()?
,
1045 static_token
: input
.parse()?
,
1046 mutability
: input
.parse()?
,
1047 ident
: input
.parse()?
,
1048 colon_token
: input
.parse()?
,
1050 eq_token
: input
.parse()?
,
1051 expr
: input
.parse()?
,
1052 semi_token
: input
.parse()?
,
1057 impl Parse
for ItemConst
{
1058 fn parse(input
: ParseStream
) -> Result
<Self> {
1060 attrs
: input
.call(Attribute
::parse_outer
)?
,
1061 vis
: input
.parse()?
,
1062 const_token
: input
.parse()?
,
1064 let lookahead
= input
.lookahead1();
1065 if lookahead
.peek(Ident
) || lookahead
.peek(Token
![_
]) {
1066 input
.call(Ident
::parse_any
)?
1068 return Err(lookahead
.error());
1071 colon_token
: input
.parse()?
,
1073 eq_token
: input
.parse()?
,
1074 expr
: input
.parse()?
,
1075 semi_token
: input
.parse()?
,
1080 impl Parse
for ItemFn
{
1081 fn parse(input
: ParseStream
) -> Result
<Self> {
1082 let outer_attrs
= input
.call(Attribute
::parse_outer
)?
;
1083 let vis
: Visibility
= input
.parse()?
;
1084 let constness
: Option
<Token
![const]> = input
.parse()?
;
1085 let unsafety
: Option
<Token
![unsafe]> = input
.parse()?
;
1086 let asyncness
: Option
<Token
![async
]> = input
.parse()?
;
1087 let abi
: Option
<Abi
> = input
.parse()?
;
1088 let fn_token
: Token
![fn] = input
.parse()?
;
1089 let ident
: Ident
= input
.parse()?
;
1090 let generics
: Generics
= input
.parse()?
;
1093 let paren_token
= parenthesized
!(content
in input
);
1094 let inputs
= content
.parse_terminated(FnArg
::parse
)?
;
1096 let output
: ReturnType
= input
.parse()?
;
1097 let where_clause
: Option
<WhereClause
> = input
.parse()?
;
1100 let brace_token
= braced
!(content
in input
);
1101 let inner_attrs
= content
.call(Attribute
::parse_inner
)?
;
1102 let stmts
= content
.call(Block
::parse_within
)?
;
1105 attrs
: private
::attrs(outer_attrs
, inner_attrs
),
1107 constness
: constness
,
1109 asyncness
: asyncness
,
1112 decl
: Box
::new(FnDecl
{
1114 paren_token
: paren_token
,
1118 generics
: Generics
{
1119 where_clause
: where_clause
,
1123 block
: Box
::new(Block
{
1124 brace_token
: brace_token
,
1131 impl Parse
for FnArg
{
1132 fn parse(input
: ParseStream
) -> Result
<Self> {
1133 if input
.peek(Token
![&]) {
1134 let ahead
= input
.fork();
1135 if ahead
.call(arg_self_ref
).is_ok() && !ahead
.peek(Token
![:]) {
1136 return input
.call(arg_self_ref
).map(FnArg
::SelfRef
);
1140 if input
.peek(Token
![mut]) || input
.peek(Token
![self]) {
1141 let ahead
= input
.fork();
1142 if ahead
.call(arg_self
).is_ok() && !ahead
.peek(Token
![:]) {
1143 return input
.call(arg_self
).map(FnArg
::SelfValue
);
1147 let ahead
= input
.fork();
1148 let err
= match ahead
.call(arg_captured
) {
1149 Ok(_
) => return input
.call(arg_captured
).map(FnArg
::Captured
),
1153 let ahead
= input
.fork();
1154 if ahead
.parse
::<Type
>().is_ok() {
1155 return input
.parse().map(FnArg
::Ignored
);
1162 fn arg_self_ref(input
: ParseStream
) -> Result
<ArgSelfRef
> {
1164 and_token
: input
.parse()?
,
1165 lifetime
: input
.parse()?
,
1166 mutability
: input
.parse()?
,
1167 self_token
: input
.parse()?
,
1171 fn arg_self(input
: ParseStream
) -> Result
<ArgSelf
> {
1173 mutability
: input
.parse()?
,
1174 self_token
: input
.parse()?
,
1178 fn arg_captured(input
: ParseStream
) -> Result
<ArgCaptured
> {
1180 pat
: input
.parse()?
,
1181 colon_token
: input
.parse()?
,
1186 impl Parse
for ItemMod
{
1187 fn parse(input
: ParseStream
) -> Result
<Self> {
1188 let outer_attrs
= input
.call(Attribute
::parse_outer
)?
;
1189 let vis
: Visibility
= input
.parse()?
;
1190 let mod_token
: Token
![mod] = input
.parse()?
;
1191 let ident
: Ident
= input
.parse()?
;
1193 let lookahead
= input
.lookahead1();
1194 if lookahead
.peek(Token
![;]) {
1198 mod_token
: mod_token
,
1201 semi
: Some(input
.parse()?
),
1203 } else if lookahead
.peek(token
::Brace
) {
1205 let brace_token
= braced
!(content
in input
);
1206 let inner_attrs
= content
.call(Attribute
::parse_inner
)?
;
1208 let mut items
= Vec
::new();
1209 while !content
.is_empty() {
1210 items
.push(content
.parse()?
);
1214 attrs
: private
::attrs(outer_attrs
, inner_attrs
),
1216 mod_token
: mod_token
,
1218 content
: Some((brace_token
, items
)),
1222 Err(lookahead
.error())
1227 impl Parse
for ItemForeignMod
{
1228 fn parse(input
: ParseStream
) -> Result
<Self> {
1229 let outer_attrs
= input
.call(Attribute
::parse_outer
)?
;
1230 let abi
: Abi
= input
.parse()?
;
1233 let brace_token
= braced
!(content
in input
);
1234 let inner_attrs
= content
.call(Attribute
::parse_inner
)?
;
1235 let mut items
= Vec
::new();
1236 while !content
.is_empty() {
1237 items
.push(content
.parse()?
);
1241 attrs
: private
::attrs(outer_attrs
, inner_attrs
),
1243 brace_token
: brace_token
,
1249 impl Parse
for ForeignItem
{
1250 fn parse(input
: ParseStream
) -> Result
<Self> {
1251 let ahead
= input
.fork();
1252 ahead
.call(Attribute
::parse_outer
)?
;
1253 let vis
: Visibility
= ahead
.parse()?
;
1255 let lookahead
= ahead
.lookahead1();
1256 if lookahead
.peek(Token
![fn]) {
1257 input
.parse().map(ForeignItem
::Fn
)
1258 } else if lookahead
.peek(Token
![static]) {
1259 input
.parse().map(ForeignItem
::Static
)
1260 } else if lookahead
.peek(Token
![type]) {
1261 input
.parse().map(ForeignItem
::Type
)
1262 } else if vis
.is_inherited()
1263 && (lookahead
.peek(Ident
)
1264 || lookahead
.peek(Token
![self])
1265 || lookahead
.peek(Token
![super])
1266 || lookahead
.peek(Token
![extern])
1267 || lookahead
.peek(Token
![crate])
1268 || lookahead
.peek(Token
![::]))
1270 input
.parse().map(ForeignItem
::Macro
)
1272 Err(lookahead
.error())
1277 impl Parse
for ForeignItemFn
{
1278 fn parse(input
: ParseStream
) -> Result
<Self> {
1279 let attrs
= input
.call(Attribute
::parse_outer
)?
;
1280 let vis
: Visibility
= input
.parse()?
;
1281 let fn_token
: Token
![fn] = input
.parse()?
;
1282 let ident
: Ident
= input
.parse()?
;
1283 let generics
: Generics
= input
.parse()?
;
1286 let paren_token
= parenthesized
!(content
in input
);
1287 let mut inputs
= Punctuated
::new();
1288 while !content
.is_empty() && !content
.peek(Token
![...]) {
1289 inputs
.push_value(content
.parse()?
);
1290 if content
.is_empty() {
1293 inputs
.push_punct(content
.parse()?
);
1295 let variadic
: Option
<Token
![...]> = if inputs
.empty_or_trailing() {
1301 let output
: ReturnType
= input
.parse()?
;
1302 let where_clause
: Option
<WhereClause
> = input
.parse()?
;
1303 let semi_token
: Token
![;] = input
.parse()?
;
1309 decl
: Box
::new(FnDecl
{
1311 paren_token
: paren_token
,
1315 generics
: Generics
{
1316 where_clause
: where_clause
,
1320 semi_token
: semi_token
,
1325 impl Parse
for ForeignItemStatic
{
1326 fn parse(input
: ParseStream
) -> Result
<Self> {
1327 Ok(ForeignItemStatic
{
1328 attrs
: input
.call(Attribute
::parse_outer
)?
,
1329 vis
: input
.parse()?
,
1330 static_token
: input
.parse()?
,
1331 mutability
: input
.parse()?
,
1332 ident
: input
.parse()?
,
1333 colon_token
: input
.parse()?
,
1335 semi_token
: input
.parse()?
,
1340 impl Parse
for ForeignItemType
{
1341 fn parse(input
: ParseStream
) -> Result
<Self> {
1342 Ok(ForeignItemType
{
1343 attrs
: input
.call(Attribute
::parse_outer
)?
,
1344 vis
: input
.parse()?
,
1345 type_token
: input
.parse()?
,
1346 ident
: input
.parse()?
,
1347 semi_token
: input
.parse()?
,
1352 impl Parse
for ForeignItemMacro
{
1353 fn parse(input
: ParseStream
) -> Result
<Self> {
1354 let attrs
= input
.call(Attribute
::parse_outer
)?
;
1355 let mac
: Macro
= input
.parse()?
;
1356 let semi_token
: Option
<Token
![;]> = if mac
.delimiter
.is_brace() {
1359 Some(input
.parse()?
)
1361 Ok(ForeignItemMacro
{
1364 semi_token
: semi_token
,
1369 impl Parse
for ItemType
{
1370 fn parse(input
: ParseStream
) -> Result
<Self> {
1372 attrs
: input
.call(Attribute
::parse_outer
)?
,
1373 vis
: input
.parse()?
,
1374 type_token
: input
.parse()?
,
1375 ident
: input
.parse()?
,
1377 let mut generics
: Generics
= input
.parse()?
;
1378 generics
.where_clause
= input
.parse()?
;
1381 eq_token
: input
.parse()?
,
1383 semi_token
: input
.parse()?
,
1388 impl Parse
for ItemExistential
{
1389 fn parse(input
: ParseStream
) -> Result
<Self> {
1390 Ok(ItemExistential
{
1391 attrs
: input
.call(Attribute
::parse_outer
)?
,
1392 vis
: input
.parse()?
,
1393 existential_token
: input
.parse()?
,
1394 type_token
: input
.parse()?
,
1395 ident
: input
.parse()?
,
1397 let mut generics
: Generics
= input
.parse()?
;
1398 generics
.where_clause
= input
.parse()?
;
1401 colon_token
: Some(input
.parse()?
),
1403 let mut bounds
= Punctuated
::new();
1404 while !input
.peek(Token
![;]) {
1405 if !bounds
.is_empty() {
1406 bounds
.push_punct(input
.parse()?
);
1408 bounds
.push_value(input
.parse()?
);
1412 semi_token
: input
.parse()?
,
1417 impl Parse
for ItemStruct
{
1418 fn parse(input
: ParseStream
) -> Result
<Self> {
1419 let attrs
= input
.call(Attribute
::parse_outer
)?
;
1420 let vis
= input
.parse
::<Visibility
>()?
;
1421 let struct_token
= input
.parse
::<Token
![struct]>()?
;
1422 let ident
= input
.parse
::<Ident
>()?
;
1423 let generics
= input
.parse
::<Generics
>()?
;
1424 let (where_clause
, fields
, semi_token
) = derive
::parsing
::data_struct(input
)?
;
1428 struct_token
: struct_token
,
1430 generics
: Generics
{
1431 where_clause
: where_clause
,
1435 semi_token
: semi_token
,
1440 impl Parse
for ItemEnum
{
1441 fn parse(input
: ParseStream
) -> Result
<Self> {
1442 let attrs
= input
.call(Attribute
::parse_outer
)?
;
1443 let vis
= input
.parse
::<Visibility
>()?
;
1444 let enum_token
= input
.parse
::<Token
![enum]>()?
;
1445 let ident
= input
.parse
::<Ident
>()?
;
1446 let generics
= input
.parse
::<Generics
>()?
;
1447 let (where_clause
, brace_token
, variants
) = derive
::parsing
::data_enum(input
)?
;
1451 enum_token
: enum_token
,
1453 generics
: Generics
{
1454 where_clause
: where_clause
,
1457 brace_token
: brace_token
,
1463 impl Parse
for ItemUnion
{
1464 fn parse(input
: ParseStream
) -> Result
<Self> {
1465 let attrs
= input
.call(Attribute
::parse_outer
)?
;
1466 let vis
= input
.parse
::<Visibility
>()?
;
1467 let union_token
= input
.parse
::<Token
![union]>()?
;
1468 let ident
= input
.parse
::<Ident
>()?
;
1469 let generics
= input
.parse
::<Generics
>()?
;
1470 let (where_clause
, fields
) = derive
::parsing
::data_union(input
)?
;
1474 union_token
: union_token
,
1476 generics
: Generics
{
1477 where_clause
: where_clause
,
1485 fn parse_trait_or_trait_alias(input
: ParseStream
) -> Result
<Item
> {
1486 let (attrs
, vis
, trait_token
, ident
, generics
) = parse_start_of_trait_alias(input
)?
;
1487 let lookahead
= input
.lookahead1();
1488 if lookahead
.peek(token
::Brace
)
1489 || lookahead
.peek(Token
![:])
1490 || lookahead
.peek(Token
![where])
1492 let unsafety
= None
;
1493 let auto_token
= None
;
1494 parse_rest_of_trait(
1505 } else if lookahead
.peek(Token
![=]) {
1506 parse_rest_of_trait_alias(input
, attrs
, vis
, trait_token
, ident
, generics
)
1507 .map(Item
::TraitAlias
)
1509 Err(lookahead
.error())
1513 impl Parse
for ItemTrait
{
1514 fn parse(input
: ParseStream
) -> Result
<Self> {
1515 let attrs
= input
.call(Attribute
::parse_outer
)?
;
1516 let vis
: Visibility
= input
.parse()?
;
1517 let unsafety
: Option
<Token
![unsafe]> = input
.parse()?
;
1518 let auto_token
: Option
<Token
![auto]> = input
.parse()?
;
1519 let trait_token
: Token
![trait] = input
.parse()?
;
1520 let ident
: Ident
= input
.parse()?
;
1521 let generics
: Generics
= input
.parse()?
;
1522 parse_rest_of_trait(
1535 fn parse_rest_of_trait(
1537 attrs
: Vec
<Attribute
>,
1539 unsafety
: Option
<Token
![unsafe]>,
1540 auto_token
: Option
<Token
![auto]>,
1541 trait_token
: Token
![trait],
1543 mut generics
: Generics
,
1544 ) -> Result
<ItemTrait
> {
1545 let colon_token
: Option
<Token
![:]> = input
.parse()?
;
1547 let mut supertraits
= Punctuated
::new();
1548 if colon_token
.is_some() {
1550 supertraits
.push_value(input
.parse()?
);
1551 if input
.peek(Token
![where]) || input
.peek(token
::Brace
) {
1554 supertraits
.push_punct(input
.parse()?
);
1555 if input
.peek(Token
![where]) || input
.peek(token
::Brace
) {
1561 generics
.where_clause
= input
.parse()?
;
1564 let brace_token
= braced
!(content
in input
);
1565 let mut items
= Vec
::new();
1566 while !content
.is_empty() {
1567 items
.push(content
.parse()?
);
1574 auto_token
: auto_token
,
1575 trait_token
: trait_token
,
1578 colon_token
: colon_token
,
1579 supertraits
: supertraits
,
1580 brace_token
: brace_token
,
1585 impl Parse
for ItemTraitAlias
{
1586 fn parse(input
: ParseStream
) -> Result
<Self> {
1587 let (attrs
, vis
, trait_token
, ident
, generics
) = parse_start_of_trait_alias(input
)?
;
1588 parse_rest_of_trait_alias(input
, attrs
, vis
, trait_token
, ident
, generics
)
1592 fn parse_start_of_trait_alias(
1594 ) -> Result
<(Vec
<Attribute
>, Visibility
, Token
![trait], Ident
, Generics
)> {
1595 let attrs
= input
.call(Attribute
::parse_outer
)?
;
1596 let vis
: Visibility
= input
.parse()?
;
1597 let trait_token
: Token
![trait] = input
.parse()?
;
1598 let ident
: Ident
= input
.parse()?
;
1599 let generics
: Generics
= input
.parse()?
;
1600 Ok((attrs
, vis
, trait_token
, ident
, generics
))
1603 fn parse_rest_of_trait_alias(
1605 attrs
: Vec
<Attribute
>,
1607 trait_token
: Token
![trait],
1609 mut generics
: Generics
,
1610 ) -> Result
<ItemTraitAlias
> {
1611 let eq_token
: Token
![=] = input
.parse()?
;
1613 let mut bounds
= Punctuated
::new();
1615 if input
.peek(Token
![where]) || input
.peek(Token
![;]) {
1618 bounds
.push_value(input
.parse()?
);
1619 if input
.peek(Token
![where]) || input
.peek(Token
![;]) {
1622 bounds
.push_punct(input
.parse()?
);
1625 generics
.where_clause
= input
.parse()?
;
1626 let semi_token
: Token
![;] = input
.parse()?
;
1631 trait_token
: trait_token
,
1636 semi_token
: semi_token
,
1640 impl Parse
for TraitItem
{
1641 fn parse(input
: ParseStream
) -> Result
<Self> {
1642 let ahead
= input
.fork();
1643 ahead
.call(Attribute
::parse_outer
)?
;
1645 let lookahead
= ahead
.lookahead1();
1646 if lookahead
.peek(Token
![const]) {
1647 ahead
.parse
::<Token
![const]>()?
;
1648 let lookahead
= ahead
.lookahead1();
1649 if lookahead
.peek(Ident
) {
1650 input
.parse().map(TraitItem
::Const
)
1651 } else if lookahead
.peek(Token
![unsafe])
1652 || lookahead
.peek(Token
![extern])
1653 || lookahead
.peek(Token
![fn])
1655 input
.parse().map(TraitItem
::Method
)
1657 Err(lookahead
.error())
1659 } else if lookahead
.peek(Token
![unsafe])
1660 || lookahead
.peek(Token
![extern])
1661 || lookahead
.peek(Token
![fn])
1663 input
.parse().map(TraitItem
::Method
)
1664 } else if lookahead
.peek(Token
![type]) {
1665 input
.parse().map(TraitItem
::Type
)
1666 } else if lookahead
.peek(Ident
)
1667 || lookahead
.peek(Token
![self])
1668 || lookahead
.peek(Token
![super])
1669 || lookahead
.peek(Token
![extern])
1670 || lookahead
.peek(Token
![crate])
1671 || lookahead
.peek(Token
![::])
1673 input
.parse().map(TraitItem
::Macro
)
1675 Err(lookahead
.error())
1680 impl Parse
for TraitItemConst
{
1681 fn parse(input
: ParseStream
) -> Result
<Self> {
1683 attrs
: input
.call(Attribute
::parse_outer
)?
,
1684 const_token
: input
.parse()?
,
1685 ident
: input
.parse()?
,
1686 colon_token
: input
.parse()?
,
1689 if input
.peek(Token
![=]) {
1690 let eq_token
: Token
![=] = input
.parse()?
;
1691 let default: Expr
= input
.parse()?
;
1692 Some((eq_token
, default))
1697 semi_token
: input
.parse()?
,
1702 impl Parse
for TraitItemMethod
{
1703 fn parse(input
: ParseStream
) -> Result
<Self> {
1704 let outer_attrs
= input
.call(Attribute
::parse_outer
)?
;
1705 let constness
: Option
<Token
![const]> = input
.parse()?
;
1706 let unsafety
: Option
<Token
![unsafe]> = input
.parse()?
;
1707 let abi
: Option
<Abi
> = input
.parse()?
;
1708 let fn_token
: Token
![fn] = input
.parse()?
;
1709 let ident
: Ident
= input
.parse()?
;
1710 let generics
: Generics
= input
.parse()?
;
1713 let paren_token
= parenthesized
!(content
in input
);
1714 let inputs
= content
.parse_terminated(FnArg
::parse
)?
;
1716 let output
: ReturnType
= input
.parse()?
;
1717 let where_clause
: Option
<WhereClause
> = input
.parse()?
;
1719 let lookahead
= input
.lookahead1();
1720 let (brace_token
, inner_attrs
, stmts
, semi_token
) = if lookahead
.peek(token
::Brace
) {
1722 let brace_token
= braced
!(content
in input
);
1723 let inner_attrs
= content
.call(Attribute
::parse_inner
)?
;
1724 let stmts
= content
.call(Block
::parse_within
)?
;
1725 (Some(brace_token
), inner_attrs
, stmts
, None
)
1726 } else if lookahead
.peek(Token
![;]) {
1727 let semi_token
: Token
![;] = input
.parse()?
;
1728 (None
, Vec
::new(), Vec
::new(), Some(semi_token
))
1730 return Err(lookahead
.error());
1733 Ok(TraitItemMethod
{
1734 attrs
: private
::attrs(outer_attrs
, inner_attrs
),
1736 constness
: constness
,
1743 paren_token
: paren_token
,
1747 generics
: Generics
{
1748 where_clause
: where_clause
,
1753 default: brace_token
.map(|brace_token
| Block
{
1754 brace_token
: brace_token
,
1757 semi_token
: semi_token
,
1762 impl Parse
for TraitItemType
{
1763 fn parse(input
: ParseStream
) -> Result
<Self> {
1764 let attrs
= input
.call(Attribute
::parse_outer
)?
;
1765 let type_token
: Token
![type] = input
.parse()?
;
1766 let ident
: Ident
= input
.parse()?
;
1767 let mut generics
: Generics
= input
.parse()?
;
1768 let colon_token
: Option
<Token
![:]> = input
.parse()?
;
1770 let mut bounds
= Punctuated
::new();
1771 if colon_token
.is_some() {
1772 while !input
.peek(Token
![where]) && !input
.peek(Token
![=]) && !input
.peek(Token
![;])
1774 if !bounds
.is_empty() {
1775 bounds
.push_punct(input
.parse()?
);
1777 bounds
.push_value(input
.parse()?
);
1781 generics
.where_clause
= input
.parse()?
;
1782 let default = if input
.peek(Token
![=]) {
1783 let eq_token
: Token
![=] = input
.parse()?
;
1784 let default: Type
= input
.parse()?
;
1785 Some((eq_token
, default))
1789 let semi_token
: Token
![;] = input
.parse()?
;
1793 type_token
: type_token
,
1796 colon_token
: colon_token
,
1799 semi_token
: semi_token
,
1804 impl Parse
for TraitItemMacro
{
1805 fn parse(input
: ParseStream
) -> Result
<Self> {
1806 let attrs
= input
.call(Attribute
::parse_outer
)?
;
1807 let mac
: Macro
= input
.parse()?
;
1808 let semi_token
: Option
<Token
![;]> = if mac
.delimiter
.is_brace() {
1811 Some(input
.parse()?
)
1816 semi_token
: semi_token
,
1821 impl Parse
for ItemImpl
{
1822 fn parse(input
: ParseStream
) -> Result
<Self> {
1823 let outer_attrs
= input
.call(Attribute
::parse_outer
)?
;
1824 let defaultness
: Option
<Token
![default]> = input
.parse()?
;
1825 let unsafety
: Option
<Token
![unsafe]> = input
.parse()?
;
1826 let impl_token
: Token
![impl ] = input
.parse()?
;
1828 let has_generics
= input
.peek(Token
![<])
1829 && (input
.peek2(Token
![>])
1830 || input
.peek2(Token
![#])
1831 || (input
.peek2(Ident
) || input
.peek2(Lifetime
))
1832 && (input
.peek3(Token
![:])
1833 || input
.peek3(Token
![,])
1834 || input
.peek3(Token
![>])));
1835 let generics
: Generics
= if has_generics
{
1842 let ahead
= input
.fork();
1843 if ahead
.parse
::<Option
<Token
![!]>>().is_ok()
1844 && ahead
.parse
::<Path
>().is_ok()
1845 && ahead
.parse
::<Token
![for]>().is_ok()
1847 let polarity
: Option
<Token
![!]> = input
.parse()?
;
1848 let path
: Path
= input
.parse()?
;
1849 let for_token
: Token
![for] = input
.parse()?
;
1850 Some((polarity
, path
, for_token
))
1855 let self_ty
: Type
= input
.parse()?
;
1856 let where_clause
: Option
<WhereClause
> = input
.parse()?
;
1859 let brace_token
= braced
!(content
in input
);
1860 let inner_attrs
= content
.call(Attribute
::parse_inner
)?
;
1862 let mut items
= Vec
::new();
1863 while !content
.is_empty() {
1864 items
.push(content
.parse()?
);
1868 attrs
: private
::attrs(outer_attrs
, inner_attrs
),
1869 defaultness
: defaultness
,
1871 impl_token
: impl_token
,
1872 generics
: Generics
{
1873 where_clause
: where_clause
,
1877 self_ty
: Box
::new(self_ty
),
1878 brace_token
: brace_token
,
1884 impl Parse
for ImplItem
{
1885 fn parse(input
: ParseStream
) -> Result
<Self> {
1886 let ahead
= input
.fork();
1887 ahead
.call(Attribute
::parse_outer
)?
;
1888 let vis
: Visibility
= ahead
.parse()?
;
1890 let mut lookahead
= ahead
.lookahead1();
1891 let defaultness
= if lookahead
.peek(Token
![default]) && !ahead
.peek2(Token
![!]) {
1892 let defaultness
: Token
![default] = ahead
.parse()?
;
1893 lookahead
= ahead
.lookahead1();
1899 if lookahead
.peek(Token
![const]) {
1900 ahead
.parse
::<Token
![const]>()?
;
1901 let lookahead
= ahead
.lookahead1();
1902 if lookahead
.peek(Ident
) {
1903 input
.parse().map(ImplItem
::Const
)
1904 } else if lookahead
.peek(Token
![unsafe])
1905 || lookahead
.peek(Token
![async
])
1906 || lookahead
.peek(Token
![extern])
1907 || lookahead
.peek(Token
![fn])
1909 input
.parse().map(ImplItem
::Method
)
1911 Err(lookahead
.error())
1913 } else if lookahead
.peek(Token
![unsafe])
1914 || lookahead
.peek(Token
![async
])
1915 || lookahead
.peek(Token
![extern])
1916 || lookahead
.peek(Token
![fn])
1918 input
.parse().map(ImplItem
::Method
)
1919 } else if lookahead
.peek(Token
![type]) {
1920 input
.parse().map(ImplItem
::Type
)
1921 } else if vis
.is_inherited()
1922 && defaultness
.is_none()
1923 && lookahead
.peek(Token
![existential
])
1925 input
.parse().map(ImplItem
::Existential
)
1926 } else if vis
.is_inherited()
1927 && defaultness
.is_none()
1928 && (lookahead
.peek(Ident
)
1929 || lookahead
.peek(Token
![self])
1930 || lookahead
.peek(Token
![super])
1931 || lookahead
.peek(Token
![extern])
1932 || lookahead
.peek(Token
![crate])
1933 || lookahead
.peek(Token
![::]))
1935 input
.parse().map(ImplItem
::Macro
)
1937 Err(lookahead
.error())
1942 impl Parse
for ImplItemConst
{
1943 fn parse(input
: ParseStream
) -> Result
<Self> {
1945 attrs
: input
.call(Attribute
::parse_outer
)?
,
1946 vis
: input
.parse()?
,
1947 defaultness
: input
.parse()?
,
1948 const_token
: input
.parse()?
,
1949 ident
: input
.parse()?
,
1950 colon_token
: input
.parse()?
,
1952 eq_token
: input
.parse()?
,
1953 expr
: input
.parse()?
,
1954 semi_token
: input
.parse()?
,
1959 impl Parse
for ImplItemMethod
{
1960 fn parse(input
: ParseStream
) -> Result
<Self> {
1961 let outer_attrs
= input
.call(Attribute
::parse_outer
)?
;
1962 let vis
: Visibility
= input
.parse()?
;
1963 let defaultness
: Option
<Token
![default]> = input
.parse()?
;
1964 let constness
: Option
<Token
![const]> = input
.parse()?
;
1965 let unsafety
: Option
<Token
![unsafe]> = input
.parse()?
;
1966 let asyncness
: Option
<Token
![async
]> = input
.parse()?
;
1967 let abi
: Option
<Abi
> = input
.parse()?
;
1968 let fn_token
: Token
![fn] = input
.parse()?
;
1969 let ident
: Ident
= input
.parse()?
;
1970 let generics
: Generics
= input
.parse()?
;
1973 let paren_token
= parenthesized
!(content
in input
);
1974 let inputs
= content
.parse_terminated(FnArg
::parse
)?
;
1976 let output
: ReturnType
= input
.parse()?
;
1977 let where_clause
: Option
<WhereClause
> = input
.parse()?
;
1980 let brace_token
= braced
!(content
in input
);
1981 let inner_attrs
= content
.call(Attribute
::parse_inner
)?
;
1982 let stmts
= content
.call(Block
::parse_within
)?
;
1985 attrs
: private
::attrs(outer_attrs
, inner_attrs
),
1987 defaultness
: defaultness
,
1989 constness
: constness
,
1991 asyncness
: asyncness
,
1996 paren_token
: paren_token
,
2000 generics
: Generics
{
2001 where_clause
: where_clause
,
2007 brace_token
: brace_token
,
2014 impl Parse
for ImplItemType
{
2015 fn parse(input
: ParseStream
) -> Result
<Self> {
2017 attrs
: input
.call(Attribute
::parse_outer
)?
,
2018 vis
: input
.parse()?
,
2019 defaultness
: input
.parse()?
,
2020 type_token
: input
.parse()?
,
2021 ident
: input
.parse()?
,
2023 let mut generics
: Generics
= input
.parse()?
;
2024 generics
.where_clause
= input
.parse()?
;
2027 eq_token
: input
.parse()?
,
2029 semi_token
: input
.parse()?
,
2034 impl Parse
for ImplItemExistential
{
2035 fn parse(input
: ParseStream
) -> Result
<Self> {
2036 let ety
: ItemExistential
= input
.parse()?
;
2037 Ok(ImplItemExistential
{
2039 existential_token
: ety
.existential_token
,
2040 type_token
: ety
.type_token
,
2042 generics
: ety
.generics
,
2043 colon_token
: ety
.colon_token
,
2045 semi_token
: ety
.semi_token
,
2050 impl Parse
for ImplItemMacro
{
2051 fn parse(input
: ParseStream
) -> Result
<Self> {
2052 let attrs
= input
.call(Attribute
::parse_outer
)?
;
2053 let mac
: Macro
= input
.parse()?
;
2054 let semi_token
: Option
<Token
![;]> = if mac
.delimiter
.is_brace() {
2057 Some(input
.parse()?
)
2062 semi_token
: semi_token
,
2068 fn is_inherited(&self) -> bool
{
2070 Visibility
::Inherited
=> true,
2076 impl MacroDelimiter
{
2077 fn is_brace(&self) -> bool
{
2079 MacroDelimiter
::Brace(_
) => true,
2080 MacroDelimiter
::Paren(_
) | MacroDelimiter
::Bracket(_
) => false,
2086 #[cfg(feature = "printing")]
2090 use proc_macro2
::TokenStream
;
2091 use quote
::{ToTokens, TokenStreamExt}
;
2093 use attr
::FilterAttrs
;
2094 use print
::TokensOrDefault
;
2096 impl ToTokens
for ItemExternCrate
{
2097 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2098 tokens
.append_all(self.attrs
.outer());
2099 self.vis
.to_tokens(tokens
);
2100 self.extern_token
.to_tokens(tokens
);
2101 self.crate_token
.to_tokens(tokens
);
2102 self.ident
.to_tokens(tokens
);
2103 if let Some((ref as_token
, ref rename
)) = self.rename
{
2104 as_token
.to_tokens(tokens
);
2105 rename
.to_tokens(tokens
);
2107 self.semi_token
.to_tokens(tokens
);
2111 impl ToTokens
for ItemUse
{
2112 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2113 tokens
.append_all(self.attrs
.outer());
2114 self.vis
.to_tokens(tokens
);
2115 self.use_token
.to_tokens(tokens
);
2116 self.leading_colon
.to_tokens(tokens
);
2117 self.tree
.to_tokens(tokens
);
2118 self.semi_token
.to_tokens(tokens
);
2122 impl ToTokens
for ItemStatic
{
2123 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2124 tokens
.append_all(self.attrs
.outer());
2125 self.vis
.to_tokens(tokens
);
2126 self.static_token
.to_tokens(tokens
);
2127 self.mutability
.to_tokens(tokens
);
2128 self.ident
.to_tokens(tokens
);
2129 self.colon_token
.to_tokens(tokens
);
2130 self.ty
.to_tokens(tokens
);
2131 self.eq_token
.to_tokens(tokens
);
2132 self.expr
.to_tokens(tokens
);
2133 self.semi_token
.to_tokens(tokens
);
2137 impl ToTokens
for ItemConst
{
2138 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2139 tokens
.append_all(self.attrs
.outer());
2140 self.vis
.to_tokens(tokens
);
2141 self.const_token
.to_tokens(tokens
);
2142 self.ident
.to_tokens(tokens
);
2143 self.colon_token
.to_tokens(tokens
);
2144 self.ty
.to_tokens(tokens
);
2145 self.eq_token
.to_tokens(tokens
);
2146 self.expr
.to_tokens(tokens
);
2147 self.semi_token
.to_tokens(tokens
);
2151 impl ToTokens
for ItemFn
{
2152 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2153 tokens
.append_all(self.attrs
.outer());
2154 self.vis
.to_tokens(tokens
);
2155 self.constness
.to_tokens(tokens
);
2156 self.unsafety
.to_tokens(tokens
);
2157 self.asyncness
.to_tokens(tokens
);
2158 self.abi
.to_tokens(tokens
);
2159 NamedDecl(&self.decl
, &self.ident
).to_tokens(tokens
);
2160 self.block
.brace_token
.surround(tokens
, |tokens
| {
2161 tokens
.append_all(self.attrs
.inner());
2162 tokens
.append_all(&self.block
.stmts
);
2167 impl ToTokens
for ItemMod
{
2168 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2169 tokens
.append_all(self.attrs
.outer());
2170 self.vis
.to_tokens(tokens
);
2171 self.mod_token
.to_tokens(tokens
);
2172 self.ident
.to_tokens(tokens
);
2173 if let Some((ref brace
, ref items
)) = self.content
{
2174 brace
.surround(tokens
, |tokens
| {
2175 tokens
.append_all(self.attrs
.inner());
2176 tokens
.append_all(items
);
2179 TokensOrDefault(&self.semi
).to_tokens(tokens
);
2184 impl ToTokens
for ItemForeignMod
{
2185 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2186 tokens
.append_all(self.attrs
.outer());
2187 self.abi
.to_tokens(tokens
);
2188 self.brace_token
.surround(tokens
, |tokens
| {
2189 tokens
.append_all(self.attrs
.inner());
2190 tokens
.append_all(&self.items
);
2195 impl ToTokens
for ItemType
{
2196 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2197 tokens
.append_all(self.attrs
.outer());
2198 self.vis
.to_tokens(tokens
);
2199 self.type_token
.to_tokens(tokens
);
2200 self.ident
.to_tokens(tokens
);
2201 self.generics
.to_tokens(tokens
);
2202 self.generics
.where_clause
.to_tokens(tokens
);
2203 self.eq_token
.to_tokens(tokens
);
2204 self.ty
.to_tokens(tokens
);
2205 self.semi_token
.to_tokens(tokens
);
2209 impl ToTokens
for ItemExistential
{
2210 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2211 tokens
.append_all(self.attrs
.outer());
2212 self.vis
.to_tokens(tokens
);
2213 self.existential_token
.to_tokens(tokens
);
2214 self.type_token
.to_tokens(tokens
);
2215 self.ident
.to_tokens(tokens
);
2216 self.generics
.to_tokens(tokens
);
2217 self.generics
.where_clause
.to_tokens(tokens
);
2218 if !self.bounds
.is_empty() {
2219 TokensOrDefault(&self.colon_token
).to_tokens(tokens
);
2220 self.bounds
.to_tokens(tokens
);
2222 self.semi_token
.to_tokens(tokens
);
2226 impl ToTokens
for ItemEnum
{
2227 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2228 tokens
.append_all(self.attrs
.outer());
2229 self.vis
.to_tokens(tokens
);
2230 self.enum_token
.to_tokens(tokens
);
2231 self.ident
.to_tokens(tokens
);
2232 self.generics
.to_tokens(tokens
);
2233 self.generics
.where_clause
.to_tokens(tokens
);
2234 self.brace_token
.surround(tokens
, |tokens
| {
2235 self.variants
.to_tokens(tokens
);
2240 impl ToTokens
for ItemStruct
{
2241 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2242 tokens
.append_all(self.attrs
.outer());
2243 self.vis
.to_tokens(tokens
);
2244 self.struct_token
.to_tokens(tokens
);
2245 self.ident
.to_tokens(tokens
);
2246 self.generics
.to_tokens(tokens
);
2248 Fields
::Named(ref fields
) => {
2249 self.generics
.where_clause
.to_tokens(tokens
);
2250 fields
.to_tokens(tokens
);
2252 Fields
::Unnamed(ref fields
) => {
2253 fields
.to_tokens(tokens
);
2254 self.generics
.where_clause
.to_tokens(tokens
);
2255 TokensOrDefault(&self.semi_token
).to_tokens(tokens
);
2258 self.generics
.where_clause
.to_tokens(tokens
);
2259 TokensOrDefault(&self.semi_token
).to_tokens(tokens
);
2265 impl ToTokens
for ItemUnion
{
2266 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2267 tokens
.append_all(self.attrs
.outer());
2268 self.vis
.to_tokens(tokens
);
2269 self.union_token
.to_tokens(tokens
);
2270 self.ident
.to_tokens(tokens
);
2271 self.generics
.to_tokens(tokens
);
2272 self.generics
.where_clause
.to_tokens(tokens
);
2273 self.fields
.to_tokens(tokens
);
2277 impl ToTokens
for ItemTrait
{
2278 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2279 tokens
.append_all(self.attrs
.outer());
2280 self.vis
.to_tokens(tokens
);
2281 self.unsafety
.to_tokens(tokens
);
2282 self.auto_token
.to_tokens(tokens
);
2283 self.trait_token
.to_tokens(tokens
);
2284 self.ident
.to_tokens(tokens
);
2285 self.generics
.to_tokens(tokens
);
2286 if !self.supertraits
.is_empty() {
2287 TokensOrDefault(&self.colon_token
).to_tokens(tokens
);
2288 self.supertraits
.to_tokens(tokens
);
2290 self.generics
.where_clause
.to_tokens(tokens
);
2291 self.brace_token
.surround(tokens
, |tokens
| {
2292 tokens
.append_all(&self.items
);
2297 impl ToTokens
for ItemTraitAlias
{
2298 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2299 tokens
.append_all(self.attrs
.outer());
2300 self.vis
.to_tokens(tokens
);
2301 self.trait_token
.to_tokens(tokens
);
2302 self.ident
.to_tokens(tokens
);
2303 self.generics
.to_tokens(tokens
);
2304 self.eq_token
.to_tokens(tokens
);
2305 self.bounds
.to_tokens(tokens
);
2306 self.generics
.where_clause
.to_tokens(tokens
);
2307 self.semi_token
.to_tokens(tokens
);
2311 impl ToTokens
for ItemImpl
{
2312 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2313 tokens
.append_all(self.attrs
.outer());
2314 self.defaultness
.to_tokens(tokens
);
2315 self.unsafety
.to_tokens(tokens
);
2316 self.impl_token
.to_tokens(tokens
);
2317 self.generics
.to_tokens(tokens
);
2318 if let Some((ref polarity
, ref path
, ref for_token
)) = self.trait_
{
2319 polarity
.to_tokens(tokens
);
2320 path
.to_tokens(tokens
);
2321 for_token
.to_tokens(tokens
);
2323 self.self_ty
.to_tokens(tokens
);
2324 self.generics
.where_clause
.to_tokens(tokens
);
2325 self.brace_token
.surround(tokens
, |tokens
| {
2326 tokens
.append_all(self.attrs
.inner());
2327 tokens
.append_all(&self.items
);
2332 impl ToTokens
for ItemMacro
{
2333 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2334 tokens
.append_all(self.attrs
.outer());
2335 self.mac
.path
.to_tokens(tokens
);
2336 self.mac
.bang_token
.to_tokens(tokens
);
2337 self.ident
.to_tokens(tokens
);
2338 match self.mac
.delimiter
{
2339 MacroDelimiter
::Paren(ref paren
) => {
2340 paren
.surround(tokens
, |tokens
| self.mac
.tts
.to_tokens(tokens
));
2342 MacroDelimiter
::Brace(ref brace
) => {
2343 brace
.surround(tokens
, |tokens
| self.mac
.tts
.to_tokens(tokens
));
2345 MacroDelimiter
::Bracket(ref bracket
) => {
2346 bracket
.surround(tokens
, |tokens
| self.mac
.tts
.to_tokens(tokens
));
2349 self.semi_token
.to_tokens(tokens
);
2353 impl ToTokens
for ItemMacro2
{
2354 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2355 tokens
.append_all(self.attrs
.outer());
2356 self.vis
.to_tokens(tokens
);
2357 self.macro_token
.to_tokens(tokens
);
2358 self.ident
.to_tokens(tokens
);
2360 // Hack: see comment in impl Parse for ItemMacro2.
2361 if self.args
.to_string() != "$ $" {
2362 self.paren_token
.surround(tokens
, |tokens
| {
2363 self.args
.to_tokens(tokens
);
2367 self.brace_token
.surround(tokens
, |tokens
| {
2368 self.body
.to_tokens(tokens
);
2373 impl ToTokens
for ItemVerbatim
{
2374 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2375 self.tts
.to_tokens(tokens
);
2379 impl ToTokens
for UsePath
{
2380 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2381 self.ident
.to_tokens(tokens
);
2382 self.colon2_token
.to_tokens(tokens
);
2383 self.tree
.to_tokens(tokens
);
2387 impl ToTokens
for UseName
{
2388 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2389 self.ident
.to_tokens(tokens
);
2393 impl ToTokens
for UseRename
{
2394 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2395 self.ident
.to_tokens(tokens
);
2396 self.as_token
.to_tokens(tokens
);
2397 self.rename
.to_tokens(tokens
);
2401 impl ToTokens
for UseGlob
{
2402 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2403 self.star_token
.to_tokens(tokens
);
2407 impl ToTokens
for UseGroup
{
2408 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2409 self.brace_token
.surround(tokens
, |tokens
| {
2410 self.items
.to_tokens(tokens
);
2415 impl ToTokens
for TraitItemConst
{
2416 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2417 tokens
.append_all(self.attrs
.outer());
2418 self.const_token
.to_tokens(tokens
);
2419 self.ident
.to_tokens(tokens
);
2420 self.colon_token
.to_tokens(tokens
);
2421 self.ty
.to_tokens(tokens
);
2422 if let Some((ref eq_token
, ref default)) = self.default {
2423 eq_token
.to_tokens(tokens
);
2424 default.to_tokens(tokens
);
2426 self.semi_token
.to_tokens(tokens
);
2430 impl ToTokens
for TraitItemMethod
{
2431 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2432 tokens
.append_all(self.attrs
.outer());
2433 self.sig
.to_tokens(tokens
);
2434 match self.default {
2435 Some(ref block
) => {
2436 block
.brace_token
.surround(tokens
, |tokens
| {
2437 tokens
.append_all(self.attrs
.inner());
2438 tokens
.append_all(&block
.stmts
);
2442 TokensOrDefault(&self.semi_token
).to_tokens(tokens
);
2448 impl ToTokens
for TraitItemType
{
2449 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2450 tokens
.append_all(self.attrs
.outer());
2451 self.type_token
.to_tokens(tokens
);
2452 self.ident
.to_tokens(tokens
);
2453 self.generics
.to_tokens(tokens
);
2454 if !self.bounds
.is_empty() {
2455 TokensOrDefault(&self.colon_token
).to_tokens(tokens
);
2456 self.bounds
.to_tokens(tokens
);
2458 self.generics
.where_clause
.to_tokens(tokens
);
2459 if let Some((ref eq_token
, ref default)) = self.default {
2460 eq_token
.to_tokens(tokens
);
2461 default.to_tokens(tokens
);
2463 self.semi_token
.to_tokens(tokens
);
2467 impl ToTokens
for TraitItemMacro
{
2468 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2469 tokens
.append_all(self.attrs
.outer());
2470 self.mac
.to_tokens(tokens
);
2471 self.semi_token
.to_tokens(tokens
);
2475 impl ToTokens
for TraitItemVerbatim
{
2476 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2477 self.tts
.to_tokens(tokens
);
2481 impl ToTokens
for ImplItemConst
{
2482 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2483 tokens
.append_all(self.attrs
.outer());
2484 self.vis
.to_tokens(tokens
);
2485 self.defaultness
.to_tokens(tokens
);
2486 self.const_token
.to_tokens(tokens
);
2487 self.ident
.to_tokens(tokens
);
2488 self.colon_token
.to_tokens(tokens
);
2489 self.ty
.to_tokens(tokens
);
2490 self.eq_token
.to_tokens(tokens
);
2491 self.expr
.to_tokens(tokens
);
2492 self.semi_token
.to_tokens(tokens
);
2496 impl ToTokens
for ImplItemMethod
{
2497 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2498 tokens
.append_all(self.attrs
.outer());
2499 self.vis
.to_tokens(tokens
);
2500 self.defaultness
.to_tokens(tokens
);
2501 self.sig
.to_tokens(tokens
);
2502 self.block
.brace_token
.surround(tokens
, |tokens
| {
2503 tokens
.append_all(self.attrs
.inner());
2504 tokens
.append_all(&self.block
.stmts
);
2509 impl ToTokens
for ImplItemType
{
2510 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2511 tokens
.append_all(self.attrs
.outer());
2512 self.vis
.to_tokens(tokens
);
2513 self.defaultness
.to_tokens(tokens
);
2514 self.type_token
.to_tokens(tokens
);
2515 self.ident
.to_tokens(tokens
);
2516 self.generics
.to_tokens(tokens
);
2517 self.generics
.where_clause
.to_tokens(tokens
);
2518 self.eq_token
.to_tokens(tokens
);
2519 self.ty
.to_tokens(tokens
);
2520 self.semi_token
.to_tokens(tokens
);
2524 impl ToTokens
for ImplItemExistential
{
2525 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2526 tokens
.append_all(self.attrs
.outer());
2527 self.existential_token
.to_tokens(tokens
);
2528 self.type_token
.to_tokens(tokens
);
2529 self.ident
.to_tokens(tokens
);
2530 self.generics
.to_tokens(tokens
);
2531 self.generics
.where_clause
.to_tokens(tokens
);
2532 if !self.bounds
.is_empty() {
2533 TokensOrDefault(&self.colon_token
).to_tokens(tokens
);
2534 self.bounds
.to_tokens(tokens
);
2536 self.semi_token
.to_tokens(tokens
);
2540 impl ToTokens
for ImplItemMacro
{
2541 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2542 tokens
.append_all(self.attrs
.outer());
2543 self.mac
.to_tokens(tokens
);
2544 self.semi_token
.to_tokens(tokens
);
2548 impl ToTokens
for ImplItemVerbatim
{
2549 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2550 self.tts
.to_tokens(tokens
);
2554 impl ToTokens
for ForeignItemFn
{
2555 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2556 tokens
.append_all(self.attrs
.outer());
2557 self.vis
.to_tokens(tokens
);
2558 NamedDecl(&self.decl
, &self.ident
).to_tokens(tokens
);
2559 self.semi_token
.to_tokens(tokens
);
2563 impl ToTokens
for ForeignItemStatic
{
2564 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2565 tokens
.append_all(self.attrs
.outer());
2566 self.vis
.to_tokens(tokens
);
2567 self.static_token
.to_tokens(tokens
);
2568 self.mutability
.to_tokens(tokens
);
2569 self.ident
.to_tokens(tokens
);
2570 self.colon_token
.to_tokens(tokens
);
2571 self.ty
.to_tokens(tokens
);
2572 self.semi_token
.to_tokens(tokens
);
2576 impl ToTokens
for ForeignItemType
{
2577 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2578 tokens
.append_all(self.attrs
.outer());
2579 self.vis
.to_tokens(tokens
);
2580 self.type_token
.to_tokens(tokens
);
2581 self.ident
.to_tokens(tokens
);
2582 self.semi_token
.to_tokens(tokens
);
2586 impl ToTokens
for ForeignItemMacro
{
2587 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2588 tokens
.append_all(self.attrs
.outer());
2589 self.mac
.to_tokens(tokens
);
2590 self.semi_token
.to_tokens(tokens
);
2594 impl ToTokens
for ForeignItemVerbatim
{
2595 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2596 self.tts
.to_tokens(tokens
);
2600 impl ToTokens
for MethodSig
{
2601 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2602 self.constness
.to_tokens(tokens
);
2603 self.unsafety
.to_tokens(tokens
);
2604 self.asyncness
.to_tokens(tokens
);
2605 self.abi
.to_tokens(tokens
);
2606 NamedDecl(&self.decl
, &self.ident
).to_tokens(tokens
);
2610 struct NamedDecl
<'a
>(&'a FnDecl
, &'a Ident
);
2612 impl<'a
> ToTokens
for NamedDecl
<'a
> {
2613 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2614 self.0.fn_token
.to_tokens(tokens
);
2615 self.1.to_tokens(tokens
);
2616 self.0.generics
.to_tokens(tokens
);
2617 self.0.paren_token
.surround(tokens
, |tokens
| {
2618 self.0.inputs
.to_tokens(tokens
);
2619 if self.0.variadic
.is_some() && !self.0.inputs
.empty_or_trailing() {
2620 <Token
![,]>::default().to_tokens(tokens
);
2622 self.0.variadic
.to_tokens(tokens
);
2624 self.0.output
.to_tokens(tokens
);
2625 self.0.generics
.where_clause
.to_tokens(tokens
);
2629 impl ToTokens
for ArgSelfRef
{
2630 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2631 self.and_token
.to_tokens(tokens
);
2632 self.lifetime
.to_tokens(tokens
);
2633 self.mutability
.to_tokens(tokens
);
2634 self.self_token
.to_tokens(tokens
);
2638 impl ToTokens
for ArgSelf
{
2639 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2640 self.mutability
.to_tokens(tokens
);
2641 self.self_token
.to_tokens(tokens
);
2645 impl ToTokens
for ArgCaptured
{
2646 fn to_tokens(&self, tokens
: &mut TokenStream
) {
2647 self.pat
.to_tokens(tokens
);
2648 self.colon_token
.to_tokens(tokens
);
2649 self.ty
.to_tokens(tokens
);