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