1//! Parsing interface for parsing a token stream into a syntax tree node. 2//! 3//! Parsing in Syn is built on parser functions that take in a [`ParseStream`] 4//! and produce a [`Result<T>`] where `T` is some syntax tree node. Underlying 5//! these parser functions is a lower level mechanism built around the 6//! [`Cursor`] type. `Cursor` is a cheaply copyable cursor over a range of 7//! tokens in a token stream. 8//! 9//! [`Result<T>`]: Result 10//! [`Cursor`]: crate::buffer::Cursor 11//! 12//! # Example 13//! 14//! Here is a snippet of parsing code to get a feel for the style of the 15//! library. We define data structures for a subset of Rust syntax including 16//! enums (not shown) and structs, then provide implementations of the [`Parse`] 17//! trait to parse these syntax tree data structures from a token stream. 18//! 19//! Once `Parse` impls have been defined, they can be called conveniently from a 20//! procedural macro through [`parse_macro_input!`] as shown at the bottom of 21//! the snippet. If the caller provides syntactically invalid input to the 22//! procedural macro, they will receive a helpful compiler error message 23//! pointing out the exact token that triggered the failure to parse. 24//! 25//! [`parse_macro_input!`]: crate::parse_macro_input! 26//! 27//! ``` 28//! # extern crate proc_macro; 29//! # 30//! use proc_macro::TokenStream; 31//! use syn::{braced, parse_macro_input, token, Field, Ident, Result, Token}; 32//! use syn::parse::{Parse, ParseStream}; 33//! use syn::punctuated::Punctuated; 34//! 35//! enum Item { 36//! Struct(ItemStruct), 37//! Enum(ItemEnum), 38//! } 39//! 40//! struct ItemStruct { 41//! struct_token: Token![struct], 42//! ident: Ident, 43//! brace_token: token::Brace, 44//! fields: Punctuated<Field, Token![,]>, 45//! } 46//! # 47//! # enum ItemEnum {} 48//! 49//! impl Parse for Item { 50//! fn parse(input: ParseStream) -> Result<Self> { 51//! let lookahead = input.lookahead1(); 52//! if lookahead.peek(Token![struct]) { 53//! input.parse().map(Item::Struct) 54//! } else if lookahead.peek(Token![enum]) { 55//! input.parse().map(Item::Enum) 56//! } else { 57//! Err(lookahead.error()) 58//! } 59//! } 60//! } 61//! 62//! impl Parse for ItemStruct { 63//! fn parse(input: ParseStream) -> Result<Self> { 64//! let content; 65//! Ok(ItemStruct { 66//! struct_token: input.parse()?, 67//! ident: input.parse()?, 68//! brace_token: braced!(content in input), 69//! fields: content.parse_terminated(Field::parse_named, Token![,])?, 70//! }) 71//! } 72//! } 73//! # 74//! # impl Parse for ItemEnum { 75//! # fn parse(input: ParseStream) -> Result<Self> { 76//! # unimplemented!() 77//! # } 78//! # } 79//! 80//! # const IGNORE: &str = stringify! { 81//! #[proc_macro] 82//! # }; 83//! pub fn my_macro(tokens: TokenStream) -> TokenStream { 84//! let input = parse_macro_input!(tokens as Item); 85//! 86//! /* ... */ 87//! # TokenStream::new() 88//! } 89//! ``` 90//! 91//! # The `syn::parse*` functions 92//! 93//! The [`syn::parse`], [`syn::parse2`], and [`syn::parse_str`] functions serve 94//! as an entry point for parsing syntax tree nodes that can be parsed in an 95//! obvious default way. These functions can return any syntax tree node that 96//! implements the [`Parse`] trait, which includes most types in Syn. 97//! 98//! [`syn::parse`]: crate::parse() 99//! [`syn::parse2`]: crate::parse2() 100//! [`syn::parse_str`]: crate::parse_str() 101//! 102//! ``` 103//! use syn::Type; 104//! 105//! # fn run_parser() -> syn::Result<()> { 106//! let t: Type = syn::parse_str("std::collections::HashMap<String, Value>")?; 107//! # Ok(()) 108//! # } 109//! # 110//! # run_parser().unwrap(); 111//! ``` 112//! 113//! The [`parse_quote!`] macro also uses this approach. 114//! 115//! [`parse_quote!`]: crate::parse_quote! 116//! 117//! # The `Parser` trait 118//! 119//! Some types can be parsed in several ways depending on context. For example 120//! an [`Attribute`] can be either "outer" like `#[...]` or "inner" like 121//! `#![...]` and parsing the wrong one would be a bug. Similarly [`Punctuated`] 122//! may or may not allow trailing punctuation, and parsing it the wrong way 123//! would either reject valid input or accept invalid input. 124//! 125//! [`Attribute`]: crate::Attribute 126//! [`Punctuated`]: crate::punctuated 127//! 128//! The `Parse` trait is not implemented in these cases because there is no good 129//! behavior to consider the default. 130//! 131//! ```compile_fail 132//! # extern crate proc_macro; 133//! # 134//! # use syn::punctuated::Punctuated; 135//! # use syn::{PathSegment, Result, Token}; 136//! # 137//! # fn f(tokens: proc_macro::TokenStream) -> Result<()> { 138//! # 139//! // Can't parse `Punctuated` without knowing whether trailing punctuation 140//! // should be allowed in this context. 141//! let path: Punctuated<PathSegment, Token![::]> = syn::parse(tokens)?; 142//! # 143//! # Ok(()) 144//! # } 145//! ``` 146//! 147//! In these cases the types provide a choice of parser functions rather than a 148//! single `Parse` implementation, and those parser functions can be invoked 149//! through the [`Parser`] trait. 150//! 151//! 152//! ``` 153//! # extern crate proc_macro; 154//! # 155//! use proc_macro::TokenStream; 156//! use syn::parse::Parser; 157//! use syn::punctuated::Punctuated; 158//! use syn::{Attribute, Expr, PathSegment, Result, Token}; 159//! 160//! fn call_some_parser_methods(input: TokenStream) -> Result<()> { 161//! // Parse a nonempty sequence of path segments separated by `::` punctuation 162//! // with no trailing punctuation. 163//! let tokens = input.clone(); 164//! let parser = Punctuated::<PathSegment, Token![::]>::parse_separated_nonempty; 165//! let _path = parser.parse(tokens)?; 166//! 167//! // Parse a possibly empty sequence of expressions terminated by commas with 168//! // an optional trailing punctuation. 169//! let tokens = input.clone(); 170//! let parser = Punctuated::<Expr, Token![,]>::parse_terminated; 171//! let _args = parser.parse(tokens)?; 172//! 173//! // Parse zero or more outer attributes but not inner attributes. 174//! let tokens = input.clone(); 175//! let parser = Attribute::parse_outer; 176//! let _attrs = parser.parse(tokens)?; 177//! 178//! Ok(()) 179//! } 180//! ``` 181 182#[path = "discouraged.rs"] 183pub mod discouraged; 184 185use crate::buffer::{Cursor, TokenBuffer}; 186use crate::error; 187use crate::lookahead; 188#[cfg(feature = "proc-macro")] 189use crate::proc_macro; 190use crate::punctuated::Punctuated; 191use crate::token::Token; 192use proc_macro2::{self, Delimiter, Group, Literal, Punct, Span, TokenStream, TokenTree}; 193use std::cell::Cell; 194use std::fmt::{self, Debug, Display}; 195#[cfg(feature = "extra-traits")] 196use std::hash::{Hash, Hasher}; 197use std::marker::PhantomData; 198use std::mem; 199use std::ops::Deref; 200use std::rc::Rc; 201use std::str::FromStr; 202 203pub use crate::error::{Error, Result}; 204pub use crate::lookahead::{Lookahead1, Peek}; 205 206/// Parsing interface implemented by all types that can be parsed in a default 207/// way from a token stream. 208/// 209/// Refer to the [module documentation] for details about implementing and using 210/// the `Parse` trait. 211/// 212/// [module documentation]: self 213pub trait Parse: Sized { 214 fn parse(input: ParseStream) -> Result<Self>; 215} 216 217/// Input to a Syn parser function. 218/// 219/// See the methods of this type under the documentation of [`ParseBuffer`]. For 220/// an overview of parsing in Syn, refer to the [module documentation]. 221/// 222/// [module documentation]: self 223pub type ParseStream<'a> = &'a ParseBuffer<'a>; 224 225/// Cursor position within a buffered token stream. 226/// 227/// This type is more commonly used through the type alias [`ParseStream`] which 228/// is an alias for `&ParseBuffer`. 229/// 230/// `ParseStream` is the input type for all parser functions in Syn. They have 231/// the signature `fn(ParseStream) -> Result<T>`. 232/// 233/// ## Calling a parser function 234/// 235/// There is no public way to construct a `ParseBuffer`. Instead, if you are 236/// looking to invoke a parser function that requires `ParseStream` as input, 237/// you will need to go through one of the public parsing entry points. 238/// 239/// - The [`parse_macro_input!`] macro if parsing input of a procedural macro; 240/// - One of [the `syn::parse*` functions][syn-parse]; or 241/// - A method of the [`Parser`] trait. 242/// 243/// [`parse_macro_input!`]: crate::parse_macro_input! 244/// [syn-parse]: self#the-synparse-functions 245pub struct ParseBuffer<'a> { 246 scope: Span, 247 // Instead of Cell<Cursor<'a>> so that ParseBuffer<'a> is covariant in 'a. 248 // The rest of the code in this module needs to be careful that only a 249 // cursor derived from this `cell` is ever assigned to this `cell`. 250 // 251 // Cell<Cursor<'a>> cannot be covariant in 'a because then we could take a 252 // ParseBuffer<'a>, upcast to ParseBuffer<'short> for some lifetime shorter 253 // than 'a, and then assign a Cursor<'short> into the Cell. 254 // 255 // By extension, it would not be safe to expose an API that accepts a 256 // Cursor<'a> and trusts that it lives as long as the cursor currently in 257 // the cell. 258 cell: Cell<Cursor<'static>>, 259 marker: PhantomData<Cursor<'a>>, 260 unexpected: Cell<Option<Rc<Cell<Unexpected>>>>, 261} 262 263impl<'a> Drop for ParseBuffer<'a> { 264 fn drop(&mut self) { 265 if let Some(unexpected_span) = span_of_unexpected_ignoring_nones(self.cursor()) { 266 let (inner, old_span) = inner_unexpected(self); 267 if old_span.is_none() { 268 inner.set(Unexpected::Some(unexpected_span)); 269 } 270 } 271 } 272} 273 274impl<'a> Display for ParseBuffer<'a> { 275 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 276 Display::fmt(&self.cursor().token_stream(), f) 277 } 278} 279 280impl<'a> Debug for ParseBuffer<'a> { 281 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 282 Debug::fmt(&self.cursor().token_stream(), f) 283 } 284} 285 286/// Cursor state associated with speculative parsing. 287/// 288/// This type is the input of the closure provided to [`ParseStream::step`]. 289/// 290/// [`ParseStream::step`]: ParseBuffer::step 291/// 292/// # Example 293/// 294/// ``` 295/// use proc_macro2::TokenTree; 296/// use syn::Result; 297/// use syn::parse::ParseStream; 298/// 299/// // This function advances the stream past the next occurrence of `@`. If 300/// // no `@` is present in the stream, the stream position is unchanged and 301/// // an error is returned. 302/// fn skip_past_next_at(input: ParseStream) -> Result<()> { 303/// input.step(|cursor| { 304/// let mut rest = *cursor; 305/// while let Some((tt, next)) = rest.token_tree() { 306/// match &tt { 307/// TokenTree::Punct(punct) if punct.as_char() == '@' => { 308/// return Ok(((), next)); 309/// } 310/// _ => rest = next, 311/// } 312/// } 313/// Err(cursor.error("no `@` was found after this point")) 314/// }) 315/// } 316/// # 317/// # fn remainder_after_skipping_past_next_at( 318/// # input: ParseStream, 319/// # ) -> Result<proc_macro2::TokenStream> { 320/// # skip_past_next_at(input)?; 321/// # input.parse() 322/// # } 323/// # 324/// # use syn::parse::Parser; 325/// # let remainder = remainder_after_skipping_past_next_at 326/// # .parse_str("a @ b c") 327/// # .unwrap(); 328/// # assert_eq!(remainder.to_string(), "b c"); 329/// ``` 330pub struct StepCursor<'c, 'a> { 331 scope: Span, 332 // This field is covariant in 'c. 333 cursor: Cursor<'c>, 334 // This field is contravariant in 'c. Together these make StepCursor 335 // invariant in 'c. Also covariant in 'a. The user cannot cast 'c to a 336 // different lifetime but can upcast into a StepCursor with a shorter 337 // lifetime 'a. 338 // 339 // As long as we only ever construct a StepCursor for which 'c outlives 'a, 340 // this means if ever a StepCursor<'c, 'a> exists we are guaranteed that 'c 341 // outlives 'a. 342 marker: PhantomData<fn(Cursor<'c>) -> Cursor<'a>>, 343} 344 345impl<'c, 'a> Deref for StepCursor<'c, 'a> { 346 type Target = Cursor<'c>; 347 348 fn deref(&self) -> &Self::Target { 349 &self.cursor 350 } 351} 352 353impl<'c, 'a> Copy for StepCursor<'c, 'a> {} 354 355impl<'c, 'a> Clone for StepCursor<'c, 'a> { 356 fn clone(&self) -> Self { 357 *self 358 } 359} 360 361impl<'c, 'a> StepCursor<'c, 'a> { 362 /// Triggers an error at the current position of the parse stream. 363 /// 364 /// The `ParseStream::step` invocation will return this same error without 365 /// advancing the stream state. 366 pub fn error<T: Display>(self, message: T) -> Error { 367 error::new_at(self.scope, self.cursor, message) 368 } 369} 370 371pub(crate) fn advance_step_cursor<'c, 'a>(proof: StepCursor<'c, 'a>, to: Cursor<'c>) -> Cursor<'a> { 372 // Refer to the comments within the StepCursor definition. We use the 373 // fact that a StepCursor<'c, 'a> exists as proof that 'c outlives 'a. 374 // Cursor is covariant in its lifetime parameter so we can cast a 375 // Cursor<'c> to one with the shorter lifetime Cursor<'a>. 376 let _ = proof; 377 unsafe { mem::transmute::<Cursor<'c>, Cursor<'a>>(to) } 378} 379 380pub(crate) fn new_parse_buffer( 381 scope: Span, 382 cursor: Cursor, 383 unexpected: Rc<Cell<Unexpected>>, 384) -> ParseBuffer { 385 ParseBuffer { 386 scope, 387 // See comment on `cell` in the struct definition. 388 cell: Cell::new(unsafe { mem::transmute::<Cursor, Cursor<'static>>(cursor) }), 389 marker: PhantomData, 390 unexpected: Cell::new(Some(unexpected)), 391 } 392} 393 394pub(crate) enum Unexpected { 395 None, 396 Some(Span), 397 Chain(Rc<Cell<Unexpected>>), 398} 399 400impl Default for Unexpected { 401 fn default() -> Self { 402 Unexpected::None 403 } 404} 405 406impl Clone for Unexpected { 407 fn clone(&self) -> Self { 408 match self { 409 Unexpected::None => Unexpected::None, 410 Unexpected::Some(span) => Unexpected::Some(*span), 411 Unexpected::Chain(next) => Unexpected::Chain(next.clone()), 412 } 413 } 414} 415 416// We call this on Cell<Unexpected> and Cell<Option<T>> where temporarily 417// swapping in a None is cheap. 418fn cell_clone<T: Default + Clone>(cell: &Cell<T>) -> T { 419 let prev = cell.take(); 420 let ret = prev.clone(); 421 cell.set(prev); 422 ret 423} 424 425fn inner_unexpected(buffer: &ParseBuffer) -> (Rc<Cell<Unexpected>>, Option<Span>) { 426 let mut unexpected = get_unexpected(buffer); 427 loop { 428 match cell_clone(&unexpected) { 429 Unexpected::None => return (unexpected, None), 430 Unexpected::Some(span) => return (unexpected, Some(span)), 431 Unexpected::Chain(next) => unexpected = next, 432 } 433 } 434} 435 436pub(crate) fn get_unexpected(buffer: &ParseBuffer) -> Rc<Cell<Unexpected>> { 437 cell_clone(&buffer.unexpected).unwrap() 438} 439 440fn span_of_unexpected_ignoring_nones(mut cursor: Cursor) -> Option<Span> { 441 if cursor.eof() { 442 return None; 443 } 444 while let Some((inner, _span, rest)) = cursor.group(Delimiter::None) { 445 if let Some(unexpected) = span_of_unexpected_ignoring_nones(inner) { 446 return Some(unexpected); 447 } 448 cursor = rest; 449 } 450 if cursor.eof() { 451 None 452 } else { 453 Some(cursor.span()) 454 } 455} 456 457impl<'a> ParseBuffer<'a> { 458 /// Parses a syntax tree node of type `T`, advancing the position of our 459 /// parse stream past it. 460 pub fn parse<T: Parse>(&self) -> Result<T> { 461 T::parse(self) 462 } 463 464 /// Calls the given parser function to parse a syntax tree node of type `T` 465 /// from this stream. 466 /// 467 /// # Example 468 /// 469 /// The parser below invokes [`Attribute::parse_outer`] to parse a vector of 470 /// zero or more outer attributes. 471 /// 472 /// [`Attribute::parse_outer`]: crate::Attribute::parse_outer 473 /// 474 /// ``` 475 /// use syn::{Attribute, Ident, Result, Token}; 476 /// use syn::parse::{Parse, ParseStream}; 477 /// 478 /// // Parses a unit struct with attributes. 479 /// // 480 /// // #[path = "s.tmpl"] 481 /// // struct S; 482 /// struct UnitStruct { 483 /// attrs: Vec<Attribute>, 484 /// struct_token: Token![struct], 485 /// name: Ident, 486 /// semi_token: Token![;], 487 /// } 488 /// 489 /// impl Parse for UnitStruct { 490 /// fn parse(input: ParseStream) -> Result<Self> { 491 /// Ok(UnitStruct { 492 /// attrs: input.call(Attribute::parse_outer)?, 493 /// struct_token: input.parse()?, 494 /// name: input.parse()?, 495 /// semi_token: input.parse()?, 496 /// }) 497 /// } 498 /// } 499 /// ``` 500 pub fn call<T>(&self, function: fn(ParseStream) -> Result<T>) -> Result<T> { 501 function(self) 502 } 503 504 /// Looks at the next token in the parse stream to determine whether it 505 /// matches the requested type of token. 506 /// 507 /// Does not advance the position of the parse stream. 508 /// 509 /// # Syntax 510 /// 511 /// Note that this method does not use turbofish syntax. Pass the peek type 512 /// inside of parentheses. 513 /// 514 /// - `input.peek(Token![struct])` 515 /// - `input.peek(Token![==])` 516 /// - `input.peek(syn::Ident)` *(does not accept keywords)* 517 /// - `input.peek(syn::Ident::peek_any)` 518 /// - `input.peek(Lifetime)` 519 /// - `input.peek(token::Brace)` 520 /// 521 /// # Example 522 /// 523 /// In this example we finish parsing the list of supertraits when the next 524 /// token in the input is either `where` or an opening curly brace. 525 /// 526 /// ``` 527 /// use syn::{braced, token, Generics, Ident, Result, Token, TypeParamBound}; 528 /// use syn::parse::{Parse, ParseStream}; 529 /// use syn::punctuated::Punctuated; 530 /// 531 /// // Parses a trait definition containing no associated items. 532 /// // 533 /// // trait Marker<'de, T>: A + B<'de> where Box<T>: Clone {} 534 /// struct MarkerTrait { 535 /// trait_token: Token![trait], 536 /// ident: Ident, 537 /// generics: Generics, 538 /// colon_token: Option<Token![:]>, 539 /// supertraits: Punctuated<TypeParamBound, Token![+]>, 540 /// brace_token: token::Brace, 541 /// } 542 /// 543 /// impl Parse for MarkerTrait { 544 /// fn parse(input: ParseStream) -> Result<Self> { 545 /// let trait_token: Token![trait] = input.parse()?; 546 /// let ident: Ident = input.parse()?; 547 /// let mut generics: Generics = input.parse()?; 548 /// let colon_token: Option<Token![:]> = input.parse()?; 549 /// 550 /// let mut supertraits = Punctuated::new(); 551 /// if colon_token.is_some() { 552 /// loop { 553 /// supertraits.push_value(input.parse()?); 554 /// if input.peek(Token![where]) || input.peek(token::Brace) { 555 /// break; 556 /// } 557 /// supertraits.push_punct(input.parse()?); 558 /// } 559 /// } 560 /// 561 /// generics.where_clause = input.parse()?; 562 /// let content; 563 /// let empty_brace_token = braced!(content in input); 564 /// 565 /// Ok(MarkerTrait { 566 /// trait_token, 567 /// ident, 568 /// generics, 569 /// colon_token, 570 /// supertraits, 571 /// brace_token: empty_brace_token, 572 /// }) 573 /// } 574 /// } 575 /// ``` 576 pub fn peek<T: Peek>(&self, token: T) -> bool { 577 let _ = token; 578 T::Token::peek(self.cursor()) 579 } 580 581 /// Looks at the second-next token in the parse stream. 582 /// 583 /// This is commonly useful as a way to implement contextual keywords. 584 /// 585 /// # Example 586 /// 587 /// This example needs to use `peek2` because the symbol `union` is not a 588 /// keyword in Rust. We can't use just `peek` and decide to parse a union if 589 /// the very next token is `union`, because someone is free to write a `mod 590 /// union` and a macro invocation that looks like `union::some_macro! { ... 591 /// }`. In other words `union` is a contextual keyword. 592 /// 593 /// ``` 594 /// use syn::{Ident, ItemUnion, Macro, Result, Token}; 595 /// use syn::parse::{Parse, ParseStream}; 596 /// 597 /// // Parses either a union or a macro invocation. 598 /// enum UnionOrMacro { 599 /// // union MaybeUninit<T> { uninit: (), value: T } 600 /// Union(ItemUnion), 601 /// // lazy_static! { ... } 602 /// Macro(Macro), 603 /// } 604 /// 605 /// impl Parse for UnionOrMacro { 606 /// fn parse(input: ParseStream) -> Result<Self> { 607 /// if input.peek(Token![union]) && input.peek2(Ident) { 608 /// input.parse().map(UnionOrMacro::Union) 609 /// } else { 610 /// input.parse().map(UnionOrMacro::Macro) 611 /// } 612 /// } 613 /// } 614 /// ``` 615 pub fn peek2<T: Peek>(&self, token: T) -> bool { 616 fn peek2(buffer: &ParseBuffer, peek: fn(Cursor) -> bool) -> bool { 617 if let Some(group) = buffer.cursor().group(Delimiter::None) { 618 if group.0.skip().map_or(false, peek) { 619 return true; 620 } 621 } 622 buffer.cursor().skip().map_or(false, peek) 623 } 624 625 let _ = token; 626 peek2(self, T::Token::peek) 627 } 628 629 /// Looks at the third-next token in the parse stream. 630 pub fn peek3<T: Peek>(&self, token: T) -> bool { 631 fn peek3(buffer: &ParseBuffer, peek: fn(Cursor) -> bool) -> bool { 632 if let Some(group) = buffer.cursor().group(Delimiter::None) { 633 if group.0.skip().and_then(Cursor::skip).map_or(false, peek) { 634 return true; 635 } 636 } 637 buffer 638 .cursor() 639 .skip() 640 .and_then(Cursor::skip) 641 .map_or(false, peek) 642 } 643 644 let _ = token; 645 peek3(self, T::Token::peek) 646 } 647 648 /// Parses zero or more occurrences of `T` separated by punctuation of type 649 /// `P`, with optional trailing punctuation. 650 /// 651 /// Parsing continues until the end of this parse stream. The entire content 652 /// of this parse stream must consist of `T` and `P`. 653 /// 654 /// # Example 655 /// 656 /// ``` 657 /// # use quote::quote; 658 /// # 659 /// use syn::{parenthesized, token, Ident, Result, Token, Type}; 660 /// use syn::parse::{Parse, ParseStream}; 661 /// use syn::punctuated::Punctuated; 662 /// 663 /// // Parse a simplified tuple struct syntax like: 664 /// // 665 /// // struct S(A, B); 666 /// struct TupleStruct { 667 /// struct_token: Token![struct], 668 /// ident: Ident, 669 /// paren_token: token::Paren, 670 /// fields: Punctuated<Type, Token![,]>, 671 /// semi_token: Token![;], 672 /// } 673 /// 674 /// impl Parse for TupleStruct { 675 /// fn parse(input: ParseStream) -> Result<Self> { 676 /// let content; 677 /// Ok(TupleStruct { 678 /// struct_token: input.parse()?, 679 /// ident: input.parse()?, 680 /// paren_token: parenthesized!(content in input), 681 /// fields: content.parse_terminated(Type::parse, Token![,])?, 682 /// semi_token: input.parse()?, 683 /// }) 684 /// } 685 /// } 686 /// # 687 /// # let input = quote! { 688 /// # struct S(A, B); 689 /// # }; 690 /// # syn::parse2::<TupleStruct>(input).unwrap(); 691 /// ``` 692 /// 693 /// # See also 694 /// 695 /// If your separator is anything more complicated than an invocation of the 696 /// `Token!` macro, this method won't be applicable and you can instead 697 /// directly use `Punctuated`'s parser functions: [`parse_terminated`], 698 /// [`parse_separated_nonempty`] etc. 699 /// 700 /// [`parse_terminated`]: Punctuated::parse_terminated 701 /// [`parse_separated_nonempty`]: Punctuated::parse_separated_nonempty 702 /// 703 /// ``` 704 /// use syn::{custom_keyword, Expr, Result, Token}; 705 /// use syn::parse::{Parse, ParseStream}; 706 /// use syn::punctuated::Punctuated; 707 /// 708 /// mod kw { 709 /// syn::custom_keyword!(fin); 710 /// } 711 /// 712 /// struct Fin(kw::fin, Token![;]); 713 /// 714 /// impl Parse for Fin { 715 /// fn parse(input: ParseStream) -> Result<Self> { 716 /// Ok(Self(input.parse()?, input.parse()?)) 717 /// } 718 /// } 719 /// 720 /// struct Thing { 721 /// steps: Punctuated<Expr, Fin>, 722 /// } 723 /// 724 /// impl Parse for Thing { 725 /// fn parse(input: ParseStream) -> Result<Self> { 726 /// # if true { 727 /// Ok(Thing { 728 /// steps: Punctuated::parse_terminated(input)?, 729 /// }) 730 /// # } else { 731 /// // or equivalently, this means the same thing: 732 /// # Ok(Thing { 733 /// steps: input.call(Punctuated::parse_terminated)?, 734 /// # }) 735 /// # } 736 /// } 737 /// } 738 /// ``` 739 pub fn parse_terminated<T, P>( 740 &self, 741 parser: fn(ParseStream) -> Result<T>, 742 separator: P, 743 ) -> Result<Punctuated<T, P::Token>> 744 where 745 P: Peek, 746 P::Token: Parse, 747 { 748 let _ = separator; 749 Punctuated::parse_terminated_with(self, parser) 750 } 751 752 /// Returns whether there are tokens remaining in this stream. 753 /// 754 /// This method returns true at the end of the content of a set of 755 /// delimiters, as well as at the very end of the complete macro input. 756 /// 757 /// # Example 758 /// 759 /// ``` 760 /// use syn::{braced, token, Ident, Item, Result, Token}; 761 /// use syn::parse::{Parse, ParseStream}; 762 /// 763 /// // Parses a Rust `mod m { ... }` containing zero or more items. 764 /// struct Mod { 765 /// mod_token: Token![mod], 766 /// name: Ident, 767 /// brace_token: token::Brace, 768 /// items: Vec<Item>, 769 /// } 770 /// 771 /// impl Parse for Mod { 772 /// fn parse(input: ParseStream) -> Result<Self> { 773 /// let content; 774 /// Ok(Mod { 775 /// mod_token: input.parse()?, 776 /// name: input.parse()?, 777 /// brace_token: braced!(content in input), 778 /// items: { 779 /// let mut items = Vec::new(); 780 /// while !content.is_empty() { 781 /// items.push(content.parse()?); 782 /// } 783 /// items 784 /// }, 785 /// }) 786 /// } 787 /// } 788 /// ``` 789 pub fn is_empty(&self) -> bool { 790 self.cursor().eof() 791 } 792 793 /// Constructs a helper for peeking at the next token in this stream and 794 /// building an error message if it is not one of a set of expected tokens. 795 /// 796 /// # Example 797 /// 798 /// ``` 799 /// use syn::{ConstParam, Ident, Lifetime, LifetimeParam, Result, Token, TypeParam}; 800 /// use syn::parse::{Parse, ParseStream}; 801 /// 802 /// // A generic parameter, a single one of the comma-separated elements inside 803 /// // angle brackets in: 804 /// // 805 /// // fn f<T: Clone, 'a, 'b: 'a, const N: usize>() { ... } 806 /// // 807 /// // On invalid input, lookahead gives us a reasonable error message. 808 /// // 809 /// // error: expected one of: identifier, lifetime, `const` 810 /// // | 811 /// // 5 | fn f<!Sized>() {} 812 /// // | ^ 813 /// enum GenericParam { 814 /// Type(TypeParam), 815 /// Lifetime(LifetimeParam), 816 /// Const(ConstParam), 817 /// } 818 /// 819 /// impl Parse for GenericParam { 820 /// fn parse(input: ParseStream) -> Result<Self> { 821 /// let lookahead = input.lookahead1(); 822 /// if lookahead.peek(Ident) { 823 /// input.parse().map(GenericParam::Type) 824 /// } else if lookahead.peek(Lifetime) { 825 /// input.parse().map(GenericParam::Lifetime) 826 /// } else if lookahead.peek(Token![const]) { 827 /// input.parse().map(GenericParam::Const) 828 /// } else { 829 /// Err(lookahead.error()) 830 /// } 831 /// } 832 /// } 833 /// ``` 834 pub fn lookahead1(&self) -> Lookahead1<'a> { 835 lookahead::new(self.scope, self.cursor()) 836 } 837 838 /// Forks a parse stream so that parsing tokens out of either the original 839 /// or the fork does not advance the position of the other. 840 /// 841 /// # Performance 842 /// 843 /// Forking a parse stream is a cheap fixed amount of work and does not 844 /// involve copying token buffers. Where you might hit performance problems 845 /// is if your macro ends up parsing a large amount of content more than 846 /// once. 847 /// 848 /// ``` 849 /// # use syn::{Expr, Result}; 850 /// # use syn::parse::ParseStream; 851 /// # 852 /// # fn bad(input: ParseStream) -> Result<Expr> { 853 /// // Do not do this. 854 /// if input.fork().parse::<Expr>().is_ok() { 855 /// return input.parse::<Expr>(); 856 /// } 857 /// # unimplemented!() 858 /// # } 859 /// ``` 860 /// 861 /// As a rule, avoid parsing an unbounded amount of tokens out of a forked 862 /// parse stream. Only use a fork when the amount of work performed against 863 /// the fork is small and bounded. 864 /// 865 /// When complex speculative parsing against the forked stream is 866 /// unavoidable, use [`parse::discouraged::Speculative`] to advance the 867 /// original stream once the fork's parse is determined to have been 868 /// successful. 869 /// 870 /// For a lower level way to perform speculative parsing at the token level, 871 /// consider using [`ParseStream::step`] instead. 872 /// 873 /// [`parse::discouraged::Speculative`]: discouraged::Speculative 874 /// [`ParseStream::step`]: ParseBuffer::step 875 /// 876 /// # Example 877 /// 878 /// The parse implementation shown here parses possibly restricted `pub` 879 /// visibilities. 880 /// 881 /// - `pub` 882 /// - `pub(crate)` 883 /// - `pub(self)` 884 /// - `pub(super)` 885 /// - `pub(in some::path)` 886 /// 887 /// To handle the case of visibilities inside of tuple structs, the parser 888 /// needs to distinguish parentheses that specify visibility restrictions 889 /// from parentheses that form part of a tuple type. 890 /// 891 /// ``` 892 /// # struct A; 893 /// # struct B; 894 /// # struct C; 895 /// # 896 /// struct S(pub(crate) A, pub (B, C)); 897 /// ``` 898 /// 899 /// In this example input the first tuple struct element of `S` has 900 /// `pub(crate)` visibility while the second tuple struct element has `pub` 901 /// visibility; the parentheses around `(B, C)` are part of the type rather 902 /// than part of a visibility restriction. 903 /// 904 /// The parser uses a forked parse stream to check the first token inside of 905 /// parentheses after the `pub` keyword. This is a small bounded amount of 906 /// work performed against the forked parse stream. 907 /// 908 /// ``` 909 /// use syn::{parenthesized, token, Ident, Path, Result, Token}; 910 /// use syn::ext::IdentExt; 911 /// use syn::parse::{Parse, ParseStream}; 912 /// 913 /// struct PubVisibility { 914 /// pub_token: Token![pub], 915 /// restricted: Option<Restricted>, 916 /// } 917 /// 918 /// struct Restricted { 919 /// paren_token: token::Paren, 920 /// in_token: Option<Token![in]>, 921 /// path: Path, 922 /// } 923 /// 924 /// impl Parse for PubVisibility { 925 /// fn parse(input: ParseStream) -> Result<Self> { 926 /// let pub_token: Token![pub] = input.parse()?; 927 /// 928 /// if input.peek(token::Paren) { 929 /// let ahead = input.fork(); 930 /// let mut content; 931 /// parenthesized!(content in ahead); 932 /// 933 /// if content.peek(Token![crate]) 934 /// || content.peek(Token![self]) 935 /// || content.peek(Token![super]) 936 /// { 937 /// return Ok(PubVisibility { 938 /// pub_token, 939 /// restricted: Some(Restricted { 940 /// paren_token: parenthesized!(content in input), 941 /// in_token: None, 942 /// path: Path::from(content.call(Ident::parse_any)?), 943 /// }), 944 /// }); 945 /// } else if content.peek(Token![in]) { 946 /// return Ok(PubVisibility { 947 /// pub_token, 948 /// restricted: Some(Restricted { 949 /// paren_token: parenthesized!(content in input), 950 /// in_token: Some(content.parse()?), 951 /// path: content.call(Path::parse_mod_style)?, 952 /// }), 953 /// }); 954 /// } 955 /// } 956 /// 957 /// Ok(PubVisibility { 958 /// pub_token, 959 /// restricted: None, 960 /// }) 961 /// } 962 /// } 963 /// ``` 964 pub fn fork(&self) -> Self { 965 ParseBuffer { 966 scope: self.scope, 967 cell: self.cell.clone(), 968 marker: PhantomData, 969 // Not the parent's unexpected. Nothing cares whether the clone 970 // parses all the way unless we `advance_to`. 971 unexpected: Cell::new(Some(Rc::new(Cell::new(Unexpected::None)))), 972 } 973 } 974 975 /// Triggers an error at the current position of the parse stream. 976 /// 977 /// # Example 978 /// 979 /// ``` 980 /// use syn::{Expr, Result, Token}; 981 /// use syn::parse::{Parse, ParseStream}; 982 /// 983 /// // Some kind of loop: `while` or `for` or `loop`. 984 /// struct Loop { 985 /// expr: Expr, 986 /// } 987 /// 988 /// impl Parse for Loop { 989 /// fn parse(input: ParseStream) -> Result<Self> { 990 /// if input.peek(Token![while]) 991 /// || input.peek(Token![for]) 992 /// || input.peek(Token![loop]) 993 /// { 994 /// Ok(Loop { 995 /// expr: input.parse()?, 996 /// }) 997 /// } else { 998 /// Err(input.error("expected some kind of loop")) 999 /// } 1000 /// } 1001 /// } 1002 /// ``` 1003 pub fn error<T: Display>(&self, message: T) -> Error { 1004 error::new_at(self.scope, self.cursor(), message) 1005 } 1006 1007 /// Speculatively parses tokens from this parse stream, advancing the 1008 /// position of this stream only if parsing succeeds. 1009 /// 1010 /// This is a powerful low-level API used for defining the `Parse` impls of 1011 /// the basic built-in token types. It is not something that will be used 1012 /// widely outside of the Syn codebase. 1013 /// 1014 /// # Example 1015 /// 1016 /// ``` 1017 /// use proc_macro2::TokenTree; 1018 /// use syn::Result; 1019 /// use syn::parse::ParseStream; 1020 /// 1021 /// // This function advances the stream past the next occurrence of `@`. If 1022 /// // no `@` is present in the stream, the stream position is unchanged and 1023 /// // an error is returned. 1024 /// fn skip_past_next_at(input: ParseStream) -> Result<()> { 1025 /// input.step(|cursor| { 1026 /// let mut rest = *cursor; 1027 /// while let Some((tt, next)) = rest.token_tree() { 1028 /// match &tt { 1029 /// TokenTree::Punct(punct) if punct.as_char() == '@' => { 1030 /// return Ok(((), next)); 1031 /// } 1032 /// _ => rest = next, 1033 /// } 1034 /// } 1035 /// Err(cursor.error("no `@` was found after this point")) 1036 /// }) 1037 /// } 1038 /// # 1039 /// # fn remainder_after_skipping_past_next_at( 1040 /// # input: ParseStream, 1041 /// # ) -> Result<proc_macro2::TokenStream> { 1042 /// # skip_past_next_at(input)?; 1043 /// # input.parse() 1044 /// # } 1045 /// # 1046 /// # use syn::parse::Parser; 1047 /// # let remainder = remainder_after_skipping_past_next_at 1048 /// # .parse_str("a @ b c") 1049 /// # .unwrap(); 1050 /// # assert_eq!(remainder.to_string(), "b c"); 1051 /// ``` 1052 pub fn step<F, R>(&self, function: F) -> Result<R> 1053 where 1054 F: for<'c> FnOnce(StepCursor<'c, 'a>) -> Result<(R, Cursor<'c>)>, 1055 { 1056 // Since the user's function is required to work for any 'c, we know 1057 // that the Cursor<'c> they return is either derived from the input 1058 // StepCursor<'c, 'a> or from a Cursor<'static>. 1059 // 1060 // It would not be legal to write this function without the invariant 1061 // lifetime 'c in StepCursor<'c, 'a>. If this function were written only 1062 // in terms of 'a, the user could take our ParseBuffer<'a>, upcast it to 1063 // a ParseBuffer<'short> which some shorter lifetime than 'a, invoke 1064 // `step` on their ParseBuffer<'short> with a closure that returns 1065 // Cursor<'short>, and we would wrongly write that Cursor<'short> into 1066 // the Cell intended to hold Cursor<'a>. 1067 // 1068 // In some cases it may be necessary for R to contain a Cursor<'a>. 1069 // Within Syn we solve this using `advance_step_cursor` which uses the 1070 // existence of a StepCursor<'c, 'a> as proof that it is safe to cast 1071 // from Cursor<'c> to Cursor<'a>. If needed outside of Syn, it would be 1072 // safe to expose that API as a method on StepCursor. 1073 let (node, rest) = function(StepCursor { 1074 scope: self.scope, 1075 cursor: self.cell.get(), 1076 marker: PhantomData, 1077 })?; 1078 self.cell.set(rest); 1079 Ok(node) 1080 } 1081 1082 /// Returns the `Span` of the next token in the parse stream, or 1083 /// `Span::call_site()` if this parse stream has completely exhausted its 1084 /// input `TokenStream`. 1085 pub fn span(&self) -> Span { 1086 let cursor = self.cursor(); 1087 if cursor.eof() { 1088 self.scope 1089 } else { 1090 crate::buffer::open_span_of_group(cursor) 1091 } 1092 } 1093 1094 /// Provides low-level access to the token representation underlying this 1095 /// parse stream. 1096 /// 1097 /// Cursors are immutable so no operations you perform against the cursor 1098 /// will affect the state of this parse stream. 1099 /// 1100 /// # Example 1101 /// 1102 /// ``` 1103 /// use proc_macro2::TokenStream; 1104 /// use syn::buffer::Cursor; 1105 /// use syn::parse::{ParseStream, Result}; 1106 /// 1107 /// // Run a parser that returns T, but get its output as TokenStream instead of T. 1108 /// // This works without T needing to implement ToTokens. 1109 /// fn recognize_token_stream<T>( 1110 /// recognizer: fn(ParseStream) -> Result<T>, 1111 /// ) -> impl Fn(ParseStream) -> Result<TokenStream> { 1112 /// move |input| { 1113 /// let begin = input.cursor(); 1114 /// recognizer(input)?; 1115 /// let end = input.cursor(); 1116 /// Ok(tokens_between(begin, end)) 1117 /// } 1118 /// } 1119 /// 1120 /// // Collect tokens between two cursors as a TokenStream. 1121 /// fn tokens_between(begin: Cursor, end: Cursor) -> TokenStream { 1122 /// assert!(begin <= end); 1123 /// 1124 /// let mut cursor = begin; 1125 /// let mut tokens = TokenStream::new(); 1126 /// while cursor < end { 1127 /// let (token, next) = cursor.token_tree().unwrap(); 1128 /// tokens.extend(std::iter::once(token)); 1129 /// cursor = next; 1130 /// } 1131 /// tokens 1132 /// } 1133 /// 1134 /// fn main() { 1135 /// use quote::quote; 1136 /// use syn::parse::{Parse, Parser}; 1137 /// use syn::Token; 1138 /// 1139 /// // Parse syn::Type as a TokenStream, surrounded by angle brackets. 1140 /// fn example(input: ParseStream) -> Result<TokenStream> { 1141 /// let _langle: Token![<] = input.parse()?; 1142 /// let ty = recognize_token_stream(syn::Type::parse)(input)?; 1143 /// let _rangle: Token![>] = input.parse()?; 1144 /// Ok(ty) 1145 /// } 1146 /// 1147 /// let tokens = quote! { <fn() -> u8> }; 1148 /// println!("{}", example.parse2(tokens).unwrap()); 1149 /// } 1150 /// ``` 1151 pub fn cursor(&self) -> Cursor<'a> { 1152 self.cell.get() 1153 } 1154 1155 fn check_unexpected(&self) -> Result<()> { 1156 match inner_unexpected(self).1 { 1157 Some(span) => Err(Error::new(span, "unexpected token")), 1158 None => Ok(()), 1159 } 1160 } 1161} 1162 1163#[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1164impl<T: Parse> Parse for Box<T> { 1165 fn parse(input: ParseStream) -> Result<Self> { 1166 input.parse().map(Box::new) 1167 } 1168} 1169 1170#[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1171impl<T: Parse + Token> Parse for Option<T> { 1172 fn parse(input: ParseStream) -> Result<Self> { 1173 if T::peek(input.cursor()) { 1174 Ok(Some(input.parse()?)) 1175 } else { 1176 Ok(None) 1177 } 1178 } 1179} 1180 1181#[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1182impl Parse for TokenStream { 1183 fn parse(input: ParseStream) -> Result<Self> { 1184 input.step(|cursor| Ok((cursor.token_stream(), Cursor::empty()))) 1185 } 1186} 1187 1188#[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1189impl Parse for TokenTree { 1190 fn parse(input: ParseStream) -> Result<Self> { 1191 input.step(|cursor| match cursor.token_tree() { 1192 Some((tt, rest)) => Ok((tt, rest)), 1193 None => Err(cursor.error("expected token tree")), 1194 }) 1195 } 1196} 1197 1198#[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1199impl Parse for Group { 1200 fn parse(input: ParseStream) -> Result<Self> { 1201 input.step(|cursor| { 1202 if let Some((group, rest)) = cursor.any_group_token() { 1203 if group.delimiter() != Delimiter::None { 1204 return Ok((group, rest)); 1205 } 1206 } 1207 Err(cursor.error("expected group token")) 1208 }) 1209 } 1210} 1211 1212#[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1213impl Parse for Punct { 1214 fn parse(input: ParseStream) -> Result<Self> { 1215 input.step(|cursor| match cursor.punct() { 1216 Some((punct, rest)) => Ok((punct, rest)), 1217 None => Err(cursor.error("expected punctuation token")), 1218 }) 1219 } 1220} 1221 1222#[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] 1223impl Parse for Literal { 1224 fn parse(input: ParseStream) -> Result<Self> { 1225 input.step(|cursor| match cursor.literal() { 1226 Some((literal, rest)) => Ok((literal, rest)), 1227 None => Err(cursor.error("expected literal token")), 1228 }) 1229 } 1230} 1231 1232/// Parser that can parse Rust tokens into a particular syntax tree node. 1233/// 1234/// Refer to the [module documentation] for details about parsing in Syn. 1235/// 1236/// [module documentation]: self 1237pub trait Parser: Sized { 1238 type Output; 1239 1240 /// Parse a proc-macro2 token stream into the chosen syntax tree node. 1241 /// 1242 /// This function will check that the input is fully parsed. If there are 1243 /// any unparsed tokens at the end of the stream, an error is returned. 1244 fn parse2(self, tokens: TokenStream) -> Result<Self::Output>; 1245 1246 /// Parse tokens of source code into the chosen syntax tree node. 1247 /// 1248 /// This function will check that the input is fully parsed. If there are 1249 /// any unparsed tokens at the end of the stream, an error is returned. 1250 #[cfg(feature = "proc-macro")] 1251 #[cfg_attr(doc_cfg, doc(cfg(feature = "proc-macro")))] 1252 fn parse(self, tokens: proc_macro::TokenStream) -> Result<Self::Output> { 1253 self.parse2(proc_macro2::TokenStream::from(tokens)) 1254 } 1255 1256 /// Parse a string of Rust code into the chosen syntax tree node. 1257 /// 1258 /// This function will check that the input is fully parsed. If there are 1259 /// any unparsed tokens at the end of the string, an error is returned. 1260 /// 1261 /// # Hygiene 1262 /// 1263 /// Every span in the resulting syntax tree will be set to resolve at the 1264 /// macro call site. 1265 fn parse_str(self, s: &str) -> Result<Self::Output> { 1266 self.parse2(proc_macro2::TokenStream::from_str(s)?) 1267 } 1268 1269 // Not public API. 1270 #[doc(hidden)] 1271 #[cfg(any(feature = "full", feature = "derive"))] 1272 fn __parse_scoped(self, scope: Span, tokens: TokenStream) -> Result<Self::Output> { 1273 let _ = scope; 1274 self.parse2(tokens) 1275 } 1276} 1277 1278fn tokens_to_parse_buffer(tokens: &TokenBuffer) -> ParseBuffer { 1279 let scope = Span::call_site(); 1280 let cursor = tokens.begin(); 1281 let unexpected = Rc::new(Cell::new(Unexpected::None)); 1282 new_parse_buffer(scope, cursor, unexpected) 1283} 1284 1285impl<F, T> Parser for F 1286where 1287 F: FnOnce(ParseStream) -> Result<T>, 1288{ 1289 type Output = T; 1290 1291 fn parse2(self, tokens: TokenStream) -> Result<T> { 1292 let buf = TokenBuffer::new2(tokens); 1293 let state = tokens_to_parse_buffer(&buf); 1294 let node = self(&state)?; 1295 state.check_unexpected()?; 1296 if let Some(unexpected_span) = span_of_unexpected_ignoring_nones(state.cursor()) { 1297 Err(Error::new(unexpected_span, "unexpected token")) 1298 } else { 1299 Ok(node) 1300 } 1301 } 1302 1303 #[cfg(any(feature = "full", feature = "derive"))] 1304 fn __parse_scoped(self, scope: Span, tokens: TokenStream) -> Result<Self::Output> { 1305 let buf = TokenBuffer::new2(tokens); 1306 let cursor = buf.begin(); 1307 let unexpected = Rc::new(Cell::new(Unexpected::None)); 1308 let state = new_parse_buffer(scope, cursor, unexpected); 1309 let node = self(&state)?; 1310 state.check_unexpected()?; 1311 if let Some(unexpected_span) = span_of_unexpected_ignoring_nones(state.cursor()) { 1312 Err(Error::new(unexpected_span, "unexpected token")) 1313 } else { 1314 Ok(node) 1315 } 1316 } 1317} 1318 1319#[cfg(any(feature = "full", feature = "derive"))] 1320pub(crate) fn parse_scoped<F: Parser>(f: F, scope: Span, tokens: TokenStream) -> Result<F::Output> { 1321 f.__parse_scoped(scope, tokens) 1322} 1323 1324/// An empty syntax tree node that consumes no tokens when parsed. 1325/// 1326/// This is useful for attribute macros that want to ensure they are not 1327/// provided any attribute args. 1328/// 1329/// ``` 1330/// # extern crate proc_macro; 1331/// # 1332/// use proc_macro::TokenStream; 1333/// use syn::parse_macro_input; 1334/// use syn::parse::Nothing; 1335/// 1336/// # const IGNORE: &str = stringify! { 1337/// #[proc_macro_attribute] 1338/// # }; 1339/// pub fn my_attr(args: TokenStream, input: TokenStream) -> TokenStream { 1340/// parse_macro_input!(args as Nothing); 1341/// 1342/// /* ... */ 1343/// # TokenStream::new() 1344/// } 1345/// ``` 1346/// 1347/// ```text 1348/// error: unexpected token 1349/// --> src/main.rs:3:19 1350/// | 1351/// 3 | #[my_attr(asdf)] 1352/// | ^^^^ 1353/// ``` 1354pub struct Nothing; 1355 1356impl Parse for Nothing { 1357 fn parse(_input: ParseStream) -> Result<Self> { 1358 Ok(Nothing) 1359 } 1360} 1361 1362#[cfg(feature = "extra-traits")] 1363#[cfg_attr(doc_cfg, doc(cfg(feature = "extra-traits")))] 1364impl Debug for Nothing { 1365 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 1366 f.write_str("Nothing") 1367 } 1368} 1369 1370#[cfg(feature = "extra-traits")] 1371#[cfg_attr(doc_cfg, doc(cfg(feature = "extra-traits")))] 1372impl Eq for Nothing {} 1373 1374#[cfg(feature = "extra-traits")] 1375#[cfg_attr(doc_cfg, doc(cfg(feature = "extra-traits")))] 1376impl PartialEq for Nothing { 1377 fn eq(&self, _other: &Self) -> bool { 1378 true 1379 } 1380} 1381 1382#[cfg(feature = "extra-traits")] 1383#[cfg_attr(doc_cfg, doc(cfg(feature = "extra-traits")))] 1384impl Hash for Nothing { 1385 fn hash<H: Hasher>(&self, _state: &mut H) {} 1386} 1387