1 use super::*; 2 use crate::derive::{Data, DataEnum, DataStruct, DataUnion, DeriveInput}; 3 use crate::punctuated::Punctuated; 4 use proc_macro2::TokenStream; 5 6 #[cfg(feature = "parsing")] 7 use std::mem; 8 9 ast_enum_of_structs! { 10 /// Things that can appear directly inside of a module or scope. 11 /// 12 /// *This type is available only if Syn is built with the `"full"` feature.* 13 /// 14 /// # Syntax tree enum 15 /// 16 /// This type is a [syntax tree enum]. 17 /// 18 /// [syntax tree enum]: Expr#syntax-tree-enums 19 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 20 pub enum Item { 21 /// A constant item: `const MAX: u16 = 65535`. 22 Const(ItemConst), 23 24 /// An enum definition: `enum Foo<A, B> { A(A), B(B) }`. 25 Enum(ItemEnum), 26 27 /// An `extern crate` item: `extern crate serde`. 28 ExternCrate(ItemExternCrate), 29 30 /// A free-standing function: `fn process(n: usize) -> Result<()> { ... 31 /// }`. 32 Fn(ItemFn), 33 34 /// A block of foreign items: `extern "C" { ... }`. 35 ForeignMod(ItemForeignMod), 36 37 /// An impl block providing trait or associated items: `impl<A> Trait 38 /// for Data<A> { ... }`. 39 Impl(ItemImpl), 40 41 /// A macro invocation, which includes `macro_rules!` definitions. 42 Macro(ItemMacro), 43 44 /// A 2.0-style declarative macro introduced by the `macro` keyword. 45 Macro2(ItemMacro2), 46 47 /// A module or module declaration: `mod m` or `mod m { ... }`. 48 Mod(ItemMod), 49 50 /// A static item: `static BIKE: Shed = Shed(42)`. 51 Static(ItemStatic), 52 53 /// A struct definition: `struct Foo<A> { x: A }`. 54 Struct(ItemStruct), 55 56 /// A trait definition: `pub trait Iterator { ... }`. 57 Trait(ItemTrait), 58 59 /// A trait alias: `pub trait SharableIterator = Iterator + Sync`. 60 TraitAlias(ItemTraitAlias), 61 62 /// A type alias: `type Result<T> = std::result::Result<T, MyError>`. 63 Type(ItemType), 64 65 /// A union definition: `union Foo<A, B> { x: A, y: B }`. 66 Union(ItemUnion), 67 68 /// A use declaration: `use std::collections::HashMap`. 69 Use(ItemUse), 70 71 /// Tokens forming an item not interpreted by Syn. 72 Verbatim(TokenStream), 73 74 // The following is the only supported idiom for exhaustive matching of 75 // this enum. 76 // 77 // match expr { 78 // Item::Const(e) => {...} 79 // Item::Enum(e) => {...} 80 // ... 81 // Item::Verbatim(e) => {...} 82 // 83 // #[cfg(test)] 84 // Item::__TestExhaustive(_) => unimplemented!(), 85 // #[cfg(not(test))] 86 // _ => { /* some sane fallback */ } 87 // } 88 // 89 // This way we fail your tests but don't break your library when adding 90 // a variant. You will be notified by a test failure when a variant is 91 // added, so that you can add code to handle it, but your library will 92 // continue to compile and work for downstream users in the interim. 93 // 94 // Once `deny(reachable)` is available in rustc, Item will be 95 // reimplemented as a non_exhaustive enum. 96 // https://github.com/rust-lang/rust/issues/44109#issuecomment-521781237 97 #[doc(hidden)] 98 __TestExhaustive(crate::private), 99 } 100 } 101 102 ast_struct! { 103 /// A constant item: `const MAX: u16 = 65535`. 104 /// 105 /// *This type is available only if Syn is built with the `"full"` feature.* 106 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 107 pub struct ItemConst { 108 pub attrs: Vec<Attribute>, 109 pub vis: Visibility, 110 pub const_token: Token![const], 111 pub ident: Ident, 112 pub colon_token: Token![:], 113 pub ty: Box<Type>, 114 pub eq_token: Token![=], 115 pub expr: Box<Expr>, 116 pub semi_token: Token![;], 117 } 118 } 119 120 ast_struct! { 121 /// An enum definition: `enum Foo<A, B> { A(A), B(B) }`. 122 /// 123 /// *This type is available only if Syn is built with the `"full"` feature.* 124 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 125 pub struct ItemEnum { 126 pub attrs: Vec<Attribute>, 127 pub vis: Visibility, 128 pub enum_token: Token![enum], 129 pub ident: Ident, 130 pub generics: Generics, 131 pub brace_token: token::Brace, 132 pub variants: Punctuated<Variant, Token![,]>, 133 } 134 } 135 136 ast_struct! { 137 /// An `extern crate` item: `extern crate serde`. 138 /// 139 /// *This type is available only if Syn is built with the `"full"` feature.* 140 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 141 pub struct ItemExternCrate { 142 pub attrs: Vec<Attribute>, 143 pub vis: Visibility, 144 pub extern_token: Token![extern], 145 pub crate_token: Token![crate], 146 pub ident: Ident, 147 pub rename: Option<(Token![as], Ident)>, 148 pub semi_token: Token![;], 149 } 150 } 151 152 ast_struct! { 153 /// A free-standing function: `fn process(n: usize) -> Result<()> { ... 154 /// }`. 155 /// 156 /// *This type is available only if Syn is built with the `"full"` feature.* 157 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 158 pub struct ItemFn { 159 pub attrs: Vec<Attribute>, 160 pub vis: Visibility, 161 pub sig: Signature, 162 pub block: Box<Block>, 163 } 164 } 165 166 ast_struct! { 167 /// A block of foreign items: `extern "C" { ... }`. 168 /// 169 /// *This type is available only if Syn is built with the `"full"` feature.* 170 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 171 pub struct ItemForeignMod { 172 pub attrs: Vec<Attribute>, 173 pub abi: Abi, 174 pub brace_token: token::Brace, 175 pub items: Vec<ForeignItem>, 176 } 177 } 178 179 ast_struct! { 180 /// An impl block providing trait or associated items: `impl<A> Trait 181 /// for Data<A> { ... }`. 182 /// 183 /// *This type is available only if Syn is built with the `"full"` feature.* 184 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 185 pub struct ItemImpl { 186 pub attrs: Vec<Attribute>, 187 pub defaultness: Option<Token![default]>, 188 pub unsafety: Option<Token![unsafe]>, 189 pub impl_token: Token![impl], 190 pub generics: Generics, 191 /// Trait this impl implements. 192 pub trait_: Option<(Option<Token![!]>, Path, Token![for])>, 193 /// The Self type of the impl. 194 pub self_ty: Box<Type>, 195 pub brace_token: token::Brace, 196 pub items: Vec<ImplItem>, 197 } 198 } 199 200 ast_struct! { 201 /// A macro invocation, which includes `macro_rules!` definitions. 202 /// 203 /// *This type is available only if Syn is built with the `"full"` feature.* 204 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 205 pub struct ItemMacro { 206 pub attrs: Vec<Attribute>, 207 /// The `example` in `macro_rules! example { ... }`. 208 pub ident: Option<Ident>, 209 pub mac: Macro, 210 pub semi_token: Option<Token![;]>, 211 } 212 } 213 214 ast_struct! { 215 /// A 2.0-style declarative macro introduced by the `macro` keyword. 216 /// 217 /// *This type is available only if Syn is built with the `"full"` feature.* 218 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 219 pub struct ItemMacro2 { 220 pub attrs: Vec<Attribute>, 221 pub vis: Visibility, 222 pub macro_token: Token![macro], 223 pub ident: Ident, 224 pub rules: TokenStream, 225 } 226 } 227 228 ast_struct! { 229 /// A module or module declaration: `mod m` or `mod m { ... }`. 230 /// 231 /// *This type is available only if Syn is built with the `"full"` feature.* 232 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 233 pub struct ItemMod { 234 pub attrs: Vec<Attribute>, 235 pub vis: Visibility, 236 pub mod_token: Token![mod], 237 pub ident: Ident, 238 pub content: Option<(token::Brace, Vec<Item>)>, 239 pub semi: Option<Token![;]>, 240 } 241 } 242 243 ast_struct! { 244 /// A static item: `static BIKE: Shed = Shed(42)`. 245 /// 246 /// *This type is available only if Syn is built with the `"full"` feature.* 247 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 248 pub struct ItemStatic { 249 pub attrs: Vec<Attribute>, 250 pub vis: Visibility, 251 pub static_token: Token![static], 252 pub mutability: Option<Token![mut]>, 253 pub ident: Ident, 254 pub colon_token: Token![:], 255 pub ty: Box<Type>, 256 pub eq_token: Token![=], 257 pub expr: Box<Expr>, 258 pub semi_token: Token![;], 259 } 260 } 261 262 ast_struct! { 263 /// A struct definition: `struct Foo<A> { x: A }`. 264 /// 265 /// *This type is available only if Syn is built with the `"full"` feature.* 266 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 267 pub struct ItemStruct { 268 pub attrs: Vec<Attribute>, 269 pub vis: Visibility, 270 pub struct_token: Token![struct], 271 pub ident: Ident, 272 pub generics: Generics, 273 pub fields: Fields, 274 pub semi_token: Option<Token![;]>, 275 } 276 } 277 278 ast_struct! { 279 /// A trait definition: `pub trait Iterator { ... }`. 280 /// 281 /// *This type is available only if Syn is built with the `"full"` feature.* 282 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 283 pub struct ItemTrait { 284 pub attrs: Vec<Attribute>, 285 pub vis: Visibility, 286 pub unsafety: Option<Token![unsafe]>, 287 pub auto_token: Option<Token![auto]>, 288 pub trait_token: Token![trait], 289 pub ident: Ident, 290 pub generics: Generics, 291 pub colon_token: Option<Token![:]>, 292 pub supertraits: Punctuated<TypeParamBound, Token![+]>, 293 pub brace_token: token::Brace, 294 pub items: Vec<TraitItem>, 295 } 296 } 297 298 ast_struct! { 299 /// A trait alias: `pub trait SharableIterator = Iterator + Sync`. 300 /// 301 /// *This type is available only if Syn is built with the `"full"` feature.* 302 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 303 pub struct ItemTraitAlias { 304 pub attrs: Vec<Attribute>, 305 pub vis: Visibility, 306 pub trait_token: Token![trait], 307 pub ident: Ident, 308 pub generics: Generics, 309 pub eq_token: Token![=], 310 pub bounds: Punctuated<TypeParamBound, Token![+]>, 311 pub semi_token: Token![;], 312 } 313 } 314 315 ast_struct! { 316 /// A type alias: `type Result<T> = std::result::Result<T, MyError>`. 317 /// 318 /// *This type is available only if Syn is built with the `"full"` feature.* 319 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 320 pub struct ItemType { 321 pub attrs: Vec<Attribute>, 322 pub vis: Visibility, 323 pub type_token: Token![type], 324 pub ident: Ident, 325 pub generics: Generics, 326 pub eq_token: Token![=], 327 pub ty: Box<Type>, 328 pub semi_token: Token![;], 329 } 330 } 331 332 ast_struct! { 333 /// A union definition: `union Foo<A, B> { x: A, y: B }`. 334 /// 335 /// *This type is available only if Syn is built with the `"full"` feature.* 336 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 337 pub struct ItemUnion { 338 pub attrs: Vec<Attribute>, 339 pub vis: Visibility, 340 pub union_token: Token![union], 341 pub ident: Ident, 342 pub generics: Generics, 343 pub fields: FieldsNamed, 344 } 345 } 346 347 ast_struct! { 348 /// A use declaration: `use std::collections::HashMap`. 349 /// 350 /// *This type is available only if Syn is built with the `"full"` feature.* 351 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 352 pub struct ItemUse { 353 pub attrs: Vec<Attribute>, 354 pub vis: Visibility, 355 pub use_token: Token![use], 356 pub leading_colon: Option<Token![::]>, 357 pub tree: UseTree, 358 pub semi_token: Token![;], 359 } 360 } 361 362 impl Item { 363 #[cfg(feature = "parsing")] replace_attrs(&mut self, new: Vec<Attribute>) -> Vec<Attribute>364 pub(crate) fn replace_attrs(&mut self, new: Vec<Attribute>) -> Vec<Attribute> { 365 match self { 366 Item::ExternCrate(ItemExternCrate { attrs, .. }) 367 | Item::Use(ItemUse { attrs, .. }) 368 | Item::Static(ItemStatic { attrs, .. }) 369 | Item::Const(ItemConst { attrs, .. }) 370 | Item::Fn(ItemFn { attrs, .. }) 371 | Item::Mod(ItemMod { attrs, .. }) 372 | Item::ForeignMod(ItemForeignMod { attrs, .. }) 373 | Item::Type(ItemType { attrs, .. }) 374 | Item::Struct(ItemStruct { attrs, .. }) 375 | Item::Enum(ItemEnum { attrs, .. }) 376 | Item::Union(ItemUnion { attrs, .. }) 377 | Item::Trait(ItemTrait { attrs, .. }) 378 | Item::TraitAlias(ItemTraitAlias { attrs, .. }) 379 | Item::Impl(ItemImpl { attrs, .. }) 380 | Item::Macro(ItemMacro { attrs, .. }) 381 | Item::Macro2(ItemMacro2 { attrs, .. }) => mem::replace(attrs, new), 382 Item::Verbatim(_) => Vec::new(), 383 Item::__TestExhaustive(_) => unreachable!(), 384 } 385 } 386 } 387 388 impl From<DeriveInput> for Item { from(input: DeriveInput) -> Item389 fn from(input: DeriveInput) -> Item { 390 match input.data { 391 Data::Struct(data) => Item::Struct(ItemStruct { 392 attrs: input.attrs, 393 vis: input.vis, 394 struct_token: data.struct_token, 395 ident: input.ident, 396 generics: input.generics, 397 fields: data.fields, 398 semi_token: data.semi_token, 399 }), 400 Data::Enum(data) => Item::Enum(ItemEnum { 401 attrs: input.attrs, 402 vis: input.vis, 403 enum_token: data.enum_token, 404 ident: input.ident, 405 generics: input.generics, 406 brace_token: data.brace_token, 407 variants: data.variants, 408 }), 409 Data::Union(data) => Item::Union(ItemUnion { 410 attrs: input.attrs, 411 vis: input.vis, 412 union_token: data.union_token, 413 ident: input.ident, 414 generics: input.generics, 415 fields: data.fields, 416 }), 417 } 418 } 419 } 420 421 impl From<ItemStruct> for DeriveInput { from(input: ItemStruct) -> DeriveInput422 fn from(input: ItemStruct) -> DeriveInput { 423 DeriveInput { 424 attrs: input.attrs, 425 vis: input.vis, 426 ident: input.ident, 427 generics: input.generics, 428 data: Data::Struct(DataStruct { 429 struct_token: input.struct_token, 430 fields: input.fields, 431 semi_token: input.semi_token, 432 }), 433 } 434 } 435 } 436 437 impl From<ItemEnum> for DeriveInput { from(input: ItemEnum) -> DeriveInput438 fn from(input: ItemEnum) -> DeriveInput { 439 DeriveInput { 440 attrs: input.attrs, 441 vis: input.vis, 442 ident: input.ident, 443 generics: input.generics, 444 data: Data::Enum(DataEnum { 445 enum_token: input.enum_token, 446 brace_token: input.brace_token, 447 variants: input.variants, 448 }), 449 } 450 } 451 } 452 453 impl From<ItemUnion> for DeriveInput { from(input: ItemUnion) -> DeriveInput454 fn from(input: ItemUnion) -> DeriveInput { 455 DeriveInput { 456 attrs: input.attrs, 457 vis: input.vis, 458 ident: input.ident, 459 generics: input.generics, 460 data: Data::Union(DataUnion { 461 union_token: input.union_token, 462 fields: input.fields, 463 }), 464 } 465 } 466 } 467 468 ast_enum_of_structs! { 469 /// A suffix of an import tree in a `use` item: `Type as Renamed` or `*`. 470 /// 471 /// *This type is available only if Syn is built with the `"full"` feature.* 472 /// 473 /// # Syntax tree enum 474 /// 475 /// This type is a [syntax tree enum]. 476 /// 477 /// [syntax tree enum]: Expr#syntax-tree-enums 478 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 479 pub enum UseTree { 480 /// A path prefix of imports in a `use` item: `std::...`. 481 Path(UsePath), 482 483 /// An identifier imported by a `use` item: `HashMap`. 484 Name(UseName), 485 486 /// An renamed identifier imported by a `use` item: `HashMap as Map`. 487 Rename(UseRename), 488 489 /// A glob import in a `use` item: `*`. 490 Glob(UseGlob), 491 492 /// A braced group of imports in a `use` item: `{A, B, C}`. 493 Group(UseGroup), 494 } 495 } 496 497 ast_struct! { 498 /// A path prefix of imports in a `use` item: `std::...`. 499 /// 500 /// *This type is available only if Syn is built with the `"full"` feature.* 501 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 502 pub struct UsePath { 503 pub ident: Ident, 504 pub colon2_token: Token![::], 505 pub tree: Box<UseTree>, 506 } 507 } 508 509 ast_struct! { 510 /// An identifier imported by a `use` item: `HashMap`. 511 /// 512 /// *This type is available only if Syn is built with the `"full"` feature.* 513 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 514 pub struct UseName { 515 pub ident: Ident, 516 } 517 } 518 519 ast_struct! { 520 /// An renamed identifier imported by a `use` item: `HashMap as Map`. 521 /// 522 /// *This type is available only if Syn is built with the `"full"` feature.* 523 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 524 pub struct UseRename { 525 pub ident: Ident, 526 pub as_token: Token![as], 527 pub rename: Ident, 528 } 529 } 530 531 ast_struct! { 532 /// A glob import in a `use` item: `*`. 533 /// 534 /// *This type is available only if Syn is built with the `"full"` feature.* 535 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 536 pub struct UseGlob { 537 pub star_token: Token![*], 538 } 539 } 540 541 ast_struct! { 542 /// A braced group of imports in a `use` item: `{A, B, C}`. 543 /// 544 /// *This type is available only if Syn is built with the `"full"` feature.* 545 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 546 pub struct UseGroup { 547 pub brace_token: token::Brace, 548 pub items: Punctuated<UseTree, Token![,]>, 549 } 550 } 551 552 ast_enum_of_structs! { 553 /// An item within an `extern` block. 554 /// 555 /// *This type is available only if Syn is built with the `"full"` feature.* 556 /// 557 /// # Syntax tree enum 558 /// 559 /// This type is a [syntax tree enum]. 560 /// 561 /// [syntax tree enum]: Expr#syntax-tree-enums 562 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 563 pub enum ForeignItem { 564 /// A foreign function in an `extern` block. 565 Fn(ForeignItemFn), 566 567 /// A foreign static item in an `extern` block: `static ext: u8`. 568 Static(ForeignItemStatic), 569 570 /// A foreign type in an `extern` block: `type void`. 571 Type(ForeignItemType), 572 573 /// A macro invocation within an extern block. 574 Macro(ForeignItemMacro), 575 576 /// Tokens in an `extern` block not interpreted by Syn. 577 Verbatim(TokenStream), 578 579 // The following is the only supported idiom for exhaustive matching of 580 // this enum. 581 // 582 // match expr { 583 // ForeignItem::Fn(e) => {...} 584 // ForeignItem::Static(e) => {...} 585 // ... 586 // ForeignItem::Verbatim(e) => {...} 587 // 588 // #[cfg(test)] 589 // ForeignItem::__TestExhaustive(_) => unimplemented!(), 590 // #[cfg(not(test))] 591 // _ => { /* some sane fallback */ } 592 // } 593 // 594 // This way we fail your tests but don't break your library when adding 595 // a variant. You will be notified by a test failure when a variant is 596 // added, so that you can add code to handle it, but your library will 597 // continue to compile and work for downstream users in the interim. 598 // 599 // Once `deny(reachable)` is available in rustc, ForeignItem will be 600 // reimplemented as a non_exhaustive enum. 601 // https://github.com/rust-lang/rust/issues/44109#issuecomment-521781237 602 #[doc(hidden)] 603 __TestExhaustive(crate::private), 604 } 605 } 606 607 ast_struct! { 608 /// A foreign function in an `extern` block. 609 /// 610 /// *This type is available only if Syn is built with the `"full"` feature.* 611 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 612 pub struct ForeignItemFn { 613 pub attrs: Vec<Attribute>, 614 pub vis: Visibility, 615 pub sig: Signature, 616 pub semi_token: Token![;], 617 } 618 } 619 620 ast_struct! { 621 /// A foreign static item in an `extern` block: `static ext: u8`. 622 /// 623 /// *This type is available only if Syn is built with the `"full"` feature.* 624 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 625 pub struct ForeignItemStatic { 626 pub attrs: Vec<Attribute>, 627 pub vis: Visibility, 628 pub static_token: Token![static], 629 pub mutability: Option<Token![mut]>, 630 pub ident: Ident, 631 pub colon_token: Token![:], 632 pub ty: Box<Type>, 633 pub semi_token: Token![;], 634 } 635 } 636 637 ast_struct! { 638 /// A foreign type in an `extern` block: `type void`. 639 /// 640 /// *This type is available only if Syn is built with the `"full"` feature.* 641 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 642 pub struct ForeignItemType { 643 pub attrs: Vec<Attribute>, 644 pub vis: Visibility, 645 pub type_token: Token![type], 646 pub ident: Ident, 647 pub semi_token: Token![;], 648 } 649 } 650 651 ast_struct! { 652 /// A macro invocation within an extern block. 653 /// 654 /// *This type is available only if Syn is built with the `"full"` feature.* 655 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 656 pub struct ForeignItemMacro { 657 pub attrs: Vec<Attribute>, 658 pub mac: Macro, 659 pub semi_token: Option<Token![;]>, 660 } 661 } 662 663 ast_enum_of_structs! { 664 /// An item declaration within the definition of a trait. 665 /// 666 /// *This type is available only if Syn is built with the `"full"` feature.* 667 /// 668 /// # Syntax tree enum 669 /// 670 /// This type is a [syntax tree enum]. 671 /// 672 /// [syntax tree enum]: Expr#syntax-tree-enums 673 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 674 pub enum TraitItem { 675 /// An associated constant within the definition of a trait. 676 Const(TraitItemConst), 677 678 /// A trait method within the definition of a trait. 679 Method(TraitItemMethod), 680 681 /// An associated type within the definition of a trait. 682 Type(TraitItemType), 683 684 /// A macro invocation within the definition of a trait. 685 Macro(TraitItemMacro), 686 687 /// Tokens within the definition of a trait not interpreted by Syn. 688 Verbatim(TokenStream), 689 690 // The following is the only supported idiom for exhaustive matching of 691 // this enum. 692 // 693 // match expr { 694 // TraitItem::Const(e) => {...} 695 // TraitItem::Method(e) => {...} 696 // ... 697 // TraitItem::Verbatim(e) => {...} 698 // 699 // #[cfg(test)] 700 // TraitItem::__TestExhaustive(_) => unimplemented!(), 701 // #[cfg(not(test))] 702 // _ => { /* some sane fallback */ } 703 // } 704 // 705 // This way we fail your tests but don't break your library when adding 706 // a variant. You will be notified by a test failure when a variant is 707 // added, so that you can add code to handle it, but your library will 708 // continue to compile and work for downstream users in the interim. 709 // 710 // Once `deny(reachable)` is available in rustc, TraitItem will be 711 // reimplemented as a non_exhaustive enum. 712 // https://github.com/rust-lang/rust/issues/44109#issuecomment-521781237 713 #[doc(hidden)] 714 __TestExhaustive(crate::private), 715 } 716 } 717 718 ast_struct! { 719 /// An associated constant within the definition of a trait. 720 /// 721 /// *This type is available only if Syn is built with the `"full"` feature.* 722 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 723 pub struct TraitItemConst { 724 pub attrs: Vec<Attribute>, 725 pub const_token: Token![const], 726 pub ident: Ident, 727 pub colon_token: Token![:], 728 pub ty: Type, 729 pub default: Option<(Token![=], Expr)>, 730 pub semi_token: Token![;], 731 } 732 } 733 734 ast_struct! { 735 /// A trait method within the definition of a trait. 736 /// 737 /// *This type is available only if Syn is built with the `"full"` feature.* 738 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 739 pub struct TraitItemMethod { 740 pub attrs: Vec<Attribute>, 741 pub sig: Signature, 742 pub default: Option<Block>, 743 pub semi_token: Option<Token![;]>, 744 } 745 } 746 747 ast_struct! { 748 /// An associated type within the definition of a trait. 749 /// 750 /// *This type is available only if Syn is built with the `"full"` feature.* 751 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 752 pub struct TraitItemType { 753 pub attrs: Vec<Attribute>, 754 pub type_token: Token![type], 755 pub ident: Ident, 756 pub generics: Generics, 757 pub colon_token: Option<Token![:]>, 758 pub bounds: Punctuated<TypeParamBound, Token![+]>, 759 pub default: Option<(Token![=], Type)>, 760 pub semi_token: Token![;], 761 } 762 } 763 764 ast_struct! { 765 /// A macro invocation within the definition of a trait. 766 /// 767 /// *This type is available only if Syn is built with the `"full"` feature.* 768 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 769 pub struct TraitItemMacro { 770 pub attrs: Vec<Attribute>, 771 pub mac: Macro, 772 pub semi_token: Option<Token![;]>, 773 } 774 } 775 776 ast_enum_of_structs! { 777 /// An item within an impl block. 778 /// 779 /// *This type is available only if Syn is built with the `"full"` feature.* 780 /// 781 /// # Syntax tree enum 782 /// 783 /// This type is a [syntax tree enum]. 784 /// 785 /// [syntax tree enum]: Expr#syntax-tree-enums 786 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 787 pub enum ImplItem { 788 /// An associated constant within an impl block. 789 Const(ImplItemConst), 790 791 /// A method within an impl block. 792 Method(ImplItemMethod), 793 794 /// An associated type within an impl block. 795 Type(ImplItemType), 796 797 /// A macro invocation within an impl block. 798 Macro(ImplItemMacro), 799 800 /// Tokens within an impl block not interpreted by Syn. 801 Verbatim(TokenStream), 802 803 // The following is the only supported idiom for exhaustive matching of 804 // this enum. 805 // 806 // match expr { 807 // ImplItem::Const(e) => {...} 808 // ImplItem::Method(e) => {...} 809 // ... 810 // ImplItem::Verbatim(e) => {...} 811 // 812 // #[cfg(test)] 813 // ImplItem::__TestExhaustive(_) => unimplemented!(), 814 // #[cfg(not(test))] 815 // _ => { /* some sane fallback */ } 816 // } 817 // 818 // This way we fail your tests but don't break your library when adding 819 // a variant. You will be notified by a test failure when a variant is 820 // added, so that you can add code to handle it, but your library will 821 // continue to compile and work for downstream users in the interim. 822 // 823 // Once `deny(reachable)` is available in rustc, ImplItem will be 824 // reimplemented as a non_exhaustive enum. 825 // https://github.com/rust-lang/rust/issues/44109#issuecomment-521781237 826 #[doc(hidden)] 827 __TestExhaustive(crate::private), 828 } 829 } 830 831 ast_struct! { 832 /// An associated constant within an impl block. 833 /// 834 /// *This type is available only if Syn is built with the `"full"` feature.* 835 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 836 pub struct ImplItemConst { 837 pub attrs: Vec<Attribute>, 838 pub vis: Visibility, 839 pub defaultness: Option<Token![default]>, 840 pub const_token: Token![const], 841 pub ident: Ident, 842 pub colon_token: Token![:], 843 pub ty: Type, 844 pub eq_token: Token![=], 845 pub expr: Expr, 846 pub semi_token: Token![;], 847 } 848 } 849 850 ast_struct! { 851 /// A method within an impl block. 852 /// 853 /// *This type is available only if Syn is built with the `"full"` feature.* 854 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 855 pub struct ImplItemMethod { 856 pub attrs: Vec<Attribute>, 857 pub vis: Visibility, 858 pub defaultness: Option<Token![default]>, 859 pub sig: Signature, 860 pub block: Block, 861 } 862 } 863 864 ast_struct! { 865 /// An associated type within an impl block. 866 /// 867 /// *This type is available only if Syn is built with the `"full"` feature.* 868 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 869 pub struct ImplItemType { 870 pub attrs: Vec<Attribute>, 871 pub vis: Visibility, 872 pub defaultness: Option<Token![default]>, 873 pub type_token: Token![type], 874 pub ident: Ident, 875 pub generics: Generics, 876 pub eq_token: Token![=], 877 pub ty: Type, 878 pub semi_token: Token![;], 879 } 880 } 881 882 ast_struct! { 883 /// A macro invocation within an impl block. 884 /// 885 /// *This type is available only if Syn is built with the `"full"` feature.* 886 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 887 pub struct ImplItemMacro { 888 pub attrs: Vec<Attribute>, 889 pub mac: Macro, 890 pub semi_token: Option<Token![;]>, 891 } 892 } 893 894 ast_struct! { 895 /// A function signature in a trait or implementation: `unsafe fn 896 /// initialize(&self)`. 897 /// 898 /// *This type is available only if Syn is built with the `"full"` feature.* 899 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 900 pub struct Signature { 901 pub constness: Option<Token![const]>, 902 pub asyncness: Option<Token![async]>, 903 pub unsafety: Option<Token![unsafe]>, 904 pub abi: Option<Abi>, 905 pub fn_token: Token![fn], 906 pub ident: Ident, 907 pub generics: Generics, 908 pub paren_token: token::Paren, 909 pub inputs: Punctuated<FnArg, Token![,]>, 910 pub variadic: Option<Variadic>, 911 pub output: ReturnType, 912 } 913 } 914 915 impl Signature { 916 /// A method's `self` receiver, such as `&self` or `self: Box<Self>`. receiver(&self) -> Option<&FnArg>917 pub fn receiver(&self) -> Option<&FnArg> { 918 let arg = self.inputs.first()?; 919 match arg { 920 FnArg::Receiver(_) => Some(arg), 921 FnArg::Typed(PatType { pat, .. }) => { 922 if let Pat::Ident(PatIdent { ident, .. }) = &**pat { 923 if ident == "self" { 924 return Some(arg); 925 } 926 } 927 None 928 } 929 } 930 } 931 } 932 933 ast_enum_of_structs! { 934 /// An argument in a function signature: the `n: usize` in `fn f(n: usize)`. 935 /// 936 /// *This type is available only if Syn is built with the `"full"` feature.* 937 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 938 pub enum FnArg { 939 /// The `self` argument of an associated method, whether taken by value 940 /// or by reference. 941 /// 942 /// Note that `self` receivers with a specified type, such as `self: 943 /// Box<Self>`, are parsed as a `FnArg::Typed`. 944 Receiver(Receiver), 945 946 /// A function argument accepted by pattern and type. 947 Typed(PatType), 948 } 949 } 950 951 ast_struct! { 952 /// The `self` argument of an associated method, whether taken by value 953 /// or by reference. 954 /// 955 /// Note that `self` receivers with a specified type, such as `self: 956 /// Box<Self>`, are parsed as a `FnArg::Typed`. 957 /// 958 /// *This type is available only if Syn is built with the `"full"` feature.* 959 #[cfg_attr(doc_cfg, doc(cfg(feature = "full")))] 960 pub struct Receiver { 961 pub attrs: Vec<Attribute>, 962 pub reference: Option<(Token![&], Option<Lifetime>)>, 963 pub mutability: Option<Token![mut]>, 964 pub self_token: Token![self], 965 } 966 } 967 968 impl Receiver { lifetime(&self) -> Option<&Lifetime>969 pub fn lifetime(&self) -> Option<&Lifetime> { 970 self.reference.as_ref()?.1.as_ref() 971 } 972 } 973 974 #[cfg(feature = "parsing")] 975 pub mod parsing { 976 use super::*; 977 use crate::ext::IdentExt; 978 use crate::parse::discouraged::Speculative; 979 use crate::parse::{Parse, ParseBuffer, ParseStream, Result}; 980 use crate::token::Brace; 981 use proc_macro2::{Delimiter, Group, Punct, Spacing, TokenTree}; 982 use std::iter::{self, FromIterator}; 983 984 crate::custom_keyword!(existential); 985 986 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 987 impl Parse for Item { parse(input: ParseStream) -> Result<Self>988 fn parse(input: ParseStream) -> Result<Self> { 989 let begin = input.fork(); 990 let mut attrs = input.call(Attribute::parse_outer)?; 991 let ahead = input.fork(); 992 let vis: Visibility = ahead.parse()?; 993 994 let lookahead = ahead.lookahead1(); 995 let mut item = if lookahead.peek(Token![fn]) || peek_signature(&ahead) { 996 let vis: Visibility = input.parse()?; 997 let sig: Signature = input.parse()?; 998 if input.peek(Token![;]) { 999 input.parse::<Token![;]>()?; 1000 Ok(Item::Verbatim(verbatim::between(begin, input))) 1001 } else { 1002 parse_rest_of_fn(input, Vec::new(), vis, sig).map(Item::Fn) 1003 } 1004 } else if lookahead.peek(Token![extern]) { 1005 ahead.parse::<Token![extern]>()?; 1006 let lookahead = ahead.lookahead1(); 1007 if lookahead.peek(Token![crate]) { 1008 input.parse().map(Item::ExternCrate) 1009 } else if lookahead.peek(token::Brace) { 1010 input.parse().map(Item::ForeignMod) 1011 } else if lookahead.peek(LitStr) { 1012 ahead.parse::<LitStr>()?; 1013 let lookahead = ahead.lookahead1(); 1014 if lookahead.peek(token::Brace) { 1015 input.parse().map(Item::ForeignMod) 1016 } else { 1017 Err(lookahead.error()) 1018 } 1019 } else { 1020 Err(lookahead.error()) 1021 } 1022 } else if lookahead.peek(Token![use]) { 1023 input.parse().map(Item::Use) 1024 } else if lookahead.peek(Token![static]) { 1025 let vis = input.parse()?; 1026 let static_token = input.parse()?; 1027 let mutability = input.parse()?; 1028 let ident = input.parse()?; 1029 let colon_token = input.parse()?; 1030 let ty = input.parse()?; 1031 if input.peek(Token![;]) { 1032 input.parse::<Token![;]>()?; 1033 Ok(Item::Verbatim(verbatim::between(begin, input))) 1034 } else { 1035 Ok(Item::Static(ItemStatic { 1036 attrs: Vec::new(), 1037 vis, 1038 static_token, 1039 mutability, 1040 ident, 1041 colon_token, 1042 ty, 1043 eq_token: input.parse()?, 1044 expr: input.parse()?, 1045 semi_token: input.parse()?, 1046 })) 1047 } 1048 } else if lookahead.peek(Token![const]) { 1049 ahead.parse::<Token![const]>()?; 1050 let lookahead = ahead.lookahead1(); 1051 if lookahead.peek(Ident) || lookahead.peek(Token![_]) { 1052 let vis = input.parse()?; 1053 let const_token = input.parse()?; 1054 let ident = { 1055 let lookahead = input.lookahead1(); 1056 if lookahead.peek(Ident) || lookahead.peek(Token![_]) { 1057 input.call(Ident::parse_any)? 1058 } else { 1059 return Err(lookahead.error()); 1060 } 1061 }; 1062 let colon_token = input.parse()?; 1063 let ty = input.parse()?; 1064 if input.peek(Token![;]) { 1065 input.parse::<Token![;]>()?; 1066 Ok(Item::Verbatim(verbatim::between(begin, input))) 1067 } else { 1068 Ok(Item::Const(ItemConst { 1069 attrs: Vec::new(), 1070 vis, 1071 const_token, 1072 ident, 1073 colon_token, 1074 ty, 1075 eq_token: input.parse()?, 1076 expr: input.parse()?, 1077 semi_token: input.parse()?, 1078 })) 1079 } 1080 } else { 1081 Err(lookahead.error()) 1082 } 1083 } else if lookahead.peek(Token![unsafe]) { 1084 ahead.parse::<Token![unsafe]>()?; 1085 let lookahead = ahead.lookahead1(); 1086 if lookahead.peek(Token![trait]) 1087 || lookahead.peek(Token![auto]) && ahead.peek2(Token![trait]) 1088 { 1089 input.parse().map(Item::Trait) 1090 } else if lookahead.peek(Token![impl]) { 1091 let allow_const_impl = true; 1092 if let Some(item) = parse_impl(input, allow_const_impl)? { 1093 Ok(Item::Impl(item)) 1094 } else { 1095 Ok(Item::Verbatim(verbatim::between(begin, input))) 1096 } 1097 } else if lookahead.peek(Token![extern]) { 1098 input.parse::<Visibility>()?; 1099 input.parse::<Token![unsafe]>()?; 1100 input.parse::<ItemForeignMod>()?; 1101 Ok(Item::Verbatim(verbatim::between(begin, input))) 1102 } else if lookahead.peek(Token![mod]) { 1103 input.parse::<Visibility>()?; 1104 input.parse::<Token![unsafe]>()?; 1105 input.parse::<ItemMod>()?; 1106 Ok(Item::Verbatim(verbatim::between(begin, input))) 1107 } else { 1108 Err(lookahead.error()) 1109 } 1110 } else if lookahead.peek(Token![mod]) { 1111 input.parse().map(Item::Mod) 1112 } else if lookahead.peek(Token![type]) { 1113 parse_item_type(begin, input) 1114 } else if lookahead.peek(existential) { 1115 input.call(item_existential).map(Item::Verbatim) 1116 } else if lookahead.peek(Token![struct]) { 1117 input.parse().map(Item::Struct) 1118 } else if lookahead.peek(Token![enum]) { 1119 input.parse().map(Item::Enum) 1120 } else if lookahead.peek(Token![union]) && ahead.peek2(Ident) { 1121 input.parse().map(Item::Union) 1122 } else if lookahead.peek(Token![trait]) { 1123 input.call(parse_trait_or_trait_alias) 1124 } else if lookahead.peek(Token![auto]) && ahead.peek2(Token![trait]) { 1125 input.parse().map(Item::Trait) 1126 } else if lookahead.peek(Token![impl]) 1127 || lookahead.peek(Token![default]) && !ahead.peek2(Token![!]) 1128 { 1129 let allow_const_impl = true; 1130 if let Some(item) = parse_impl(input, allow_const_impl)? { 1131 Ok(Item::Impl(item)) 1132 } else { 1133 Ok(Item::Verbatim(verbatim::between(begin, input))) 1134 } 1135 } else if lookahead.peek(Token![macro]) { 1136 input.parse().map(Item::Macro2) 1137 } else if vis.is_inherited() 1138 && (lookahead.peek(Ident) 1139 || lookahead.peek(Token![self]) 1140 || lookahead.peek(Token![super]) 1141 || lookahead.peek(Token![crate]) 1142 || lookahead.peek(Token![::])) 1143 { 1144 input.parse().map(Item::Macro) 1145 } else { 1146 Err(lookahead.error()) 1147 }?; 1148 1149 attrs.extend(item.replace_attrs(Vec::new())); 1150 item.replace_attrs(attrs); 1151 Ok(item) 1152 } 1153 } 1154 1155 struct FlexibleItemType { 1156 vis: Visibility, 1157 defaultness: Option<Token![default]>, 1158 type_token: Token![type], 1159 ident: Ident, 1160 generics: Generics, 1161 colon_token: Option<Token![:]>, 1162 bounds: Punctuated<TypeParamBound, Token![+]>, 1163 ty: Option<(Token![=], Type)>, 1164 semi_token: Token![;], 1165 } 1166 1167 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1168 impl Parse for FlexibleItemType { parse(input: ParseStream) -> Result<Self>1169 fn parse(input: ParseStream) -> Result<Self> { 1170 let vis: Visibility = input.parse()?; 1171 let defaultness: Option<Token![default]> = input.parse()?; 1172 let type_token: Token![type] = input.parse()?; 1173 let ident: Ident = input.parse()?; 1174 let mut generics: Generics = input.parse()?; 1175 let colon_token: Option<Token![:]> = input.parse()?; 1176 let mut bounds = Punctuated::new(); 1177 if colon_token.is_some() { 1178 loop { 1179 bounds.push_value(input.parse::<TypeParamBound>()?); 1180 if input.peek(Token![where]) || input.peek(Token![=]) || input.peek(Token![;]) { 1181 break; 1182 } 1183 bounds.push_punct(input.parse::<Token![+]>()?); 1184 if input.peek(Token![where]) || input.peek(Token![=]) || input.peek(Token![;]) { 1185 break; 1186 } 1187 } 1188 } 1189 generics.where_clause = input.parse()?; 1190 let ty = if let Some(eq_token) = input.parse()? { 1191 Some((eq_token, input.parse::<Type>()?)) 1192 } else { 1193 None 1194 }; 1195 let semi_token: Token![;] = input.parse()?; 1196 1197 Ok(FlexibleItemType { 1198 vis, 1199 defaultness, 1200 type_token, 1201 ident, 1202 generics, 1203 colon_token, 1204 bounds, 1205 ty, 1206 semi_token, 1207 }) 1208 } 1209 } 1210 1211 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1212 impl Parse for ItemMacro { parse(input: ParseStream) -> Result<Self>1213 fn parse(input: ParseStream) -> Result<Self> { 1214 let attrs = input.call(Attribute::parse_outer)?; 1215 let path = input.call(Path::parse_mod_style)?; 1216 let bang_token: Token![!] = input.parse()?; 1217 let ident: Option<Ident> = input.parse()?; 1218 let (delimiter, tokens) = input.call(mac::parse_delimiter)?; 1219 let semi_token: Option<Token![;]> = if !delimiter.is_brace() { 1220 Some(input.parse()?) 1221 } else { 1222 None 1223 }; 1224 Ok(ItemMacro { 1225 attrs, 1226 ident, 1227 mac: Macro { 1228 path, 1229 bang_token, 1230 delimiter, 1231 tokens, 1232 }, 1233 semi_token, 1234 }) 1235 } 1236 } 1237 1238 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1239 impl Parse for ItemMacro2 { parse(input: ParseStream) -> Result<Self>1240 fn parse(input: ParseStream) -> Result<Self> { 1241 let attrs = input.call(Attribute::parse_outer)?; 1242 let vis: Visibility = input.parse()?; 1243 let macro_token: Token![macro] = input.parse()?; 1244 let ident: Ident = input.parse()?; 1245 let mut rules = TokenStream::new(); 1246 1247 let mut lookahead = input.lookahead1(); 1248 if lookahead.peek(token::Paren) { 1249 let paren_content; 1250 let paren_token = parenthesized!(paren_content in input); 1251 let args: TokenStream = paren_content.parse()?; 1252 let mut args = Group::new(Delimiter::Parenthesis, args); 1253 args.set_span(paren_token.span); 1254 rules.extend(iter::once(TokenTree::Group(args))); 1255 lookahead = input.lookahead1(); 1256 } 1257 1258 if lookahead.peek(token::Brace) { 1259 let brace_content; 1260 let brace_token = braced!(brace_content in input); 1261 let body: TokenStream = brace_content.parse()?; 1262 let mut body = Group::new(Delimiter::Brace, body); 1263 body.set_span(brace_token.span); 1264 rules.extend(iter::once(TokenTree::Group(body))); 1265 } else { 1266 return Err(lookahead.error()); 1267 } 1268 1269 Ok(ItemMacro2 { 1270 attrs, 1271 vis, 1272 macro_token, 1273 ident, 1274 rules, 1275 }) 1276 } 1277 } 1278 1279 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1280 impl Parse for ItemExternCrate { parse(input: ParseStream) -> Result<Self>1281 fn parse(input: ParseStream) -> Result<Self> { 1282 Ok(ItemExternCrate { 1283 attrs: input.call(Attribute::parse_outer)?, 1284 vis: input.parse()?, 1285 extern_token: input.parse()?, 1286 crate_token: input.parse()?, 1287 ident: { 1288 if input.peek(Token![self]) { 1289 input.call(Ident::parse_any)? 1290 } else { 1291 input.parse()? 1292 } 1293 }, 1294 rename: { 1295 if input.peek(Token![as]) { 1296 let as_token: Token![as] = input.parse()?; 1297 let rename: Ident = if input.peek(Token![_]) { 1298 Ident::from(input.parse::<Token![_]>()?) 1299 } else { 1300 input.parse()? 1301 }; 1302 Some((as_token, rename)) 1303 } else { 1304 None 1305 } 1306 }, 1307 semi_token: input.parse()?, 1308 }) 1309 } 1310 } 1311 1312 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1313 impl Parse for ItemUse { parse(input: ParseStream) -> Result<Self>1314 fn parse(input: ParseStream) -> Result<Self> { 1315 Ok(ItemUse { 1316 attrs: input.call(Attribute::parse_outer)?, 1317 vis: input.parse()?, 1318 use_token: input.parse()?, 1319 leading_colon: input.parse()?, 1320 tree: input.parse()?, 1321 semi_token: input.parse()?, 1322 }) 1323 } 1324 } 1325 1326 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1327 impl Parse for UseTree { parse(input: ParseStream) -> Result<UseTree>1328 fn parse(input: ParseStream) -> Result<UseTree> { 1329 let lookahead = input.lookahead1(); 1330 if lookahead.peek(Ident) 1331 || lookahead.peek(Token![self]) 1332 || lookahead.peek(Token![super]) 1333 || lookahead.peek(Token![crate]) 1334 { 1335 let ident = input.call(Ident::parse_any)?; 1336 if input.peek(Token![::]) { 1337 Ok(UseTree::Path(UsePath { 1338 ident, 1339 colon2_token: input.parse()?, 1340 tree: Box::new(input.parse()?), 1341 })) 1342 } else if input.peek(Token![as]) { 1343 Ok(UseTree::Rename(UseRename { 1344 ident, 1345 as_token: input.parse()?, 1346 rename: { 1347 if input.peek(Ident) { 1348 input.parse()? 1349 } else if input.peek(Token![_]) { 1350 Ident::from(input.parse::<Token![_]>()?) 1351 } else { 1352 return Err(input.error("expected identifier or underscore")); 1353 } 1354 }, 1355 })) 1356 } else { 1357 Ok(UseTree::Name(UseName { ident })) 1358 } 1359 } else if lookahead.peek(Token![*]) { 1360 Ok(UseTree::Glob(UseGlob { 1361 star_token: input.parse()?, 1362 })) 1363 } else if lookahead.peek(token::Brace) { 1364 let content; 1365 Ok(UseTree::Group(UseGroup { 1366 brace_token: braced!(content in input), 1367 items: content.parse_terminated(UseTree::parse)?, 1368 })) 1369 } else { 1370 Err(lookahead.error()) 1371 } 1372 } 1373 } 1374 1375 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1376 impl Parse for ItemStatic { parse(input: ParseStream) -> Result<Self>1377 fn parse(input: ParseStream) -> Result<Self> { 1378 Ok(ItemStatic { 1379 attrs: input.call(Attribute::parse_outer)?, 1380 vis: input.parse()?, 1381 static_token: input.parse()?, 1382 mutability: input.parse()?, 1383 ident: input.parse()?, 1384 colon_token: input.parse()?, 1385 ty: input.parse()?, 1386 eq_token: input.parse()?, 1387 expr: input.parse()?, 1388 semi_token: input.parse()?, 1389 }) 1390 } 1391 } 1392 1393 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1394 impl Parse for ItemConst { parse(input: ParseStream) -> Result<Self>1395 fn parse(input: ParseStream) -> Result<Self> { 1396 Ok(ItemConst { 1397 attrs: input.call(Attribute::parse_outer)?, 1398 vis: input.parse()?, 1399 const_token: input.parse()?, 1400 ident: { 1401 let lookahead = input.lookahead1(); 1402 if lookahead.peek(Ident) || lookahead.peek(Token![_]) { 1403 input.call(Ident::parse_any)? 1404 } else { 1405 return Err(lookahead.error()); 1406 } 1407 }, 1408 colon_token: input.parse()?, 1409 ty: input.parse()?, 1410 eq_token: input.parse()?, 1411 expr: input.parse()?, 1412 semi_token: input.parse()?, 1413 }) 1414 } 1415 } 1416 pop_variadic(args: &mut Punctuated<FnArg, Token![,]>) -> Option<Variadic>1417 fn pop_variadic(args: &mut Punctuated<FnArg, Token![,]>) -> Option<Variadic> { 1418 let trailing_punct = args.trailing_punct(); 1419 1420 let last = match args.last_mut()? { 1421 FnArg::Typed(last) => last, 1422 _ => return None, 1423 }; 1424 1425 let ty = match last.ty.as_ref() { 1426 Type::Verbatim(ty) => ty, 1427 _ => return None, 1428 }; 1429 1430 let mut variadic = Variadic { 1431 attrs: Vec::new(), 1432 dots: parse2(ty.clone()).ok()?, 1433 }; 1434 1435 if let Pat::Verbatim(pat) = last.pat.as_ref() { 1436 if pat.to_string() == "..." && !trailing_punct { 1437 variadic.attrs = mem::replace(&mut last.attrs, Vec::new()); 1438 args.pop(); 1439 } 1440 } 1441 1442 Some(variadic) 1443 } 1444 variadic_to_tokens(dots: &Token![...]) -> TokenStream1445 fn variadic_to_tokens(dots: &Token![...]) -> TokenStream { 1446 TokenStream::from_iter(vec![ 1447 TokenTree::Punct({ 1448 let mut dot = Punct::new('.', Spacing::Joint); 1449 dot.set_span(dots.spans[0]); 1450 dot 1451 }), 1452 TokenTree::Punct({ 1453 let mut dot = Punct::new('.', Spacing::Joint); 1454 dot.set_span(dots.spans[1]); 1455 dot 1456 }), 1457 TokenTree::Punct({ 1458 let mut dot = Punct::new('.', Spacing::Alone); 1459 dot.set_span(dots.spans[2]); 1460 dot 1461 }), 1462 ]) 1463 } 1464 peek_signature(input: ParseStream) -> bool1465 fn peek_signature(input: ParseStream) -> bool { 1466 let fork = input.fork(); 1467 fork.parse::<Option<Token![const]>>().is_ok() 1468 && fork.parse::<Option<Token![async]>>().is_ok() 1469 && fork.parse::<Option<Token![unsafe]>>().is_ok() 1470 && fork.parse::<Option<Abi>>().is_ok() 1471 && fork.peek(Token![fn]) 1472 } 1473 1474 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1475 impl Parse for Signature { parse(input: ParseStream) -> Result<Self>1476 fn parse(input: ParseStream) -> Result<Self> { 1477 let constness: Option<Token![const]> = input.parse()?; 1478 let asyncness: Option<Token![async]> = input.parse()?; 1479 let unsafety: Option<Token![unsafe]> = input.parse()?; 1480 let abi: Option<Abi> = input.parse()?; 1481 let fn_token: Token![fn] = input.parse()?; 1482 let ident: Ident = input.parse()?; 1483 let mut generics: Generics = input.parse()?; 1484 1485 let content; 1486 let paren_token = parenthesized!(content in input); 1487 let mut inputs = parse_fn_args(&content)?; 1488 let variadic = pop_variadic(&mut inputs); 1489 1490 let output: ReturnType = input.parse()?; 1491 generics.where_clause = input.parse()?; 1492 1493 Ok(Signature { 1494 constness, 1495 asyncness, 1496 unsafety, 1497 abi, 1498 fn_token, 1499 ident, 1500 paren_token, 1501 inputs, 1502 output, 1503 variadic, 1504 generics, 1505 }) 1506 } 1507 } 1508 1509 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1510 impl Parse for ItemFn { parse(input: ParseStream) -> Result<Self>1511 fn parse(input: ParseStream) -> Result<Self> { 1512 let outer_attrs = input.call(Attribute::parse_outer)?; 1513 let vis: Visibility = input.parse()?; 1514 let sig: Signature = input.parse()?; 1515 parse_rest_of_fn(input, outer_attrs, vis, sig) 1516 } 1517 } 1518 parse_rest_of_fn( input: ParseStream, outer_attrs: Vec<Attribute>, vis: Visibility, sig: Signature, ) -> Result<ItemFn>1519 fn parse_rest_of_fn( 1520 input: ParseStream, 1521 outer_attrs: Vec<Attribute>, 1522 vis: Visibility, 1523 sig: Signature, 1524 ) -> Result<ItemFn> { 1525 let content; 1526 let brace_token = braced!(content in input); 1527 let inner_attrs = content.call(Attribute::parse_inner)?; 1528 let stmts = content.call(Block::parse_within)?; 1529 1530 Ok(ItemFn { 1531 attrs: private::attrs(outer_attrs, inner_attrs), 1532 vis, 1533 sig, 1534 block: Box::new(Block { brace_token, stmts }), 1535 }) 1536 } 1537 1538 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1539 impl Parse for FnArg { parse(input: ParseStream) -> Result<Self>1540 fn parse(input: ParseStream) -> Result<Self> { 1541 let attrs = input.call(Attribute::parse_outer)?; 1542 1543 let ahead = input.fork(); 1544 if let Ok(mut receiver) = ahead.parse::<Receiver>() { 1545 if !ahead.peek(Token![:]) { 1546 input.advance_to(&ahead); 1547 receiver.attrs = attrs; 1548 return Ok(FnArg::Receiver(receiver)); 1549 } 1550 } 1551 1552 let mut typed = input.call(fn_arg_typed)?; 1553 typed.attrs = attrs; 1554 Ok(FnArg::Typed(typed)) 1555 } 1556 } 1557 1558 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1559 impl Parse for Receiver { parse(input: ParseStream) -> Result<Self>1560 fn parse(input: ParseStream) -> Result<Self> { 1561 Ok(Receiver { 1562 attrs: Vec::new(), 1563 reference: { 1564 if input.peek(Token![&]) { 1565 Some((input.parse()?, input.parse()?)) 1566 } else { 1567 None 1568 } 1569 }, 1570 mutability: input.parse()?, 1571 self_token: input.parse()?, 1572 }) 1573 } 1574 } 1575 parse_fn_args(input: ParseStream) -> Result<Punctuated<FnArg, Token![,]>>1576 fn parse_fn_args(input: ParseStream) -> Result<Punctuated<FnArg, Token![,]>> { 1577 let mut args = Punctuated::new(); 1578 let mut has_receiver = false; 1579 1580 while !input.is_empty() { 1581 let attrs = input.call(Attribute::parse_outer)?; 1582 1583 let arg = if let Some(dots) = input.parse::<Option<Token![...]>>()? { 1584 FnArg::Typed(PatType { 1585 attrs, 1586 pat: Box::new(Pat::Verbatim(variadic_to_tokens(&dots))), 1587 colon_token: Token![:](dots.spans[0]), 1588 ty: Box::new(Type::Verbatim(variadic_to_tokens(&dots))), 1589 }) 1590 } else { 1591 let mut arg: FnArg = input.parse()?; 1592 match &mut arg { 1593 FnArg::Receiver(receiver) if has_receiver => { 1594 return Err(Error::new( 1595 receiver.self_token.span, 1596 "unexpected second method receiver", 1597 )); 1598 } 1599 FnArg::Receiver(receiver) if !args.is_empty() => { 1600 return Err(Error::new( 1601 receiver.self_token.span, 1602 "unexpected method receiver", 1603 )); 1604 } 1605 FnArg::Receiver(receiver) => { 1606 has_receiver = true; 1607 receiver.attrs = attrs; 1608 } 1609 FnArg::Typed(arg) => arg.attrs = attrs, 1610 } 1611 arg 1612 }; 1613 args.push_value(arg); 1614 1615 if input.is_empty() { 1616 break; 1617 } 1618 1619 let comma: Token![,] = input.parse()?; 1620 args.push_punct(comma); 1621 } 1622 1623 Ok(args) 1624 } 1625 fn_arg_typed(input: ParseStream) -> Result<PatType>1626 fn fn_arg_typed(input: ParseStream) -> Result<PatType> { 1627 // Hack to parse pre-2018 syntax in 1628 // test/ui/rfc-2565-param-attrs/param-attrs-pretty.rs 1629 // because the rest of the test case is valuable. 1630 if input.peek(Ident) && input.peek2(Token![<]) { 1631 let span = input.fork().parse::<Ident>()?.span(); 1632 return Ok(PatType { 1633 attrs: Vec::new(), 1634 pat: Box::new(Pat::Wild(PatWild { 1635 attrs: Vec::new(), 1636 underscore_token: Token![_](span), 1637 })), 1638 colon_token: Token![:](span), 1639 ty: input.parse()?, 1640 }); 1641 } 1642 1643 Ok(PatType { 1644 attrs: Vec::new(), 1645 pat: Box::new(pat::parsing::multi_pat(input)?), 1646 colon_token: input.parse()?, 1647 ty: Box::new(match input.parse::<Option<Token![...]>>()? { 1648 Some(dot3) => Type::Verbatim(variadic_to_tokens(&dot3)), 1649 None => input.parse()?, 1650 }), 1651 }) 1652 } 1653 1654 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1655 impl Parse for ItemMod { parse(input: ParseStream) -> Result<Self>1656 fn parse(input: ParseStream) -> Result<Self> { 1657 let outer_attrs = input.call(Attribute::parse_outer)?; 1658 let vis: Visibility = input.parse()?; 1659 let mod_token: Token![mod] = input.parse()?; 1660 let ident: Ident = input.parse()?; 1661 1662 let lookahead = input.lookahead1(); 1663 if lookahead.peek(Token![;]) { 1664 Ok(ItemMod { 1665 attrs: outer_attrs, 1666 vis, 1667 mod_token, 1668 ident, 1669 content: None, 1670 semi: Some(input.parse()?), 1671 }) 1672 } else if lookahead.peek(token::Brace) { 1673 let content; 1674 let brace_token = braced!(content in input); 1675 let inner_attrs = content.call(Attribute::parse_inner)?; 1676 1677 let mut items = Vec::new(); 1678 while !content.is_empty() { 1679 items.push(content.parse()?); 1680 } 1681 1682 Ok(ItemMod { 1683 attrs: private::attrs(outer_attrs, inner_attrs), 1684 vis, 1685 mod_token, 1686 ident, 1687 content: Some((brace_token, items)), 1688 semi: None, 1689 }) 1690 } else { 1691 Err(lookahead.error()) 1692 } 1693 } 1694 } 1695 1696 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1697 impl Parse for ItemForeignMod { parse(input: ParseStream) -> Result<Self>1698 fn parse(input: ParseStream) -> Result<Self> { 1699 let outer_attrs = input.call(Attribute::parse_outer)?; 1700 let abi: Abi = input.parse()?; 1701 1702 let content; 1703 let brace_token = braced!(content in input); 1704 let inner_attrs = content.call(Attribute::parse_inner)?; 1705 let mut items = Vec::new(); 1706 while !content.is_empty() { 1707 items.push(content.parse()?); 1708 } 1709 1710 Ok(ItemForeignMod { 1711 attrs: private::attrs(outer_attrs, inner_attrs), 1712 abi, 1713 brace_token, 1714 items, 1715 }) 1716 } 1717 } 1718 1719 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1720 impl Parse for ForeignItem { parse(input: ParseStream) -> Result<Self>1721 fn parse(input: ParseStream) -> Result<Self> { 1722 let begin = input.fork(); 1723 let mut attrs = input.call(Attribute::parse_outer)?; 1724 let ahead = input.fork(); 1725 let vis: Visibility = ahead.parse()?; 1726 1727 let lookahead = ahead.lookahead1(); 1728 let mut item = if lookahead.peek(Token![fn]) || peek_signature(&ahead) { 1729 let vis: Visibility = input.parse()?; 1730 let sig: Signature = input.parse()?; 1731 if input.peek(token::Brace) { 1732 let content; 1733 braced!(content in input); 1734 content.call(Attribute::parse_inner)?; 1735 content.call(Block::parse_within)?; 1736 1737 Ok(ForeignItem::Verbatim(verbatim::between(begin, input))) 1738 } else { 1739 Ok(ForeignItem::Fn(ForeignItemFn { 1740 attrs: Vec::new(), 1741 vis, 1742 sig, 1743 semi_token: input.parse()?, 1744 })) 1745 } 1746 } else if lookahead.peek(Token![static]) { 1747 let vis = input.parse()?; 1748 let static_token = input.parse()?; 1749 let mutability = input.parse()?; 1750 let ident = input.parse()?; 1751 let colon_token = input.parse()?; 1752 let ty = input.parse()?; 1753 if input.peek(Token![=]) { 1754 input.parse::<Token![=]>()?; 1755 input.parse::<Expr>()?; 1756 input.parse::<Token![;]>()?; 1757 Ok(ForeignItem::Verbatim(verbatim::between(begin, input))) 1758 } else { 1759 Ok(ForeignItem::Static(ForeignItemStatic { 1760 attrs: Vec::new(), 1761 vis, 1762 static_token, 1763 mutability, 1764 ident, 1765 colon_token, 1766 ty, 1767 semi_token: input.parse()?, 1768 })) 1769 } 1770 } else if lookahead.peek(Token![type]) { 1771 parse_foreign_item_type(begin, input) 1772 } else if vis.is_inherited() 1773 && (lookahead.peek(Ident) 1774 || lookahead.peek(Token![self]) 1775 || lookahead.peek(Token![super]) 1776 || lookahead.peek(Token![crate]) 1777 || lookahead.peek(Token![::])) 1778 { 1779 input.parse().map(ForeignItem::Macro) 1780 } else { 1781 Err(lookahead.error()) 1782 }?; 1783 1784 let item_attrs = match &mut item { 1785 ForeignItem::Fn(item) => &mut item.attrs, 1786 ForeignItem::Static(item) => &mut item.attrs, 1787 ForeignItem::Type(item) => &mut item.attrs, 1788 ForeignItem::Macro(item) => &mut item.attrs, 1789 ForeignItem::Verbatim(_) => return Ok(item), 1790 ForeignItem::__TestExhaustive(_) => unreachable!(), 1791 }; 1792 attrs.extend(item_attrs.drain(..)); 1793 *item_attrs = attrs; 1794 1795 Ok(item) 1796 } 1797 } 1798 1799 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1800 impl Parse for ForeignItemFn { parse(input: ParseStream) -> Result<Self>1801 fn parse(input: ParseStream) -> Result<Self> { 1802 let attrs = input.call(Attribute::parse_outer)?; 1803 let vis: Visibility = input.parse()?; 1804 let sig: Signature = input.parse()?; 1805 let semi_token: Token![;] = input.parse()?; 1806 Ok(ForeignItemFn { 1807 attrs, 1808 vis, 1809 sig, 1810 semi_token, 1811 }) 1812 } 1813 } 1814 1815 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1816 impl Parse for ForeignItemStatic { parse(input: ParseStream) -> Result<Self>1817 fn parse(input: ParseStream) -> Result<Self> { 1818 Ok(ForeignItemStatic { 1819 attrs: input.call(Attribute::parse_outer)?, 1820 vis: input.parse()?, 1821 static_token: input.parse()?, 1822 mutability: input.parse()?, 1823 ident: input.parse()?, 1824 colon_token: input.parse()?, 1825 ty: input.parse()?, 1826 semi_token: input.parse()?, 1827 }) 1828 } 1829 } 1830 1831 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1832 impl Parse for ForeignItemType { parse(input: ParseStream) -> Result<Self>1833 fn parse(input: ParseStream) -> Result<Self> { 1834 Ok(ForeignItemType { 1835 attrs: input.call(Attribute::parse_outer)?, 1836 vis: input.parse()?, 1837 type_token: input.parse()?, 1838 ident: input.parse()?, 1839 semi_token: input.parse()?, 1840 }) 1841 } 1842 } 1843 parse_foreign_item_type(begin: ParseBuffer, input: ParseStream) -> Result<ForeignItem>1844 fn parse_foreign_item_type(begin: ParseBuffer, input: ParseStream) -> Result<ForeignItem> { 1845 let FlexibleItemType { 1846 vis, 1847 defaultness, 1848 type_token, 1849 ident, 1850 generics, 1851 colon_token, 1852 bounds: _, 1853 ty, 1854 semi_token, 1855 } = input.parse()?; 1856 1857 if defaultness.is_some() 1858 || generics.lt_token.is_some() 1859 || generics.where_clause.is_some() 1860 || colon_token.is_some() 1861 || ty.is_some() 1862 { 1863 Ok(ForeignItem::Verbatim(verbatim::between(begin, input))) 1864 } else { 1865 Ok(ForeignItem::Type(ForeignItemType { 1866 attrs: Vec::new(), 1867 vis, 1868 type_token, 1869 ident, 1870 semi_token, 1871 })) 1872 } 1873 } 1874 1875 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1876 impl Parse for ForeignItemMacro { parse(input: ParseStream) -> Result<Self>1877 fn parse(input: ParseStream) -> Result<Self> { 1878 let attrs = input.call(Attribute::parse_outer)?; 1879 let mac: Macro = input.parse()?; 1880 let semi_token: Option<Token![;]> = if mac.delimiter.is_brace() { 1881 None 1882 } else { 1883 Some(input.parse()?) 1884 }; 1885 Ok(ForeignItemMacro { 1886 attrs, 1887 mac, 1888 semi_token, 1889 }) 1890 } 1891 } 1892 1893 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1894 impl Parse for ItemType { parse(input: ParseStream) -> Result<Self>1895 fn parse(input: ParseStream) -> Result<Self> { 1896 Ok(ItemType { 1897 attrs: input.call(Attribute::parse_outer)?, 1898 vis: input.parse()?, 1899 type_token: input.parse()?, 1900 ident: input.parse()?, 1901 generics: { 1902 let mut generics: Generics = input.parse()?; 1903 generics.where_clause = input.parse()?; 1904 generics 1905 }, 1906 eq_token: input.parse()?, 1907 ty: input.parse()?, 1908 semi_token: input.parse()?, 1909 }) 1910 } 1911 } 1912 parse_item_type(begin: ParseBuffer, input: ParseStream) -> Result<Item>1913 fn parse_item_type(begin: ParseBuffer, input: ParseStream) -> Result<Item> { 1914 let FlexibleItemType { 1915 vis, 1916 defaultness, 1917 type_token, 1918 ident, 1919 generics, 1920 colon_token, 1921 bounds: _, 1922 ty, 1923 semi_token, 1924 } = input.parse()?; 1925 1926 if defaultness.is_some() || colon_token.is_some() || ty.is_none() { 1927 Ok(Item::Verbatim(verbatim::between(begin, input))) 1928 } else { 1929 let (eq_token, ty) = ty.unwrap(); 1930 Ok(Item::Type(ItemType { 1931 attrs: Vec::new(), 1932 vis, 1933 type_token, 1934 ident, 1935 generics, 1936 eq_token, 1937 ty: Box::new(ty), 1938 semi_token, 1939 })) 1940 } 1941 } 1942 1943 #[cfg(not(feature = "printing"))] item_existential(input: ParseStream) -> Result<TokenStream>1944 fn item_existential(input: ParseStream) -> Result<TokenStream> { 1945 Err(input.error("existential type is not supported")) 1946 } 1947 1948 #[cfg(feature = "printing")] item_existential(input: ParseStream) -> Result<TokenStream>1949 fn item_existential(input: ParseStream) -> Result<TokenStream> { 1950 use crate::attr::FilterAttrs; 1951 use quote::{ToTokens, TokenStreamExt}; 1952 1953 let attrs = input.call(Attribute::parse_outer)?; 1954 let vis: Visibility = input.parse()?; 1955 let existential_token: existential = input.parse()?; 1956 let type_token: Token![type] = input.parse()?; 1957 let ident: Ident = input.parse()?; 1958 1959 let mut generics: Generics = input.parse()?; 1960 generics.where_clause = input.parse()?; 1961 1962 let colon_token: Token![:] = input.parse()?; 1963 1964 let mut bounds = Punctuated::new(); 1965 while !input.peek(Token![;]) { 1966 if !bounds.is_empty() { 1967 bounds.push_punct(input.parse::<Token![+]>()?); 1968 } 1969 bounds.push_value(input.parse::<TypeParamBound>()?); 1970 } 1971 1972 let semi_token: Token![;] = input.parse()?; 1973 1974 let mut tokens = TokenStream::new(); 1975 tokens.append_all(attrs.outer()); 1976 vis.to_tokens(&mut tokens); 1977 existential_token.to_tokens(&mut tokens); 1978 type_token.to_tokens(&mut tokens); 1979 ident.to_tokens(&mut tokens); 1980 generics.to_tokens(&mut tokens); 1981 generics.where_clause.to_tokens(&mut tokens); 1982 if !bounds.is_empty() { 1983 colon_token.to_tokens(&mut tokens); 1984 bounds.to_tokens(&mut tokens); 1985 } 1986 semi_token.to_tokens(&mut tokens); 1987 Ok(tokens) 1988 } 1989 1990 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1991 impl Parse for ItemStruct { parse(input: ParseStream) -> Result<Self>1992 fn parse(input: ParseStream) -> Result<Self> { 1993 let attrs = input.call(Attribute::parse_outer)?; 1994 let vis = input.parse::<Visibility>()?; 1995 let struct_token = input.parse::<Token![struct]>()?; 1996 let ident = input.parse::<Ident>()?; 1997 let generics = input.parse::<Generics>()?; 1998 let (where_clause, fields, semi_token) = derive::parsing::data_struct(input)?; 1999 Ok(ItemStruct { 2000 attrs, 2001 vis, 2002 struct_token, 2003 ident, 2004 generics: Generics { 2005 where_clause, 2006 ..generics 2007 }, 2008 fields, 2009 semi_token, 2010 }) 2011 } 2012 } 2013 2014 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2015 impl Parse for ItemEnum { parse(input: ParseStream) -> Result<Self>2016 fn parse(input: ParseStream) -> Result<Self> { 2017 let attrs = input.call(Attribute::parse_outer)?; 2018 let vis = input.parse::<Visibility>()?; 2019 let enum_token = input.parse::<Token![enum]>()?; 2020 let ident = input.parse::<Ident>()?; 2021 let generics = input.parse::<Generics>()?; 2022 let (where_clause, brace_token, variants) = derive::parsing::data_enum(input)?; 2023 Ok(ItemEnum { 2024 attrs, 2025 vis, 2026 enum_token, 2027 ident, 2028 generics: Generics { 2029 where_clause, 2030 ..generics 2031 }, 2032 brace_token, 2033 variants, 2034 }) 2035 } 2036 } 2037 2038 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2039 impl Parse for ItemUnion { parse(input: ParseStream) -> Result<Self>2040 fn parse(input: ParseStream) -> Result<Self> { 2041 let attrs = input.call(Attribute::parse_outer)?; 2042 let vis = input.parse::<Visibility>()?; 2043 let union_token = input.parse::<Token![union]>()?; 2044 let ident = input.parse::<Ident>()?; 2045 let generics = input.parse::<Generics>()?; 2046 let (where_clause, fields) = derive::parsing::data_union(input)?; 2047 Ok(ItemUnion { 2048 attrs, 2049 vis, 2050 union_token, 2051 ident, 2052 generics: Generics { 2053 where_clause, 2054 ..generics 2055 }, 2056 fields, 2057 }) 2058 } 2059 } 2060 parse_trait_or_trait_alias(input: ParseStream) -> Result<Item>2061 fn parse_trait_or_trait_alias(input: ParseStream) -> Result<Item> { 2062 let (attrs, vis, trait_token, ident, generics) = parse_start_of_trait_alias(input)?; 2063 let lookahead = input.lookahead1(); 2064 if lookahead.peek(token::Brace) 2065 || lookahead.peek(Token![:]) 2066 || lookahead.peek(Token![where]) 2067 { 2068 let unsafety = None; 2069 let auto_token = None; 2070 parse_rest_of_trait( 2071 input, 2072 attrs, 2073 vis, 2074 unsafety, 2075 auto_token, 2076 trait_token, 2077 ident, 2078 generics, 2079 ) 2080 .map(Item::Trait) 2081 } else if lookahead.peek(Token![=]) { 2082 parse_rest_of_trait_alias(input, attrs, vis, trait_token, ident, generics) 2083 .map(Item::TraitAlias) 2084 } else { 2085 Err(lookahead.error()) 2086 } 2087 } 2088 2089 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2090 impl Parse for ItemTrait { parse(input: ParseStream) -> Result<Self>2091 fn parse(input: ParseStream) -> Result<Self> { 2092 let outer_attrs = input.call(Attribute::parse_outer)?; 2093 let vis: Visibility = input.parse()?; 2094 let unsafety: Option<Token![unsafe]> = input.parse()?; 2095 let auto_token: Option<Token![auto]> = input.parse()?; 2096 let trait_token: Token![trait] = input.parse()?; 2097 let ident: Ident = input.parse()?; 2098 let generics: Generics = input.parse()?; 2099 parse_rest_of_trait( 2100 input, 2101 outer_attrs, 2102 vis, 2103 unsafety, 2104 auto_token, 2105 trait_token, 2106 ident, 2107 generics, 2108 ) 2109 } 2110 } 2111 parse_rest_of_trait( input: ParseStream, outer_attrs: Vec<Attribute>, vis: Visibility, unsafety: Option<Token![unsafe]>, auto_token: Option<Token![auto]>, trait_token: Token![trait], ident: Ident, mut generics: Generics, ) -> Result<ItemTrait>2112 fn parse_rest_of_trait( 2113 input: ParseStream, 2114 outer_attrs: Vec<Attribute>, 2115 vis: Visibility, 2116 unsafety: Option<Token![unsafe]>, 2117 auto_token: Option<Token![auto]>, 2118 trait_token: Token![trait], 2119 ident: Ident, 2120 mut generics: Generics, 2121 ) -> Result<ItemTrait> { 2122 let colon_token: Option<Token![:]> = input.parse()?; 2123 2124 let mut supertraits = Punctuated::new(); 2125 if colon_token.is_some() { 2126 loop { 2127 if input.peek(Token![where]) || input.peek(token::Brace) { 2128 break; 2129 } 2130 supertraits.push_value(input.parse()?); 2131 if input.peek(Token![where]) || input.peek(token::Brace) { 2132 break; 2133 } 2134 supertraits.push_punct(input.parse()?); 2135 } 2136 } 2137 2138 generics.where_clause = input.parse()?; 2139 2140 let content; 2141 let brace_token = braced!(content in input); 2142 let inner_attrs = content.call(Attribute::parse_inner)?; 2143 let mut items = Vec::new(); 2144 while !content.is_empty() { 2145 items.push(content.parse()?); 2146 } 2147 2148 Ok(ItemTrait { 2149 attrs: private::attrs(outer_attrs, inner_attrs), 2150 vis, 2151 unsafety, 2152 auto_token, 2153 trait_token, 2154 ident, 2155 generics, 2156 colon_token, 2157 supertraits, 2158 brace_token, 2159 items, 2160 }) 2161 } 2162 2163 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2164 impl Parse for ItemTraitAlias { parse(input: ParseStream) -> Result<Self>2165 fn parse(input: ParseStream) -> Result<Self> { 2166 let (attrs, vis, trait_token, ident, generics) = parse_start_of_trait_alias(input)?; 2167 parse_rest_of_trait_alias(input, attrs, vis, trait_token, ident, generics) 2168 } 2169 } 2170 parse_start_of_trait_alias( input: ParseStream, ) -> Result<(Vec<Attribute>, Visibility, Token![trait], Ident, Generics)>2171 fn parse_start_of_trait_alias( 2172 input: ParseStream, 2173 ) -> Result<(Vec<Attribute>, Visibility, Token![trait], Ident, Generics)> { 2174 let attrs = input.call(Attribute::parse_outer)?; 2175 let vis: Visibility = input.parse()?; 2176 let trait_token: Token![trait] = input.parse()?; 2177 let ident: Ident = input.parse()?; 2178 let generics: Generics = input.parse()?; 2179 Ok((attrs, vis, trait_token, ident, generics)) 2180 } 2181 parse_rest_of_trait_alias( input: ParseStream, attrs: Vec<Attribute>, vis: Visibility, trait_token: Token![trait], ident: Ident, mut generics: Generics, ) -> Result<ItemTraitAlias>2182 fn parse_rest_of_trait_alias( 2183 input: ParseStream, 2184 attrs: Vec<Attribute>, 2185 vis: Visibility, 2186 trait_token: Token![trait], 2187 ident: Ident, 2188 mut generics: Generics, 2189 ) -> Result<ItemTraitAlias> { 2190 let eq_token: Token![=] = input.parse()?; 2191 2192 let mut bounds = Punctuated::new(); 2193 loop { 2194 if input.peek(Token![where]) || input.peek(Token![;]) { 2195 break; 2196 } 2197 bounds.push_value(input.parse()?); 2198 if input.peek(Token![where]) || input.peek(Token![;]) { 2199 break; 2200 } 2201 bounds.push_punct(input.parse()?); 2202 } 2203 2204 generics.where_clause = input.parse()?; 2205 let semi_token: Token![;] = input.parse()?; 2206 2207 Ok(ItemTraitAlias { 2208 attrs, 2209 vis, 2210 trait_token, 2211 ident, 2212 generics, 2213 eq_token, 2214 bounds, 2215 semi_token, 2216 }) 2217 } 2218 2219 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2220 impl Parse for TraitItem { parse(input: ParseStream) -> Result<Self>2221 fn parse(input: ParseStream) -> Result<Self> { 2222 let begin = input.fork(); 2223 let mut attrs = input.call(Attribute::parse_outer)?; 2224 let vis: Visibility = input.parse()?; 2225 let defaultness: Option<Token![default]> = input.parse()?; 2226 let ahead = input.fork(); 2227 2228 let lookahead = ahead.lookahead1(); 2229 let mut item = if lookahead.peek(Token![fn]) || peek_signature(&ahead) { 2230 input.parse().map(TraitItem::Method) 2231 } else if lookahead.peek(Token![const]) { 2232 ahead.parse::<Token![const]>()?; 2233 let lookahead = ahead.lookahead1(); 2234 if lookahead.peek(Ident) || lookahead.peek(Token![_]) { 2235 input.parse().map(TraitItem::Const) 2236 } else if lookahead.peek(Token![async]) 2237 || lookahead.peek(Token![unsafe]) 2238 || lookahead.peek(Token![extern]) 2239 || lookahead.peek(Token![fn]) 2240 { 2241 input.parse().map(TraitItem::Method) 2242 } else { 2243 Err(lookahead.error()) 2244 } 2245 } else if lookahead.peek(Token![type]) { 2246 parse_trait_item_type(begin.fork(), input) 2247 } else if lookahead.peek(Ident) 2248 || lookahead.peek(Token![self]) 2249 || lookahead.peek(Token![super]) 2250 || lookahead.peek(Token![crate]) 2251 || lookahead.peek(Token![::]) 2252 { 2253 input.parse().map(TraitItem::Macro) 2254 } else { 2255 Err(lookahead.error()) 2256 }?; 2257 2258 match (vis, defaultness) { 2259 (Visibility::Inherited, None) => {} 2260 _ => return Ok(TraitItem::Verbatim(verbatim::between(begin, input))), 2261 } 2262 2263 let item_attrs = match &mut item { 2264 TraitItem::Const(item) => &mut item.attrs, 2265 TraitItem::Method(item) => &mut item.attrs, 2266 TraitItem::Type(item) => &mut item.attrs, 2267 TraitItem::Macro(item) => &mut item.attrs, 2268 TraitItem::Verbatim(_) | TraitItem::__TestExhaustive(_) => unreachable!(), 2269 }; 2270 attrs.extend(item_attrs.drain(..)); 2271 *item_attrs = attrs; 2272 Ok(item) 2273 } 2274 } 2275 2276 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2277 impl Parse for TraitItemConst { parse(input: ParseStream) -> Result<Self>2278 fn parse(input: ParseStream) -> Result<Self> { 2279 Ok(TraitItemConst { 2280 attrs: input.call(Attribute::parse_outer)?, 2281 const_token: input.parse()?, 2282 ident: { 2283 let lookahead = input.lookahead1(); 2284 if lookahead.peek(Ident) || lookahead.peek(Token![_]) { 2285 input.call(Ident::parse_any)? 2286 } else { 2287 return Err(lookahead.error()); 2288 } 2289 }, 2290 colon_token: input.parse()?, 2291 ty: input.parse()?, 2292 default: { 2293 if input.peek(Token![=]) { 2294 let eq_token: Token![=] = input.parse()?; 2295 let default: Expr = input.parse()?; 2296 Some((eq_token, default)) 2297 } else { 2298 None 2299 } 2300 }, 2301 semi_token: input.parse()?, 2302 }) 2303 } 2304 } 2305 2306 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2307 impl Parse for TraitItemMethod { parse(input: ParseStream) -> Result<Self>2308 fn parse(input: ParseStream) -> Result<Self> { 2309 let outer_attrs = input.call(Attribute::parse_outer)?; 2310 let sig: Signature = input.parse()?; 2311 2312 let lookahead = input.lookahead1(); 2313 let (brace_token, inner_attrs, stmts, semi_token) = if lookahead.peek(token::Brace) { 2314 let content; 2315 let brace_token = braced!(content in input); 2316 let inner_attrs = content.call(Attribute::parse_inner)?; 2317 let stmts = content.call(Block::parse_within)?; 2318 (Some(brace_token), inner_attrs, stmts, None) 2319 } else if lookahead.peek(Token![;]) { 2320 let semi_token: Token![;] = input.parse()?; 2321 (None, Vec::new(), Vec::new(), Some(semi_token)) 2322 } else { 2323 return Err(lookahead.error()); 2324 }; 2325 2326 Ok(TraitItemMethod { 2327 attrs: private::attrs(outer_attrs, inner_attrs), 2328 sig, 2329 default: brace_token.map(|brace_token| Block { brace_token, stmts }), 2330 semi_token, 2331 }) 2332 } 2333 } 2334 2335 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2336 impl Parse for TraitItemType { parse(input: ParseStream) -> Result<Self>2337 fn parse(input: ParseStream) -> Result<Self> { 2338 let attrs = input.call(Attribute::parse_outer)?; 2339 let type_token: Token![type] = input.parse()?; 2340 let ident: Ident = input.parse()?; 2341 let mut generics: Generics = input.parse()?; 2342 let colon_token: Option<Token![:]> = input.parse()?; 2343 2344 let mut bounds = Punctuated::new(); 2345 if colon_token.is_some() { 2346 while !input.peek(Token![where]) && !input.peek(Token![=]) && !input.peek(Token![;]) 2347 { 2348 if !bounds.is_empty() { 2349 bounds.push_punct(input.parse()?); 2350 } 2351 bounds.push_value(input.parse()?); 2352 } 2353 } 2354 2355 generics.where_clause = input.parse()?; 2356 let default = if input.peek(Token![=]) { 2357 let eq_token: Token![=] = input.parse()?; 2358 let default: Type = input.parse()?; 2359 Some((eq_token, default)) 2360 } else { 2361 None 2362 }; 2363 let semi_token: Token![;] = input.parse()?; 2364 2365 Ok(TraitItemType { 2366 attrs, 2367 type_token, 2368 ident, 2369 generics, 2370 colon_token, 2371 bounds, 2372 default, 2373 semi_token, 2374 }) 2375 } 2376 } 2377 parse_trait_item_type(begin: ParseBuffer, input: ParseStream) -> Result<TraitItem>2378 fn parse_trait_item_type(begin: ParseBuffer, input: ParseStream) -> Result<TraitItem> { 2379 let FlexibleItemType { 2380 vis, 2381 defaultness, 2382 type_token, 2383 ident, 2384 generics, 2385 colon_token, 2386 bounds, 2387 ty, 2388 semi_token, 2389 } = input.parse()?; 2390 2391 if defaultness.is_some() || vis.is_some() { 2392 Ok(TraitItem::Verbatim(verbatim::between(begin, input))) 2393 } else { 2394 Ok(TraitItem::Type(TraitItemType { 2395 attrs: Vec::new(), 2396 type_token, 2397 ident, 2398 generics, 2399 colon_token, 2400 bounds, 2401 default: ty, 2402 semi_token, 2403 })) 2404 } 2405 } 2406 2407 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2408 impl Parse for TraitItemMacro { parse(input: ParseStream) -> Result<Self>2409 fn parse(input: ParseStream) -> Result<Self> { 2410 let attrs = input.call(Attribute::parse_outer)?; 2411 let mac: Macro = input.parse()?; 2412 let semi_token: Option<Token![;]> = if mac.delimiter.is_brace() { 2413 None 2414 } else { 2415 Some(input.parse()?) 2416 }; 2417 Ok(TraitItemMacro { 2418 attrs, 2419 mac, 2420 semi_token, 2421 }) 2422 } 2423 } 2424 2425 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2426 impl Parse for ItemImpl { parse(input: ParseStream) -> Result<Self>2427 fn parse(input: ParseStream) -> Result<Self> { 2428 let allow_const_impl = false; 2429 parse_impl(input, allow_const_impl).map(Option::unwrap) 2430 } 2431 } 2432 parse_impl(input: ParseStream, allow_const_impl: bool) -> Result<Option<ItemImpl>>2433 fn parse_impl(input: ParseStream, allow_const_impl: bool) -> Result<Option<ItemImpl>> { 2434 let outer_attrs = input.call(Attribute::parse_outer)?; 2435 let defaultness: Option<Token![default]> = input.parse()?; 2436 let unsafety: Option<Token![unsafe]> = input.parse()?; 2437 let impl_token: Token![impl] = input.parse()?; 2438 2439 let has_generics = input.peek(Token![<]) 2440 && (input.peek2(Token![>]) 2441 || input.peek2(Token![#]) 2442 || (input.peek2(Ident) || input.peek2(Lifetime)) 2443 && (input.peek3(Token![:]) 2444 || input.peek3(Token![,]) 2445 || input.peek3(Token![>])) 2446 || input.peek2(Token![const])); 2447 let mut generics: Generics = if has_generics { 2448 input.parse()? 2449 } else { 2450 Generics::default() 2451 }; 2452 2453 let is_const_impl = allow_const_impl 2454 && (input.peek(Token![const]) || input.peek(Token![?]) && input.peek2(Token![const])); 2455 if is_const_impl { 2456 input.parse::<Option<Token![?]>>()?; 2457 input.parse::<Token![const]>()?; 2458 } 2459 2460 let begin = input.fork(); 2461 let polarity = if input.peek(Token![!]) && !input.peek2(token::Brace) { 2462 Some(input.parse::<Token![!]>()?) 2463 } else { 2464 None 2465 }; 2466 2467 let mut first_ty: Type = input.parse()?; 2468 let self_ty: Type; 2469 let trait_; 2470 2471 let is_impl_for = input.peek(Token![for]); 2472 if is_impl_for { 2473 let for_token: Token![for] = input.parse()?; 2474 let mut first_ty_ref = &first_ty; 2475 while let Type::Group(ty) = first_ty_ref { 2476 first_ty_ref = &ty.elem; 2477 } 2478 if let Type::Path(_) = first_ty_ref { 2479 while let Type::Group(ty) = first_ty { 2480 first_ty = *ty.elem; 2481 } 2482 if let Type::Path(TypePath { qself: None, path }) = first_ty { 2483 trait_ = Some((polarity, path, for_token)); 2484 } else { 2485 unreachable!() 2486 } 2487 } else { 2488 trait_ = None; 2489 } 2490 self_ty = input.parse()?; 2491 } else { 2492 trait_ = None; 2493 self_ty = if polarity.is_none() { 2494 first_ty 2495 } else { 2496 Type::Verbatim(verbatim::between(begin, input)) 2497 }; 2498 } 2499 2500 generics.where_clause = input.parse()?; 2501 2502 let content; 2503 let brace_token = braced!(content in input); 2504 let inner_attrs = content.call(Attribute::parse_inner)?; 2505 2506 let mut items = Vec::new(); 2507 while !content.is_empty() { 2508 items.push(content.parse()?); 2509 } 2510 2511 if is_const_impl || is_impl_for && trait_.is_none() { 2512 Ok(None) 2513 } else { 2514 Ok(Some(ItemImpl { 2515 attrs: private::attrs(outer_attrs, inner_attrs), 2516 defaultness, 2517 unsafety, 2518 impl_token, 2519 generics, 2520 trait_, 2521 self_ty: Box::new(self_ty), 2522 brace_token, 2523 items, 2524 })) 2525 } 2526 } 2527 2528 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2529 impl Parse for ImplItem { parse(input: ParseStream) -> Result<Self>2530 fn parse(input: ParseStream) -> Result<Self> { 2531 let begin = input.fork(); 2532 let mut attrs = input.call(Attribute::parse_outer)?; 2533 let ahead = input.fork(); 2534 let vis: Visibility = ahead.parse()?; 2535 2536 let mut lookahead = ahead.lookahead1(); 2537 let defaultness = if lookahead.peek(Token![default]) && !ahead.peek2(Token![!]) { 2538 let defaultness: Token![default] = ahead.parse()?; 2539 lookahead = ahead.lookahead1(); 2540 Some(defaultness) 2541 } else { 2542 None 2543 }; 2544 2545 let mut item = if lookahead.peek(Token![fn]) || peek_signature(&ahead) { 2546 input.parse().map(ImplItem::Method) 2547 } else if lookahead.peek(Token![const]) { 2548 let const_token: Token![const] = ahead.parse()?; 2549 let lookahead = ahead.lookahead1(); 2550 if lookahead.peek(Ident) || lookahead.peek(Token![_]) { 2551 input.advance_to(&ahead); 2552 let ident: Ident = input.call(Ident::parse_any)?; 2553 let colon_token: Token![:] = input.parse()?; 2554 let ty: Type = input.parse()?; 2555 if let Some(eq_token) = input.parse()? { 2556 return Ok(ImplItem::Const(ImplItemConst { 2557 attrs, 2558 vis, 2559 defaultness, 2560 const_token, 2561 ident, 2562 colon_token, 2563 ty, 2564 eq_token, 2565 expr: input.parse()?, 2566 semi_token: input.parse()?, 2567 })); 2568 } else { 2569 input.parse::<Token![;]>()?; 2570 return Ok(ImplItem::Verbatim(verbatim::between(begin, input))); 2571 } 2572 } else { 2573 Err(lookahead.error()) 2574 } 2575 } else if lookahead.peek(Token![type]) { 2576 parse_impl_item_type(begin, input) 2577 } else if vis.is_inherited() && defaultness.is_none() && lookahead.peek(existential) { 2578 input.call(item_existential).map(ImplItem::Verbatim) 2579 } else if vis.is_inherited() 2580 && defaultness.is_none() 2581 && (lookahead.peek(Ident) 2582 || lookahead.peek(Token![self]) 2583 || lookahead.peek(Token![super]) 2584 || lookahead.peek(Token![crate]) 2585 || lookahead.peek(Token![::])) 2586 { 2587 input.parse().map(ImplItem::Macro) 2588 } else { 2589 Err(lookahead.error()) 2590 }?; 2591 2592 { 2593 let item_attrs = match &mut item { 2594 ImplItem::Const(item) => &mut item.attrs, 2595 ImplItem::Method(item) => &mut item.attrs, 2596 ImplItem::Type(item) => &mut item.attrs, 2597 ImplItem::Macro(item) => &mut item.attrs, 2598 ImplItem::Verbatim(_) => return Ok(item), 2599 ImplItem::__TestExhaustive(_) => unreachable!(), 2600 }; 2601 attrs.extend(item_attrs.drain(..)); 2602 *item_attrs = attrs; 2603 } 2604 2605 Ok(item) 2606 } 2607 } 2608 2609 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2610 impl Parse for ImplItemConst { parse(input: ParseStream) -> Result<Self>2611 fn parse(input: ParseStream) -> Result<Self> { 2612 Ok(ImplItemConst { 2613 attrs: input.call(Attribute::parse_outer)?, 2614 vis: input.parse()?, 2615 defaultness: input.parse()?, 2616 const_token: input.parse()?, 2617 ident: { 2618 let lookahead = input.lookahead1(); 2619 if lookahead.peek(Ident) || lookahead.peek(Token![_]) { 2620 input.call(Ident::parse_any)? 2621 } else { 2622 return Err(lookahead.error()); 2623 } 2624 }, 2625 colon_token: input.parse()?, 2626 ty: input.parse()?, 2627 eq_token: input.parse()?, 2628 expr: input.parse()?, 2629 semi_token: input.parse()?, 2630 }) 2631 } 2632 } 2633 2634 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2635 impl Parse for ImplItemMethod { parse(input: ParseStream) -> Result<Self>2636 fn parse(input: ParseStream) -> Result<Self> { 2637 let mut attrs = input.call(Attribute::parse_outer)?; 2638 let vis: Visibility = input.parse()?; 2639 let defaultness: Option<Token![default]> = input.parse()?; 2640 let sig: Signature = input.parse()?; 2641 2642 let block = if let Some(semi) = input.parse::<Option<Token![;]>>()? { 2643 // Accept methods without a body in an impl block because 2644 // rustc's *parser* does not reject them (the compilation error 2645 // is emitted later than parsing) and it can be useful for macro 2646 // DSLs. 2647 let mut punct = Punct::new(';', Spacing::Alone); 2648 punct.set_span(semi.span); 2649 let tokens = TokenStream::from_iter(vec![TokenTree::Punct(punct)]); 2650 Block { 2651 brace_token: Brace::default(), 2652 stmts: vec![Stmt::Item(Item::Verbatim(tokens))], 2653 } 2654 } else { 2655 let content; 2656 let brace_token = braced!(content in input); 2657 attrs.extend(content.call(Attribute::parse_inner)?); 2658 Block { 2659 brace_token, 2660 stmts: content.call(Block::parse_within)?, 2661 } 2662 }; 2663 2664 Ok(ImplItemMethod { 2665 attrs, 2666 vis, 2667 defaultness, 2668 sig, 2669 block, 2670 }) 2671 } 2672 } 2673 2674 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2675 impl Parse for ImplItemType { parse(input: ParseStream) -> Result<Self>2676 fn parse(input: ParseStream) -> Result<Self> { 2677 Ok(ImplItemType { 2678 attrs: input.call(Attribute::parse_outer)?, 2679 vis: input.parse()?, 2680 defaultness: input.parse()?, 2681 type_token: input.parse()?, 2682 ident: input.parse()?, 2683 generics: { 2684 let mut generics: Generics = input.parse()?; 2685 generics.where_clause = input.parse()?; 2686 generics 2687 }, 2688 eq_token: input.parse()?, 2689 ty: input.parse()?, 2690 semi_token: input.parse()?, 2691 }) 2692 } 2693 } 2694 parse_impl_item_type(begin: ParseBuffer, input: ParseStream) -> Result<ImplItem>2695 fn parse_impl_item_type(begin: ParseBuffer, input: ParseStream) -> Result<ImplItem> { 2696 let FlexibleItemType { 2697 vis, 2698 defaultness, 2699 type_token, 2700 ident, 2701 generics, 2702 colon_token, 2703 bounds: _, 2704 ty, 2705 semi_token, 2706 } = input.parse()?; 2707 2708 if colon_token.is_some() || ty.is_none() { 2709 Ok(ImplItem::Verbatim(verbatim::between(begin, input))) 2710 } else { 2711 let (eq_token, ty) = ty.unwrap(); 2712 Ok(ImplItem::Type(ImplItemType { 2713 attrs: Vec::new(), 2714 vis, 2715 defaultness, 2716 type_token, 2717 ident, 2718 generics, 2719 eq_token, 2720 ty, 2721 semi_token, 2722 })) 2723 } 2724 } 2725 2726 #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 2727 impl Parse for ImplItemMacro { parse(input: ParseStream) -> Result<Self>2728 fn parse(input: ParseStream) -> Result<Self> { 2729 let attrs = input.call(Attribute::parse_outer)?; 2730 let mac: Macro = input.parse()?; 2731 let semi_token: Option<Token![;]> = if mac.delimiter.is_brace() { 2732 None 2733 } else { 2734 Some(input.parse()?) 2735 }; 2736 Ok(ImplItemMacro { 2737 attrs, 2738 mac, 2739 semi_token, 2740 }) 2741 } 2742 } 2743 2744 impl Visibility { is_inherited(&self) -> bool2745 fn is_inherited(&self) -> bool { 2746 match *self { 2747 Visibility::Inherited => true, 2748 _ => false, 2749 } 2750 } 2751 } 2752 2753 impl MacroDelimiter { is_brace(&self) -> bool2754 fn is_brace(&self) -> bool { 2755 match *self { 2756 MacroDelimiter::Brace(_) => true, 2757 MacroDelimiter::Paren(_) | MacroDelimiter::Bracket(_) => false, 2758 } 2759 } 2760 } 2761 } 2762 2763 #[cfg(feature = "printing")] 2764 mod printing { 2765 use super::*; 2766 use crate::attr::FilterAttrs; 2767 use crate::print::TokensOrDefault; 2768 use crate::punctuated::Pair; 2769 use proc_macro2::TokenStream; 2770 use quote::{ToTokens, TokenStreamExt}; 2771 2772 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2773 impl ToTokens for ItemExternCrate { to_tokens(&self, tokens: &mut TokenStream)2774 fn to_tokens(&self, tokens: &mut TokenStream) { 2775 tokens.append_all(self.attrs.outer()); 2776 self.vis.to_tokens(tokens); 2777 self.extern_token.to_tokens(tokens); 2778 self.crate_token.to_tokens(tokens); 2779 self.ident.to_tokens(tokens); 2780 if let Some((as_token, rename)) = &self.rename { 2781 as_token.to_tokens(tokens); 2782 rename.to_tokens(tokens); 2783 } 2784 self.semi_token.to_tokens(tokens); 2785 } 2786 } 2787 2788 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2789 impl ToTokens for ItemUse { to_tokens(&self, tokens: &mut TokenStream)2790 fn to_tokens(&self, tokens: &mut TokenStream) { 2791 tokens.append_all(self.attrs.outer()); 2792 self.vis.to_tokens(tokens); 2793 self.use_token.to_tokens(tokens); 2794 self.leading_colon.to_tokens(tokens); 2795 self.tree.to_tokens(tokens); 2796 self.semi_token.to_tokens(tokens); 2797 } 2798 } 2799 2800 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2801 impl ToTokens for ItemStatic { to_tokens(&self, tokens: &mut TokenStream)2802 fn to_tokens(&self, tokens: &mut TokenStream) { 2803 tokens.append_all(self.attrs.outer()); 2804 self.vis.to_tokens(tokens); 2805 self.static_token.to_tokens(tokens); 2806 self.mutability.to_tokens(tokens); 2807 self.ident.to_tokens(tokens); 2808 self.colon_token.to_tokens(tokens); 2809 self.ty.to_tokens(tokens); 2810 self.eq_token.to_tokens(tokens); 2811 self.expr.to_tokens(tokens); 2812 self.semi_token.to_tokens(tokens); 2813 } 2814 } 2815 2816 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2817 impl ToTokens for ItemConst { to_tokens(&self, tokens: &mut TokenStream)2818 fn to_tokens(&self, tokens: &mut TokenStream) { 2819 tokens.append_all(self.attrs.outer()); 2820 self.vis.to_tokens(tokens); 2821 self.const_token.to_tokens(tokens); 2822 self.ident.to_tokens(tokens); 2823 self.colon_token.to_tokens(tokens); 2824 self.ty.to_tokens(tokens); 2825 self.eq_token.to_tokens(tokens); 2826 self.expr.to_tokens(tokens); 2827 self.semi_token.to_tokens(tokens); 2828 } 2829 } 2830 2831 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2832 impl ToTokens for ItemFn { to_tokens(&self, tokens: &mut TokenStream)2833 fn to_tokens(&self, tokens: &mut TokenStream) { 2834 tokens.append_all(self.attrs.outer()); 2835 self.vis.to_tokens(tokens); 2836 self.sig.to_tokens(tokens); 2837 self.block.brace_token.surround(tokens, |tokens| { 2838 tokens.append_all(self.attrs.inner()); 2839 tokens.append_all(&self.block.stmts); 2840 }); 2841 } 2842 } 2843 2844 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2845 impl ToTokens for ItemMod { to_tokens(&self, tokens: &mut TokenStream)2846 fn to_tokens(&self, tokens: &mut TokenStream) { 2847 tokens.append_all(self.attrs.outer()); 2848 self.vis.to_tokens(tokens); 2849 self.mod_token.to_tokens(tokens); 2850 self.ident.to_tokens(tokens); 2851 if let Some((brace, items)) = &self.content { 2852 brace.surround(tokens, |tokens| { 2853 tokens.append_all(self.attrs.inner()); 2854 tokens.append_all(items); 2855 }); 2856 } else { 2857 TokensOrDefault(&self.semi).to_tokens(tokens); 2858 } 2859 } 2860 } 2861 2862 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2863 impl ToTokens for ItemForeignMod { to_tokens(&self, tokens: &mut TokenStream)2864 fn to_tokens(&self, tokens: &mut TokenStream) { 2865 tokens.append_all(self.attrs.outer()); 2866 self.abi.to_tokens(tokens); 2867 self.brace_token.surround(tokens, |tokens| { 2868 tokens.append_all(self.attrs.inner()); 2869 tokens.append_all(&self.items); 2870 }); 2871 } 2872 } 2873 2874 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2875 impl ToTokens for ItemType { to_tokens(&self, tokens: &mut TokenStream)2876 fn to_tokens(&self, tokens: &mut TokenStream) { 2877 tokens.append_all(self.attrs.outer()); 2878 self.vis.to_tokens(tokens); 2879 self.type_token.to_tokens(tokens); 2880 self.ident.to_tokens(tokens); 2881 self.generics.to_tokens(tokens); 2882 self.generics.where_clause.to_tokens(tokens); 2883 self.eq_token.to_tokens(tokens); 2884 self.ty.to_tokens(tokens); 2885 self.semi_token.to_tokens(tokens); 2886 } 2887 } 2888 2889 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2890 impl ToTokens for ItemEnum { to_tokens(&self, tokens: &mut TokenStream)2891 fn to_tokens(&self, tokens: &mut TokenStream) { 2892 tokens.append_all(self.attrs.outer()); 2893 self.vis.to_tokens(tokens); 2894 self.enum_token.to_tokens(tokens); 2895 self.ident.to_tokens(tokens); 2896 self.generics.to_tokens(tokens); 2897 self.generics.where_clause.to_tokens(tokens); 2898 self.brace_token.surround(tokens, |tokens| { 2899 self.variants.to_tokens(tokens); 2900 }); 2901 } 2902 } 2903 2904 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2905 impl ToTokens for ItemStruct { to_tokens(&self, tokens: &mut TokenStream)2906 fn to_tokens(&self, tokens: &mut TokenStream) { 2907 tokens.append_all(self.attrs.outer()); 2908 self.vis.to_tokens(tokens); 2909 self.struct_token.to_tokens(tokens); 2910 self.ident.to_tokens(tokens); 2911 self.generics.to_tokens(tokens); 2912 match &self.fields { 2913 Fields::Named(fields) => { 2914 self.generics.where_clause.to_tokens(tokens); 2915 fields.to_tokens(tokens); 2916 } 2917 Fields::Unnamed(fields) => { 2918 fields.to_tokens(tokens); 2919 self.generics.where_clause.to_tokens(tokens); 2920 TokensOrDefault(&self.semi_token).to_tokens(tokens); 2921 } 2922 Fields::Unit => { 2923 self.generics.where_clause.to_tokens(tokens); 2924 TokensOrDefault(&self.semi_token).to_tokens(tokens); 2925 } 2926 } 2927 } 2928 } 2929 2930 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2931 impl ToTokens for ItemUnion { to_tokens(&self, tokens: &mut TokenStream)2932 fn to_tokens(&self, tokens: &mut TokenStream) { 2933 tokens.append_all(self.attrs.outer()); 2934 self.vis.to_tokens(tokens); 2935 self.union_token.to_tokens(tokens); 2936 self.ident.to_tokens(tokens); 2937 self.generics.to_tokens(tokens); 2938 self.generics.where_clause.to_tokens(tokens); 2939 self.fields.to_tokens(tokens); 2940 } 2941 } 2942 2943 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2944 impl ToTokens for ItemTrait { to_tokens(&self, tokens: &mut TokenStream)2945 fn to_tokens(&self, tokens: &mut TokenStream) { 2946 tokens.append_all(self.attrs.outer()); 2947 self.vis.to_tokens(tokens); 2948 self.unsafety.to_tokens(tokens); 2949 self.auto_token.to_tokens(tokens); 2950 self.trait_token.to_tokens(tokens); 2951 self.ident.to_tokens(tokens); 2952 self.generics.to_tokens(tokens); 2953 if !self.supertraits.is_empty() { 2954 TokensOrDefault(&self.colon_token).to_tokens(tokens); 2955 self.supertraits.to_tokens(tokens); 2956 } 2957 self.generics.where_clause.to_tokens(tokens); 2958 self.brace_token.surround(tokens, |tokens| { 2959 tokens.append_all(self.attrs.inner()); 2960 tokens.append_all(&self.items); 2961 }); 2962 } 2963 } 2964 2965 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2966 impl ToTokens for ItemTraitAlias { to_tokens(&self, tokens: &mut TokenStream)2967 fn to_tokens(&self, tokens: &mut TokenStream) { 2968 tokens.append_all(self.attrs.outer()); 2969 self.vis.to_tokens(tokens); 2970 self.trait_token.to_tokens(tokens); 2971 self.ident.to_tokens(tokens); 2972 self.generics.to_tokens(tokens); 2973 self.eq_token.to_tokens(tokens); 2974 self.bounds.to_tokens(tokens); 2975 self.generics.where_clause.to_tokens(tokens); 2976 self.semi_token.to_tokens(tokens); 2977 } 2978 } 2979 2980 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 2981 impl ToTokens for ItemImpl { to_tokens(&self, tokens: &mut TokenStream)2982 fn to_tokens(&self, tokens: &mut TokenStream) { 2983 tokens.append_all(self.attrs.outer()); 2984 self.defaultness.to_tokens(tokens); 2985 self.unsafety.to_tokens(tokens); 2986 self.impl_token.to_tokens(tokens); 2987 self.generics.to_tokens(tokens); 2988 if let Some((polarity, path, for_token)) = &self.trait_ { 2989 polarity.to_tokens(tokens); 2990 path.to_tokens(tokens); 2991 for_token.to_tokens(tokens); 2992 } 2993 self.self_ty.to_tokens(tokens); 2994 self.generics.where_clause.to_tokens(tokens); 2995 self.brace_token.surround(tokens, |tokens| { 2996 tokens.append_all(self.attrs.inner()); 2997 tokens.append_all(&self.items); 2998 }); 2999 } 3000 } 3001 3002 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3003 impl ToTokens for ItemMacro { to_tokens(&self, tokens: &mut TokenStream)3004 fn to_tokens(&self, tokens: &mut TokenStream) { 3005 tokens.append_all(self.attrs.outer()); 3006 self.mac.path.to_tokens(tokens); 3007 self.mac.bang_token.to_tokens(tokens); 3008 self.ident.to_tokens(tokens); 3009 match &self.mac.delimiter { 3010 MacroDelimiter::Paren(paren) => { 3011 paren.surround(tokens, |tokens| self.mac.tokens.to_tokens(tokens)); 3012 } 3013 MacroDelimiter::Brace(brace) => { 3014 brace.surround(tokens, |tokens| self.mac.tokens.to_tokens(tokens)); 3015 } 3016 MacroDelimiter::Bracket(bracket) => { 3017 bracket.surround(tokens, |tokens| self.mac.tokens.to_tokens(tokens)); 3018 } 3019 } 3020 self.semi_token.to_tokens(tokens); 3021 } 3022 } 3023 3024 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3025 impl ToTokens for ItemMacro2 { to_tokens(&self, tokens: &mut TokenStream)3026 fn to_tokens(&self, tokens: &mut TokenStream) { 3027 tokens.append_all(self.attrs.outer()); 3028 self.vis.to_tokens(tokens); 3029 self.macro_token.to_tokens(tokens); 3030 self.ident.to_tokens(tokens); 3031 self.rules.to_tokens(tokens); 3032 } 3033 } 3034 3035 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3036 impl ToTokens for UsePath { to_tokens(&self, tokens: &mut TokenStream)3037 fn to_tokens(&self, tokens: &mut TokenStream) { 3038 self.ident.to_tokens(tokens); 3039 self.colon2_token.to_tokens(tokens); 3040 self.tree.to_tokens(tokens); 3041 } 3042 } 3043 3044 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3045 impl ToTokens for UseName { to_tokens(&self, tokens: &mut TokenStream)3046 fn to_tokens(&self, tokens: &mut TokenStream) { 3047 self.ident.to_tokens(tokens); 3048 } 3049 } 3050 3051 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3052 impl ToTokens for UseRename { to_tokens(&self, tokens: &mut TokenStream)3053 fn to_tokens(&self, tokens: &mut TokenStream) { 3054 self.ident.to_tokens(tokens); 3055 self.as_token.to_tokens(tokens); 3056 self.rename.to_tokens(tokens); 3057 } 3058 } 3059 3060 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3061 impl ToTokens for UseGlob { to_tokens(&self, tokens: &mut TokenStream)3062 fn to_tokens(&self, tokens: &mut TokenStream) { 3063 self.star_token.to_tokens(tokens); 3064 } 3065 } 3066 3067 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3068 impl ToTokens for UseGroup { to_tokens(&self, tokens: &mut TokenStream)3069 fn to_tokens(&self, tokens: &mut TokenStream) { 3070 self.brace_token.surround(tokens, |tokens| { 3071 self.items.to_tokens(tokens); 3072 }); 3073 } 3074 } 3075 3076 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3077 impl ToTokens for TraitItemConst { to_tokens(&self, tokens: &mut TokenStream)3078 fn to_tokens(&self, tokens: &mut TokenStream) { 3079 tokens.append_all(self.attrs.outer()); 3080 self.const_token.to_tokens(tokens); 3081 self.ident.to_tokens(tokens); 3082 self.colon_token.to_tokens(tokens); 3083 self.ty.to_tokens(tokens); 3084 if let Some((eq_token, default)) = &self.default { 3085 eq_token.to_tokens(tokens); 3086 default.to_tokens(tokens); 3087 } 3088 self.semi_token.to_tokens(tokens); 3089 } 3090 } 3091 3092 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3093 impl ToTokens for TraitItemMethod { to_tokens(&self, tokens: &mut TokenStream)3094 fn to_tokens(&self, tokens: &mut TokenStream) { 3095 tokens.append_all(self.attrs.outer()); 3096 self.sig.to_tokens(tokens); 3097 match &self.default { 3098 Some(block) => { 3099 block.brace_token.surround(tokens, |tokens| { 3100 tokens.append_all(self.attrs.inner()); 3101 tokens.append_all(&block.stmts); 3102 }); 3103 } 3104 None => { 3105 TokensOrDefault(&self.semi_token).to_tokens(tokens); 3106 } 3107 } 3108 } 3109 } 3110 3111 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3112 impl ToTokens for TraitItemType { to_tokens(&self, tokens: &mut TokenStream)3113 fn to_tokens(&self, tokens: &mut TokenStream) { 3114 tokens.append_all(self.attrs.outer()); 3115 self.type_token.to_tokens(tokens); 3116 self.ident.to_tokens(tokens); 3117 self.generics.to_tokens(tokens); 3118 if !self.bounds.is_empty() { 3119 TokensOrDefault(&self.colon_token).to_tokens(tokens); 3120 self.bounds.to_tokens(tokens); 3121 } 3122 self.generics.where_clause.to_tokens(tokens); 3123 if let Some((eq_token, default)) = &self.default { 3124 eq_token.to_tokens(tokens); 3125 default.to_tokens(tokens); 3126 } 3127 self.semi_token.to_tokens(tokens); 3128 } 3129 } 3130 3131 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3132 impl ToTokens for TraitItemMacro { to_tokens(&self, tokens: &mut TokenStream)3133 fn to_tokens(&self, tokens: &mut TokenStream) { 3134 tokens.append_all(self.attrs.outer()); 3135 self.mac.to_tokens(tokens); 3136 self.semi_token.to_tokens(tokens); 3137 } 3138 } 3139 3140 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3141 impl ToTokens for ImplItemConst { to_tokens(&self, tokens: &mut TokenStream)3142 fn to_tokens(&self, tokens: &mut TokenStream) { 3143 tokens.append_all(self.attrs.outer()); 3144 self.vis.to_tokens(tokens); 3145 self.defaultness.to_tokens(tokens); 3146 self.const_token.to_tokens(tokens); 3147 self.ident.to_tokens(tokens); 3148 self.colon_token.to_tokens(tokens); 3149 self.ty.to_tokens(tokens); 3150 self.eq_token.to_tokens(tokens); 3151 self.expr.to_tokens(tokens); 3152 self.semi_token.to_tokens(tokens); 3153 } 3154 } 3155 3156 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3157 impl ToTokens for ImplItemMethod { to_tokens(&self, tokens: &mut TokenStream)3158 fn to_tokens(&self, tokens: &mut TokenStream) { 3159 tokens.append_all(self.attrs.outer()); 3160 self.vis.to_tokens(tokens); 3161 self.defaultness.to_tokens(tokens); 3162 self.sig.to_tokens(tokens); 3163 if self.block.stmts.len() == 1 { 3164 if let Stmt::Item(Item::Verbatim(verbatim)) = &self.block.stmts[0] { 3165 if verbatim.to_string() == ";" { 3166 verbatim.to_tokens(tokens); 3167 return; 3168 } 3169 } 3170 } 3171 self.block.brace_token.surround(tokens, |tokens| { 3172 tokens.append_all(self.attrs.inner()); 3173 tokens.append_all(&self.block.stmts); 3174 }); 3175 } 3176 } 3177 3178 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3179 impl ToTokens for ImplItemType { to_tokens(&self, tokens: &mut TokenStream)3180 fn to_tokens(&self, tokens: &mut TokenStream) { 3181 tokens.append_all(self.attrs.outer()); 3182 self.vis.to_tokens(tokens); 3183 self.defaultness.to_tokens(tokens); 3184 self.type_token.to_tokens(tokens); 3185 self.ident.to_tokens(tokens); 3186 self.generics.to_tokens(tokens); 3187 self.generics.where_clause.to_tokens(tokens); 3188 self.eq_token.to_tokens(tokens); 3189 self.ty.to_tokens(tokens); 3190 self.semi_token.to_tokens(tokens); 3191 } 3192 } 3193 3194 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3195 impl ToTokens for ImplItemMacro { to_tokens(&self, tokens: &mut TokenStream)3196 fn to_tokens(&self, tokens: &mut TokenStream) { 3197 tokens.append_all(self.attrs.outer()); 3198 self.mac.to_tokens(tokens); 3199 self.semi_token.to_tokens(tokens); 3200 } 3201 } 3202 3203 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3204 impl ToTokens for ForeignItemFn { to_tokens(&self, tokens: &mut TokenStream)3205 fn to_tokens(&self, tokens: &mut TokenStream) { 3206 tokens.append_all(self.attrs.outer()); 3207 self.vis.to_tokens(tokens); 3208 self.sig.to_tokens(tokens); 3209 self.semi_token.to_tokens(tokens); 3210 } 3211 } 3212 3213 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3214 impl ToTokens for ForeignItemStatic { to_tokens(&self, tokens: &mut TokenStream)3215 fn to_tokens(&self, tokens: &mut TokenStream) { 3216 tokens.append_all(self.attrs.outer()); 3217 self.vis.to_tokens(tokens); 3218 self.static_token.to_tokens(tokens); 3219 self.mutability.to_tokens(tokens); 3220 self.ident.to_tokens(tokens); 3221 self.colon_token.to_tokens(tokens); 3222 self.ty.to_tokens(tokens); 3223 self.semi_token.to_tokens(tokens); 3224 } 3225 } 3226 3227 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3228 impl ToTokens for ForeignItemType { to_tokens(&self, tokens: &mut TokenStream)3229 fn to_tokens(&self, tokens: &mut TokenStream) { 3230 tokens.append_all(self.attrs.outer()); 3231 self.vis.to_tokens(tokens); 3232 self.type_token.to_tokens(tokens); 3233 self.ident.to_tokens(tokens); 3234 self.semi_token.to_tokens(tokens); 3235 } 3236 } 3237 3238 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3239 impl ToTokens for ForeignItemMacro { to_tokens(&self, tokens: &mut TokenStream)3240 fn to_tokens(&self, tokens: &mut TokenStream) { 3241 tokens.append_all(self.attrs.outer()); 3242 self.mac.to_tokens(tokens); 3243 self.semi_token.to_tokens(tokens); 3244 } 3245 } 3246 maybe_variadic_to_tokens(arg: &FnArg, tokens: &mut TokenStream) -> bool3247 fn maybe_variadic_to_tokens(arg: &FnArg, tokens: &mut TokenStream) -> bool { 3248 let arg = match arg { 3249 FnArg::Typed(arg) => arg, 3250 FnArg::Receiver(receiver) => { 3251 receiver.to_tokens(tokens); 3252 return false; 3253 } 3254 }; 3255 3256 match arg.ty.as_ref() { 3257 Type::Verbatim(ty) if ty.to_string() == "..." => { 3258 match arg.pat.as_ref() { 3259 Pat::Verbatim(pat) if pat.to_string() == "..." => { 3260 tokens.append_all(arg.attrs.outer()); 3261 pat.to_tokens(tokens); 3262 } 3263 _ => arg.to_tokens(tokens), 3264 } 3265 true 3266 } 3267 _ => { 3268 arg.to_tokens(tokens); 3269 false 3270 } 3271 } 3272 } 3273 3274 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3275 impl ToTokens for Signature { to_tokens(&self, tokens: &mut TokenStream)3276 fn to_tokens(&self, tokens: &mut TokenStream) { 3277 self.constness.to_tokens(tokens); 3278 self.asyncness.to_tokens(tokens); 3279 self.unsafety.to_tokens(tokens); 3280 self.abi.to_tokens(tokens); 3281 self.fn_token.to_tokens(tokens); 3282 self.ident.to_tokens(tokens); 3283 self.generics.to_tokens(tokens); 3284 self.paren_token.surround(tokens, |tokens| { 3285 let mut last_is_variadic = false; 3286 for input in self.inputs.pairs() { 3287 match input { 3288 Pair::Punctuated(input, comma) => { 3289 maybe_variadic_to_tokens(input, tokens); 3290 comma.to_tokens(tokens); 3291 } 3292 Pair::End(input) => { 3293 last_is_variadic = maybe_variadic_to_tokens(input, tokens); 3294 } 3295 } 3296 } 3297 if self.variadic.is_some() && !last_is_variadic { 3298 if !self.inputs.empty_or_trailing() { 3299 <Token![,]>::default().to_tokens(tokens); 3300 } 3301 self.variadic.to_tokens(tokens); 3302 } 3303 }); 3304 self.output.to_tokens(tokens); 3305 self.generics.where_clause.to_tokens(tokens); 3306 } 3307 } 3308 3309 #[cfg_attr(doc_cfg, doc(cfg(feature = "printing")))] 3310 impl ToTokens for Receiver { to_tokens(&self, tokens: &mut TokenStream)3311 fn to_tokens(&self, tokens: &mut TokenStream) { 3312 tokens.append_all(self.attrs.outer()); 3313 if let Some((ampersand, lifetime)) = &self.reference { 3314 ampersand.to_tokens(tokens); 3315 lifetime.to_tokens(tokens); 3316 } 3317 self.mutability.to_tokens(tokens); 3318 self.self_token.to_tokens(tokens); 3319 } 3320 } 3321 } 3322