1 //! A wrapper around the procedural macro API of the compiler's [`proc_macro`] 2 //! crate. This library serves two purposes: 3 //! 4 //! [`proc_macro`]: https://doc.rust-lang.org/proc_macro/ 5 //! 6 //! - **Bring proc-macro-like functionality to other contexts like build.rs and 7 //! main.rs.** Types from `proc_macro` are entirely specific to procedural 8 //! macros and cannot ever exist in code outside of a procedural macro. 9 //! Meanwhile `proc_macro2` types may exist anywhere including non-macro code. 10 //! By developing foundational libraries like [syn] and [quote] against 11 //! `proc_macro2` rather than `proc_macro`, the procedural macro ecosystem 12 //! becomes easily applicable to many other use cases and we avoid 13 //! reimplementing non-macro equivalents of those libraries. 14 //! 15 //! - **Make procedural macros unit testable.** As a consequence of being 16 //! specific to procedural macros, nothing that uses `proc_macro` can be 17 //! executed from a unit test. In order for helper libraries or components of 18 //! a macro to be testable in isolation, they must be implemented using 19 //! `proc_macro2`. 20 //! 21 //! [syn]: https://github.com/dtolnay/syn 22 //! [quote]: https://github.com/dtolnay/quote 23 //! 24 //! # Usage 25 //! 26 //! The skeleton of a typical procedural macro typically looks like this: 27 //! 28 //! ``` 29 //! extern crate proc_macro; 30 //! 31 //! # const IGNORE: &str = stringify! { 32 //! #[proc_macro_derive(MyDerive)] 33 //! # }; 34 //! # #[cfg(wrap_proc_macro)] 35 //! pub fn my_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream { 36 //! let input = proc_macro2::TokenStream::from(input); 37 //! 38 //! let output: proc_macro2::TokenStream = { 39 //! /* transform input */ 40 //! # input 41 //! }; 42 //! 43 //! proc_macro::TokenStream::from(output) 44 //! } 45 //! ``` 46 //! 47 //! If parsing with [Syn], you'll use [`parse_macro_input!`] instead to 48 //! propagate parse errors correctly back to the compiler when parsing fails. 49 //! 50 //! [`parse_macro_input!`]: https://docs.rs/syn/1.0/syn/macro.parse_macro_input.html 51 //! 52 //! # Unstable features 53 //! 54 //! The default feature set of proc-macro2 tracks the most recent stable 55 //! compiler API. Functionality in `proc_macro` that is not yet stable is not 56 //! exposed by proc-macro2 by default. 57 //! 58 //! To opt into the additional APIs available in the most recent nightly 59 //! compiler, the `procmacro2_semver_exempt` config flag must be passed to 60 //! rustc. We will polyfill those nightly-only APIs back to Rust 1.31.0. As 61 //! these are unstable APIs that track the nightly compiler, minor versions of 62 //! proc-macro2 may make breaking changes to them at any time. 63 //! 64 //! ```sh 65 //! RUSTFLAGS='--cfg procmacro2_semver_exempt' cargo build 66 //! ``` 67 //! 68 //! Note that this must not only be done for your crate, but for any crate that 69 //! depends on your crate. This infectious nature is intentional, as it serves 70 //! as a reminder that you are outside of the normal semver guarantees. 71 //! 72 //! Semver exempt methods are marked as such in the proc-macro2 documentation. 73 //! 74 //! # Thread-Safety 75 //! 76 //! Most types in this crate are `!Sync` because the underlying compiler 77 //! types make use of thread-local memory, meaning they cannot be accessed from 78 //! a different thread. 79 80 // Proc-macro2 types in rustdoc of other crates get linked to here. 81 #![doc(html_root_url = "https://docs.rs/proc-macro2/1.0.26")] 82 #![cfg_attr(any(proc_macro_span, super_unstable), feature(proc_macro_span))] 83 #![cfg_attr(super_unstable, feature(proc_macro_raw_ident, proc_macro_def_site))] 84 #![cfg_attr(doc_cfg, feature(doc_cfg))] 85 #![allow(clippy::needless_doctest_main, clippy::vec_init_then_push)] 86 87 #[cfg(use_proc_macro)] 88 extern crate proc_macro; 89 90 mod marker; 91 mod parse; 92 93 #[cfg(wrap_proc_macro)] 94 mod detection; 95 96 // Public for proc_macro2::fallback::force() and unforce(), but those are quite 97 // a niche use case so we omit it from rustdoc. 98 #[doc(hidden)] 99 pub mod fallback; 100 101 #[cfg(not(wrap_proc_macro))] 102 use crate::fallback as imp; 103 #[path = "wrapper.rs"] 104 #[cfg(wrap_proc_macro)] 105 mod imp; 106 107 use crate::marker::Marker; 108 use std::cmp::Ordering; 109 use std::error::Error; 110 use std::fmt::{self, Debug, Display}; 111 use std::hash::{Hash, Hasher}; 112 use std::iter::FromIterator; 113 use std::ops::RangeBounds; 114 #[cfg(procmacro2_semver_exempt)] 115 use std::path::PathBuf; 116 use std::str::FromStr; 117 118 /// An abstract stream of tokens, or more concretely a sequence of token trees. 119 /// 120 /// This type provides interfaces for iterating over token trees and for 121 /// collecting token trees into one stream. 122 /// 123 /// Token stream is both the input and output of `#[proc_macro]`, 124 /// `#[proc_macro_attribute]` and `#[proc_macro_derive]` definitions. 125 #[derive(Clone)] 126 pub struct TokenStream { 127 inner: imp::TokenStream, 128 _marker: Marker, 129 } 130 131 /// Error returned from `TokenStream::from_str`. 132 pub struct LexError { 133 inner: imp::LexError, 134 _marker: Marker, 135 } 136 137 impl TokenStream { _new(inner: imp::TokenStream) -> TokenStream138 fn _new(inner: imp::TokenStream) -> TokenStream { 139 TokenStream { 140 inner, 141 _marker: Marker, 142 } 143 } 144 _new_stable(inner: fallback::TokenStream) -> TokenStream145 fn _new_stable(inner: fallback::TokenStream) -> TokenStream { 146 TokenStream { 147 inner: inner.into(), 148 _marker: Marker, 149 } 150 } 151 152 /// Returns an empty `TokenStream` containing no token trees. new() -> TokenStream153 pub fn new() -> TokenStream { 154 TokenStream::_new(imp::TokenStream::new()) 155 } 156 157 /// Checks if this `TokenStream` is empty. is_empty(&self) -> bool158 pub fn is_empty(&self) -> bool { 159 self.inner.is_empty() 160 } 161 } 162 163 /// `TokenStream::default()` returns an empty stream, 164 /// i.e. this is equivalent with `TokenStream::new()`. 165 impl Default for TokenStream { default() -> Self166 fn default() -> Self { 167 TokenStream::new() 168 } 169 } 170 171 /// Attempts to break the string into tokens and parse those tokens into a token 172 /// stream. 173 /// 174 /// May fail for a number of reasons, for example, if the string contains 175 /// unbalanced delimiters or characters not existing in the language. 176 /// 177 /// NOTE: Some errors may cause panics instead of returning `LexError`. We 178 /// reserve the right to change these errors into `LexError`s later. 179 impl FromStr for TokenStream { 180 type Err = LexError; 181 from_str(src: &str) -> Result<TokenStream, LexError>182 fn from_str(src: &str) -> Result<TokenStream, LexError> { 183 let e = src.parse().map_err(|e| LexError { 184 inner: e, 185 _marker: Marker, 186 })?; 187 Ok(TokenStream::_new(e)) 188 } 189 } 190 191 #[cfg(use_proc_macro)] 192 impl From<proc_macro::TokenStream> for TokenStream { from(inner: proc_macro::TokenStream) -> TokenStream193 fn from(inner: proc_macro::TokenStream) -> TokenStream { 194 TokenStream::_new(inner.into()) 195 } 196 } 197 198 #[cfg(use_proc_macro)] 199 impl From<TokenStream> for proc_macro::TokenStream { from(inner: TokenStream) -> proc_macro::TokenStream200 fn from(inner: TokenStream) -> proc_macro::TokenStream { 201 inner.inner.into() 202 } 203 } 204 205 impl From<TokenTree> for TokenStream { from(token: TokenTree) -> Self206 fn from(token: TokenTree) -> Self { 207 TokenStream::_new(imp::TokenStream::from(token)) 208 } 209 } 210 211 impl Extend<TokenTree> for TokenStream { extend<I: IntoIterator<Item = TokenTree>>(&mut self, streams: I)212 fn extend<I: IntoIterator<Item = TokenTree>>(&mut self, streams: I) { 213 self.inner.extend(streams) 214 } 215 } 216 217 impl Extend<TokenStream> for TokenStream { extend<I: IntoIterator<Item = TokenStream>>(&mut self, streams: I)218 fn extend<I: IntoIterator<Item = TokenStream>>(&mut self, streams: I) { 219 self.inner 220 .extend(streams.into_iter().map(|stream| stream.inner)) 221 } 222 } 223 224 /// Collects a number of token trees into a single stream. 225 impl FromIterator<TokenTree> for TokenStream { from_iter<I: IntoIterator<Item = TokenTree>>(streams: I) -> Self226 fn from_iter<I: IntoIterator<Item = TokenTree>>(streams: I) -> Self { 227 TokenStream::_new(streams.into_iter().collect()) 228 } 229 } 230 impl FromIterator<TokenStream> for TokenStream { from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self231 fn from_iter<I: IntoIterator<Item = TokenStream>>(streams: I) -> Self { 232 TokenStream::_new(streams.into_iter().map(|i| i.inner).collect()) 233 } 234 } 235 236 /// Prints the token stream as a string that is supposed to be losslessly 237 /// convertible back into the same token stream (modulo spans), except for 238 /// possibly `TokenTree::Group`s with `Delimiter::None` delimiters and negative 239 /// numeric literals. 240 impl Display for TokenStream { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result241 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 242 Display::fmt(&self.inner, f) 243 } 244 } 245 246 /// Prints token in a form convenient for debugging. 247 impl Debug for TokenStream { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result248 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 249 Debug::fmt(&self.inner, f) 250 } 251 } 252 253 impl LexError { span(&self) -> Span254 pub fn span(&self) -> Span { 255 Span::_new(self.inner.span()) 256 } 257 } 258 259 impl Debug for LexError { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result260 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 261 Debug::fmt(&self.inner, f) 262 } 263 } 264 265 impl Display for LexError { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result266 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 267 Display::fmt(&self.inner, f) 268 } 269 } 270 271 impl Error for LexError {} 272 273 /// The source file of a given `Span`. 274 /// 275 /// This type is semver exempt and not exposed by default. 276 #[cfg(procmacro2_semver_exempt)] 277 #[cfg_attr(doc_cfg, doc(cfg(procmacro2_semver_exempt)))] 278 #[derive(Clone, PartialEq, Eq)] 279 pub struct SourceFile { 280 inner: imp::SourceFile, 281 _marker: Marker, 282 } 283 284 #[cfg(procmacro2_semver_exempt)] 285 impl SourceFile { _new(inner: imp::SourceFile) -> Self286 fn _new(inner: imp::SourceFile) -> Self { 287 SourceFile { 288 inner, 289 _marker: Marker, 290 } 291 } 292 293 /// Get the path to this source file. 294 /// 295 /// ### Note 296 /// 297 /// If the code span associated with this `SourceFile` was generated by an 298 /// external macro, this may not be an actual path on the filesystem. Use 299 /// [`is_real`] to check. 300 /// 301 /// Also note that even if `is_real` returns `true`, if 302 /// `--remap-path-prefix` was passed on the command line, the path as given 303 /// may not actually be valid. 304 /// 305 /// [`is_real`]: #method.is_real path(&self) -> PathBuf306 pub fn path(&self) -> PathBuf { 307 self.inner.path() 308 } 309 310 /// Returns `true` if this source file is a real source file, and not 311 /// generated by an external macro's expansion. is_real(&self) -> bool312 pub fn is_real(&self) -> bool { 313 self.inner.is_real() 314 } 315 } 316 317 #[cfg(procmacro2_semver_exempt)] 318 impl Debug for SourceFile { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result319 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 320 Debug::fmt(&self.inner, f) 321 } 322 } 323 324 /// A line-column pair representing the start or end of a `Span`. 325 /// 326 /// This type is semver exempt and not exposed by default. 327 #[cfg(span_locations)] 328 #[cfg_attr(doc_cfg, doc(cfg(feature = "span-locations")))] 329 #[derive(Copy, Clone, Debug, PartialEq, Eq)] 330 pub struct LineColumn { 331 /// The 1-indexed line in the source file on which the span starts or ends 332 /// (inclusive). 333 pub line: usize, 334 /// The 0-indexed column (in UTF-8 characters) in the source file on which 335 /// the span starts or ends (inclusive). 336 pub column: usize, 337 } 338 339 #[cfg(span_locations)] 340 impl Ord for LineColumn { cmp(&self, other: &Self) -> Ordering341 fn cmp(&self, other: &Self) -> Ordering { 342 self.line 343 .cmp(&other.line) 344 .then(self.column.cmp(&other.column)) 345 } 346 } 347 348 #[cfg(span_locations)] 349 impl PartialOrd for LineColumn { partial_cmp(&self, other: &Self) -> Option<Ordering>350 fn partial_cmp(&self, other: &Self) -> Option<Ordering> { 351 Some(self.cmp(other)) 352 } 353 } 354 355 /// A region of source code, along with macro expansion information. 356 #[derive(Copy, Clone)] 357 pub struct Span { 358 inner: imp::Span, 359 _marker: Marker, 360 } 361 362 impl Span { _new(inner: imp::Span) -> Span363 fn _new(inner: imp::Span) -> Span { 364 Span { 365 inner, 366 _marker: Marker, 367 } 368 } 369 _new_stable(inner: fallback::Span) -> Span370 fn _new_stable(inner: fallback::Span) -> Span { 371 Span { 372 inner: inner.into(), 373 _marker: Marker, 374 } 375 } 376 377 /// The span of the invocation of the current procedural macro. 378 /// 379 /// Identifiers created with this span will be resolved as if they were 380 /// written directly at the macro call location (call-site hygiene) and 381 /// other code at the macro call site will be able to refer to them as well. call_site() -> Span382 pub fn call_site() -> Span { 383 Span::_new(imp::Span::call_site()) 384 } 385 386 /// The span located at the invocation of the procedural macro, but with 387 /// local variables, labels, and `$crate` resolved at the definition site 388 /// of the macro. This is the same hygiene behavior as `macro_rules`. 389 /// 390 /// This function requires Rust 1.45 or later. 391 #[cfg(hygiene)] mixed_site() -> Span392 pub fn mixed_site() -> Span { 393 Span::_new(imp::Span::mixed_site()) 394 } 395 396 /// A span that resolves at the macro definition site. 397 /// 398 /// This method is semver exempt and not exposed by default. 399 #[cfg(procmacro2_semver_exempt)] 400 #[cfg_attr(doc_cfg, doc(cfg(procmacro2_semver_exempt)))] def_site() -> Span401 pub fn def_site() -> Span { 402 Span::_new(imp::Span::def_site()) 403 } 404 405 /// Creates a new span with the same line/column information as `self` but 406 /// that resolves symbols as though it were at `other`. resolved_at(&self, other: Span) -> Span407 pub fn resolved_at(&self, other: Span) -> Span { 408 Span::_new(self.inner.resolved_at(other.inner)) 409 } 410 411 /// Creates a new span with the same name resolution behavior as `self` but 412 /// with the line/column information of `other`. located_at(&self, other: Span) -> Span413 pub fn located_at(&self, other: Span) -> Span { 414 Span::_new(self.inner.located_at(other.inner)) 415 } 416 417 /// Convert `proc_macro2::Span` to `proc_macro::Span`. 418 /// 419 /// This method is available when building with a nightly compiler, or when 420 /// building with rustc 1.29+ *without* semver exempt features. 421 /// 422 /// # Panics 423 /// 424 /// Panics if called from outside of a procedural macro. Unlike 425 /// `proc_macro2::Span`, the `proc_macro::Span` type can only exist within 426 /// the context of a procedural macro invocation. 427 #[cfg(wrap_proc_macro)] unwrap(self) -> proc_macro::Span428 pub fn unwrap(self) -> proc_macro::Span { 429 self.inner.unwrap() 430 } 431 432 // Soft deprecated. Please use Span::unwrap. 433 #[cfg(wrap_proc_macro)] 434 #[doc(hidden)] unstable(self) -> proc_macro::Span435 pub fn unstable(self) -> proc_macro::Span { 436 self.unwrap() 437 } 438 439 /// The original source file into which this span points. 440 /// 441 /// This method is semver exempt and not exposed by default. 442 #[cfg(procmacro2_semver_exempt)] 443 #[cfg_attr(doc_cfg, doc(cfg(procmacro2_semver_exempt)))] source_file(&self) -> SourceFile444 pub fn source_file(&self) -> SourceFile { 445 SourceFile::_new(self.inner.source_file()) 446 } 447 448 /// Get the starting line/column in the source file for this span. 449 /// 450 /// This method requires the `"span-locations"` feature to be enabled. 451 /// 452 /// When executing in a procedural macro context, the returned line/column 453 /// are only meaningful if compiled with a nightly toolchain. The stable 454 /// toolchain does not have this information available. When executing 455 /// outside of a procedural macro, such as main.rs or build.rs, the 456 /// line/column are always meaningful regardless of toolchain. 457 #[cfg(span_locations)] 458 #[cfg_attr(doc_cfg, doc(cfg(feature = "span-locations")))] start(&self) -> LineColumn459 pub fn start(&self) -> LineColumn { 460 let imp::LineColumn { line, column } = self.inner.start(); 461 LineColumn { line, column } 462 } 463 464 /// Get the ending line/column in the source file for this span. 465 /// 466 /// This method requires the `"span-locations"` feature to be enabled. 467 /// 468 /// When executing in a procedural macro context, the returned line/column 469 /// are only meaningful if compiled with a nightly toolchain. The stable 470 /// toolchain does not have this information available. When executing 471 /// outside of a procedural macro, such as main.rs or build.rs, the 472 /// line/column are always meaningful regardless of toolchain. 473 #[cfg(span_locations)] 474 #[cfg_attr(doc_cfg, doc(cfg(feature = "span-locations")))] end(&self) -> LineColumn475 pub fn end(&self) -> LineColumn { 476 let imp::LineColumn { line, column } = self.inner.end(); 477 LineColumn { line, column } 478 } 479 480 /// Create a new span encompassing `self` and `other`. 481 /// 482 /// Returns `None` if `self` and `other` are from different files. 483 /// 484 /// Warning: the underlying [`proc_macro::Span::join`] method is 485 /// nightly-only. When called from within a procedural macro not using a 486 /// nightly compiler, this method will always return `None`. 487 /// 488 /// [`proc_macro::Span::join`]: https://doc.rust-lang.org/proc_macro/struct.Span.html#method.join join(&self, other: Span) -> Option<Span>489 pub fn join(&self, other: Span) -> Option<Span> { 490 self.inner.join(other.inner).map(Span::_new) 491 } 492 493 /// Compares two spans to see if they're equal. 494 /// 495 /// This method is semver exempt and not exposed by default. 496 #[cfg(procmacro2_semver_exempt)] 497 #[cfg_attr(doc_cfg, doc(cfg(procmacro2_semver_exempt)))] eq(&self, other: &Span) -> bool498 pub fn eq(&self, other: &Span) -> bool { 499 self.inner.eq(&other.inner) 500 } 501 } 502 503 /// Prints a span in a form convenient for debugging. 504 impl Debug for Span { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result505 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 506 Debug::fmt(&self.inner, f) 507 } 508 } 509 510 /// A single token or a delimited sequence of token trees (e.g. `[1, (), ..]`). 511 #[derive(Clone)] 512 pub enum TokenTree { 513 /// A token stream surrounded by bracket delimiters. 514 Group(Group), 515 /// An identifier. 516 Ident(Ident), 517 /// A single punctuation character (`+`, `,`, `$`, etc.). 518 Punct(Punct), 519 /// A literal character (`'a'`), string (`"hello"`), number (`2.3`), etc. 520 Literal(Literal), 521 } 522 523 impl TokenTree { 524 /// Returns the span of this tree, delegating to the `span` method of 525 /// the contained token or a delimited stream. span(&self) -> Span526 pub fn span(&self) -> Span { 527 match self { 528 TokenTree::Group(t) => t.span(), 529 TokenTree::Ident(t) => t.span(), 530 TokenTree::Punct(t) => t.span(), 531 TokenTree::Literal(t) => t.span(), 532 } 533 } 534 535 /// Configures the span for *only this token*. 536 /// 537 /// Note that if this token is a `Group` then this method will not configure 538 /// the span of each of the internal tokens, this will simply delegate to 539 /// the `set_span` method of each variant. set_span(&mut self, span: Span)540 pub fn set_span(&mut self, span: Span) { 541 match self { 542 TokenTree::Group(t) => t.set_span(span), 543 TokenTree::Ident(t) => t.set_span(span), 544 TokenTree::Punct(t) => t.set_span(span), 545 TokenTree::Literal(t) => t.set_span(span), 546 } 547 } 548 } 549 550 impl From<Group> for TokenTree { from(g: Group) -> TokenTree551 fn from(g: Group) -> TokenTree { 552 TokenTree::Group(g) 553 } 554 } 555 556 impl From<Ident> for TokenTree { from(g: Ident) -> TokenTree557 fn from(g: Ident) -> TokenTree { 558 TokenTree::Ident(g) 559 } 560 } 561 562 impl From<Punct> for TokenTree { from(g: Punct) -> TokenTree563 fn from(g: Punct) -> TokenTree { 564 TokenTree::Punct(g) 565 } 566 } 567 568 impl From<Literal> for TokenTree { from(g: Literal) -> TokenTree569 fn from(g: Literal) -> TokenTree { 570 TokenTree::Literal(g) 571 } 572 } 573 574 /// Prints the token tree as a string that is supposed to be losslessly 575 /// convertible back into the same token tree (modulo spans), except for 576 /// possibly `TokenTree::Group`s with `Delimiter::None` delimiters and negative 577 /// numeric literals. 578 impl Display for TokenTree { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result579 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 580 match self { 581 TokenTree::Group(t) => Display::fmt(t, f), 582 TokenTree::Ident(t) => Display::fmt(t, f), 583 TokenTree::Punct(t) => Display::fmt(t, f), 584 TokenTree::Literal(t) => Display::fmt(t, f), 585 } 586 } 587 } 588 589 /// Prints token tree in a form convenient for debugging. 590 impl Debug for TokenTree { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result591 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 592 // Each of these has the name in the struct type in the derived debug, 593 // so don't bother with an extra layer of indirection 594 match self { 595 TokenTree::Group(t) => Debug::fmt(t, f), 596 TokenTree::Ident(t) => { 597 let mut debug = f.debug_struct("Ident"); 598 debug.field("sym", &format_args!("{}", t)); 599 imp::debug_span_field_if_nontrivial(&mut debug, t.span().inner); 600 debug.finish() 601 } 602 TokenTree::Punct(t) => Debug::fmt(t, f), 603 TokenTree::Literal(t) => Debug::fmt(t, f), 604 } 605 } 606 } 607 608 /// A delimited token stream. 609 /// 610 /// A `Group` internally contains a `TokenStream` which is surrounded by 611 /// `Delimiter`s. 612 #[derive(Clone)] 613 pub struct Group { 614 inner: imp::Group, 615 } 616 617 /// Describes how a sequence of token trees is delimited. 618 #[derive(Copy, Clone, Debug, Eq, PartialEq)] 619 pub enum Delimiter { 620 /// `( ... )` 621 Parenthesis, 622 /// `{ ... }` 623 Brace, 624 /// `[ ... ]` 625 Bracket, 626 /// `Ø ... Ø` 627 /// 628 /// An implicit delimiter, that may, for example, appear around tokens 629 /// coming from a "macro variable" `$var`. It is important to preserve 630 /// operator priorities in cases like `$var * 3` where `$var` is `1 + 2`. 631 /// Implicit delimiters may not survive roundtrip of a token stream through 632 /// a string. 633 None, 634 } 635 636 impl Group { _new(inner: imp::Group) -> Self637 fn _new(inner: imp::Group) -> Self { 638 Group { inner } 639 } 640 _new_stable(inner: fallback::Group) -> Self641 fn _new_stable(inner: fallback::Group) -> Self { 642 Group { 643 inner: inner.into(), 644 } 645 } 646 647 /// Creates a new `Group` with the given delimiter and token stream. 648 /// 649 /// This constructor will set the span for this group to 650 /// `Span::call_site()`. To change the span you can use the `set_span` 651 /// method below. new(delimiter: Delimiter, stream: TokenStream) -> Group652 pub fn new(delimiter: Delimiter, stream: TokenStream) -> Group { 653 Group { 654 inner: imp::Group::new(delimiter, stream.inner), 655 } 656 } 657 658 /// Returns the delimiter of this `Group` delimiter(&self) -> Delimiter659 pub fn delimiter(&self) -> Delimiter { 660 self.inner.delimiter() 661 } 662 663 /// Returns the `TokenStream` of tokens that are delimited in this `Group`. 664 /// 665 /// Note that the returned token stream does not include the delimiter 666 /// returned above. stream(&self) -> TokenStream667 pub fn stream(&self) -> TokenStream { 668 TokenStream::_new(self.inner.stream()) 669 } 670 671 /// Returns the span for the delimiters of this token stream, spanning the 672 /// entire `Group`. 673 /// 674 /// ```text 675 /// pub fn span(&self) -> Span { 676 /// ^^^^^^^ 677 /// ``` span(&self) -> Span678 pub fn span(&self) -> Span { 679 Span::_new(self.inner.span()) 680 } 681 682 /// Returns the span pointing to the opening delimiter of this group. 683 /// 684 /// ```text 685 /// pub fn span_open(&self) -> Span { 686 /// ^ 687 /// ``` span_open(&self) -> Span688 pub fn span_open(&self) -> Span { 689 Span::_new(self.inner.span_open()) 690 } 691 692 /// Returns the span pointing to the closing delimiter of this group. 693 /// 694 /// ```text 695 /// pub fn span_close(&self) -> Span { 696 /// ^ 697 /// ``` span_close(&self) -> Span698 pub fn span_close(&self) -> Span { 699 Span::_new(self.inner.span_close()) 700 } 701 702 /// Configures the span for this `Group`'s delimiters, but not its internal 703 /// tokens. 704 /// 705 /// This method will **not** set the span of all the internal tokens spanned 706 /// by this group, but rather it will only set the span of the delimiter 707 /// tokens at the level of the `Group`. set_span(&mut self, span: Span)708 pub fn set_span(&mut self, span: Span) { 709 self.inner.set_span(span.inner) 710 } 711 } 712 713 /// Prints the group as a string that should be losslessly convertible back 714 /// into the same group (modulo spans), except for possibly `TokenTree::Group`s 715 /// with `Delimiter::None` delimiters. 716 impl Display for Group { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result717 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 718 Display::fmt(&self.inner, formatter) 719 } 720 } 721 722 impl Debug for Group { fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result723 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 724 Debug::fmt(&self.inner, formatter) 725 } 726 } 727 728 /// A `Punct` is a single punctuation character like `+`, `-` or `#`. 729 /// 730 /// Multicharacter operators like `+=` are represented as two instances of 731 /// `Punct` with different forms of `Spacing` returned. 732 #[derive(Clone)] 733 pub struct Punct { 734 ch: char, 735 spacing: Spacing, 736 span: Span, 737 } 738 739 /// Whether a `Punct` is followed immediately by another `Punct` or followed by 740 /// another token or whitespace. 741 #[derive(Copy, Clone, Debug, Eq, PartialEq)] 742 pub enum Spacing { 743 /// E.g. `+` is `Alone` in `+ =`, `+ident` or `+()`. 744 Alone, 745 /// E.g. `+` is `Joint` in `+=` or `'` is `Joint` in `'#`. 746 /// 747 /// Additionally, single quote `'` can join with identifiers to form 748 /// lifetimes `'ident`. 749 Joint, 750 } 751 752 impl Punct { 753 /// Creates a new `Punct` from the given character and spacing. 754 /// 755 /// The `ch` argument must be a valid punctuation character permitted by the 756 /// language, otherwise the function will panic. 757 /// 758 /// The returned `Punct` will have the default span of `Span::call_site()` 759 /// which can be further configured with the `set_span` method below. new(ch: char, spacing: Spacing) -> Punct760 pub fn new(ch: char, spacing: Spacing) -> Punct { 761 Punct { 762 ch, 763 spacing, 764 span: Span::call_site(), 765 } 766 } 767 768 /// Returns the value of this punctuation character as `char`. as_char(&self) -> char769 pub fn as_char(&self) -> char { 770 self.ch 771 } 772 773 /// Returns the spacing of this punctuation character, indicating whether 774 /// it's immediately followed by another `Punct` in the token stream, so 775 /// they can potentially be combined into a multicharacter operator 776 /// (`Joint`), or it's followed by some other token or whitespace (`Alone`) 777 /// so the operator has certainly ended. spacing(&self) -> Spacing778 pub fn spacing(&self) -> Spacing { 779 self.spacing 780 } 781 782 /// Returns the span for this punctuation character. span(&self) -> Span783 pub fn span(&self) -> Span { 784 self.span 785 } 786 787 /// Configure the span for this punctuation character. set_span(&mut self, span: Span)788 pub fn set_span(&mut self, span: Span) { 789 self.span = span; 790 } 791 } 792 793 /// Prints the punctuation character as a string that should be losslessly 794 /// convertible back into the same character. 795 impl Display for Punct { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result796 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 797 Display::fmt(&self.ch, f) 798 } 799 } 800 801 impl Debug for Punct { fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result802 fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { 803 let mut debug = fmt.debug_struct("Punct"); 804 debug.field("char", &self.ch); 805 debug.field("spacing", &self.spacing); 806 imp::debug_span_field_if_nontrivial(&mut debug, self.span.inner); 807 debug.finish() 808 } 809 } 810 811 /// A word of Rust code, which may be a keyword or legal variable name. 812 /// 813 /// An identifier consists of at least one Unicode code point, the first of 814 /// which has the XID_Start property and the rest of which have the XID_Continue 815 /// property. 816 /// 817 /// - The empty string is not an identifier. Use `Option<Ident>`. 818 /// - A lifetime is not an identifier. Use `syn::Lifetime` instead. 819 /// 820 /// An identifier constructed with `Ident::new` is permitted to be a Rust 821 /// keyword, though parsing one through its [`Parse`] implementation rejects 822 /// Rust keywords. Use `input.call(Ident::parse_any)` when parsing to match the 823 /// behaviour of `Ident::new`. 824 /// 825 /// [`Parse`]: https://docs.rs/syn/1.0/syn/parse/trait.Parse.html 826 /// 827 /// # Examples 828 /// 829 /// A new ident can be created from a string using the `Ident::new` function. 830 /// A span must be provided explicitly which governs the name resolution 831 /// behavior of the resulting identifier. 832 /// 833 /// ``` 834 /// use proc_macro2::{Ident, Span}; 835 /// 836 /// fn main() { 837 /// let call_ident = Ident::new("calligraphy", Span::call_site()); 838 /// 839 /// println!("{}", call_ident); 840 /// } 841 /// ``` 842 /// 843 /// An ident can be interpolated into a token stream using the `quote!` macro. 844 /// 845 /// ``` 846 /// use proc_macro2::{Ident, Span}; 847 /// use quote::quote; 848 /// 849 /// fn main() { 850 /// let ident = Ident::new("demo", Span::call_site()); 851 /// 852 /// // Create a variable binding whose name is this ident. 853 /// let expanded = quote! { let #ident = 10; }; 854 /// 855 /// // Create a variable binding with a slightly different name. 856 /// let temp_ident = Ident::new(&format!("new_{}", ident), Span::call_site()); 857 /// let expanded = quote! { let #temp_ident = 10; }; 858 /// } 859 /// ``` 860 /// 861 /// A string representation of the ident is available through the `to_string()` 862 /// method. 863 /// 864 /// ``` 865 /// # use proc_macro2::{Ident, Span}; 866 /// # 867 /// # let ident = Ident::new("another_identifier", Span::call_site()); 868 /// # 869 /// // Examine the ident as a string. 870 /// let ident_string = ident.to_string(); 871 /// if ident_string.len() > 60 { 872 /// println!("Very long identifier: {}", ident_string) 873 /// } 874 /// ``` 875 #[derive(Clone)] 876 pub struct Ident { 877 inner: imp::Ident, 878 _marker: Marker, 879 } 880 881 impl Ident { _new(inner: imp::Ident) -> Ident882 fn _new(inner: imp::Ident) -> Ident { 883 Ident { 884 inner, 885 _marker: Marker, 886 } 887 } 888 889 /// Creates a new `Ident` with the given `string` as well as the specified 890 /// `span`. 891 /// 892 /// The `string` argument must be a valid identifier permitted by the 893 /// language, otherwise the function will panic. 894 /// 895 /// Note that `span`, currently in rustc, configures the hygiene information 896 /// for this identifier. 897 /// 898 /// As of this time `Span::call_site()` explicitly opts-in to "call-site" 899 /// hygiene meaning that identifiers created with this span will be resolved 900 /// as if they were written directly at the location of the macro call, and 901 /// other code at the macro call site will be able to refer to them as well. 902 /// 903 /// Later spans like `Span::def_site()` will allow to opt-in to 904 /// "definition-site" hygiene meaning that identifiers created with this 905 /// span will be resolved at the location of the macro definition and other 906 /// code at the macro call site will not be able to refer to them. 907 /// 908 /// Due to the current importance of hygiene this constructor, unlike other 909 /// tokens, requires a `Span` to be specified at construction. 910 /// 911 /// # Panics 912 /// 913 /// Panics if the input string is neither a keyword nor a legal variable 914 /// name. If you are not sure whether the string contains an identifier and 915 /// need to handle an error case, use 916 /// <a href="https://docs.rs/syn/1.0/syn/fn.parse_str.html"><code 917 /// style="padding-right:0;">syn::parse_str</code></a><code 918 /// style="padding-left:0;">::<Ident></code> 919 /// rather than `Ident::new`. new(string: &str, span: Span) -> Ident920 pub fn new(string: &str, span: Span) -> Ident { 921 Ident::_new(imp::Ident::new(string, span.inner)) 922 } 923 924 /// Same as `Ident::new`, but creates a raw identifier (`r#ident`). 925 /// 926 /// This method is semver exempt and not exposed by default. 927 #[cfg(procmacro2_semver_exempt)] 928 #[cfg_attr(doc_cfg, doc(cfg(procmacro2_semver_exempt)))] new_raw(string: &str, span: Span) -> Ident929 pub fn new_raw(string: &str, span: Span) -> Ident { 930 Ident::_new_raw(string, span) 931 } 932 _new_raw(string: &str, span: Span) -> Ident933 fn _new_raw(string: &str, span: Span) -> Ident { 934 Ident::_new(imp::Ident::new_raw(string, span.inner)) 935 } 936 937 /// Returns the span of this `Ident`. span(&self) -> Span938 pub fn span(&self) -> Span { 939 Span::_new(self.inner.span()) 940 } 941 942 /// Configures the span of this `Ident`, possibly changing its hygiene 943 /// context. set_span(&mut self, span: Span)944 pub fn set_span(&mut self, span: Span) { 945 self.inner.set_span(span.inner); 946 } 947 } 948 949 impl PartialEq for Ident { eq(&self, other: &Ident) -> bool950 fn eq(&self, other: &Ident) -> bool { 951 self.inner == other.inner 952 } 953 } 954 955 impl<T> PartialEq<T> for Ident 956 where 957 T: ?Sized + AsRef<str>, 958 { eq(&self, other: &T) -> bool959 fn eq(&self, other: &T) -> bool { 960 self.inner == other 961 } 962 } 963 964 impl Eq for Ident {} 965 966 impl PartialOrd for Ident { partial_cmp(&self, other: &Ident) -> Option<Ordering>967 fn partial_cmp(&self, other: &Ident) -> Option<Ordering> { 968 Some(self.cmp(other)) 969 } 970 } 971 972 impl Ord for Ident { cmp(&self, other: &Ident) -> Ordering973 fn cmp(&self, other: &Ident) -> Ordering { 974 self.to_string().cmp(&other.to_string()) 975 } 976 } 977 978 impl Hash for Ident { hash<H: Hasher>(&self, hasher: &mut H)979 fn hash<H: Hasher>(&self, hasher: &mut H) { 980 self.to_string().hash(hasher) 981 } 982 } 983 984 /// Prints the identifier as a string that should be losslessly convertible back 985 /// into the same identifier. 986 impl Display for Ident { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result987 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 988 Display::fmt(&self.inner, f) 989 } 990 } 991 992 impl Debug for Ident { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result993 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 994 Debug::fmt(&self.inner, f) 995 } 996 } 997 998 /// A literal string (`"hello"`), byte string (`b"hello"`), character (`'a'`), 999 /// byte character (`b'a'`), an integer or floating point number with or without 1000 /// a suffix (`1`, `1u8`, `2.3`, `2.3f32`). 1001 /// 1002 /// Boolean literals like `true` and `false` do not belong here, they are 1003 /// `Ident`s. 1004 #[derive(Clone)] 1005 pub struct Literal { 1006 inner: imp::Literal, 1007 _marker: Marker, 1008 } 1009 1010 macro_rules! suffixed_int_literals { 1011 ($($name:ident => $kind:ident,)*) => ($( 1012 /// Creates a new suffixed integer literal with the specified value. 1013 /// 1014 /// This function will create an integer like `1u32` where the integer 1015 /// value specified is the first part of the token and the integral is 1016 /// also suffixed at the end. Literals created from negative numbers may 1017 /// not survive roundtrips through `TokenStream` or strings and may be 1018 /// broken into two tokens (`-` and positive literal). 1019 /// 1020 /// Literals created through this method have the `Span::call_site()` 1021 /// span by default, which can be configured with the `set_span` method 1022 /// below. 1023 pub fn $name(n: $kind) -> Literal { 1024 Literal::_new(imp::Literal::$name(n)) 1025 } 1026 )*) 1027 } 1028 1029 macro_rules! unsuffixed_int_literals { 1030 ($($name:ident => $kind:ident,)*) => ($( 1031 /// Creates a new unsuffixed integer literal with the specified value. 1032 /// 1033 /// This function will create an integer like `1` where the integer 1034 /// value specified is the first part of the token. No suffix is 1035 /// specified on this token, meaning that invocations like 1036 /// `Literal::i8_unsuffixed(1)` are equivalent to 1037 /// `Literal::u32_unsuffixed(1)`. Literals created from negative numbers 1038 /// may not survive roundtrips through `TokenStream` or strings and may 1039 /// be broken into two tokens (`-` and positive literal). 1040 /// 1041 /// Literals created through this method have the `Span::call_site()` 1042 /// span by default, which can be configured with the `set_span` method 1043 /// below. 1044 pub fn $name(n: $kind) -> Literal { 1045 Literal::_new(imp::Literal::$name(n)) 1046 } 1047 )*) 1048 } 1049 1050 impl Literal { _new(inner: imp::Literal) -> Literal1051 fn _new(inner: imp::Literal) -> Literal { 1052 Literal { 1053 inner, 1054 _marker: Marker, 1055 } 1056 } 1057 _new_stable(inner: fallback::Literal) -> Literal1058 fn _new_stable(inner: fallback::Literal) -> Literal { 1059 Literal { 1060 inner: inner.into(), 1061 _marker: Marker, 1062 } 1063 } 1064 1065 suffixed_int_literals! { 1066 u8_suffixed => u8, 1067 u16_suffixed => u16, 1068 u32_suffixed => u32, 1069 u64_suffixed => u64, 1070 u128_suffixed => u128, 1071 usize_suffixed => usize, 1072 i8_suffixed => i8, 1073 i16_suffixed => i16, 1074 i32_suffixed => i32, 1075 i64_suffixed => i64, 1076 i128_suffixed => i128, 1077 isize_suffixed => isize, 1078 } 1079 1080 unsuffixed_int_literals! { 1081 u8_unsuffixed => u8, 1082 u16_unsuffixed => u16, 1083 u32_unsuffixed => u32, 1084 u64_unsuffixed => u64, 1085 u128_unsuffixed => u128, 1086 usize_unsuffixed => usize, 1087 i8_unsuffixed => i8, 1088 i16_unsuffixed => i16, 1089 i32_unsuffixed => i32, 1090 i64_unsuffixed => i64, 1091 i128_unsuffixed => i128, 1092 isize_unsuffixed => isize, 1093 } 1094 1095 /// Creates a new unsuffixed floating-point literal. 1096 /// 1097 /// This constructor is similar to those like `Literal::i8_unsuffixed` where 1098 /// the float's value is emitted directly into the token but no suffix is 1099 /// used, so it may be inferred to be a `f64` later in the compiler. 1100 /// Literals created from negative numbers may not survive rountrips through 1101 /// `TokenStream` or strings and may be broken into two tokens (`-` and 1102 /// positive literal). 1103 /// 1104 /// # Panics 1105 /// 1106 /// This function requires that the specified float is finite, for example 1107 /// if it is infinity or NaN this function will panic. f64_unsuffixed(f: f64) -> Literal1108 pub fn f64_unsuffixed(f: f64) -> Literal { 1109 assert!(f.is_finite()); 1110 Literal::_new(imp::Literal::f64_unsuffixed(f)) 1111 } 1112 1113 /// Creates a new suffixed floating-point literal. 1114 /// 1115 /// This constructor will create a literal like `1.0f64` where the value 1116 /// specified is the preceding part of the token and `f64` is the suffix of 1117 /// the token. This token will always be inferred to be an `f64` in the 1118 /// compiler. Literals created from negative numbers may not survive 1119 /// rountrips through `TokenStream` or strings and may be broken into two 1120 /// tokens (`-` and positive literal). 1121 /// 1122 /// # Panics 1123 /// 1124 /// This function requires that the specified float is finite, for example 1125 /// if it is infinity or NaN this function will panic. f64_suffixed(f: f64) -> Literal1126 pub fn f64_suffixed(f: f64) -> Literal { 1127 assert!(f.is_finite()); 1128 Literal::_new(imp::Literal::f64_suffixed(f)) 1129 } 1130 1131 /// Creates a new unsuffixed floating-point literal. 1132 /// 1133 /// This constructor is similar to those like `Literal::i8_unsuffixed` where 1134 /// the float's value is emitted directly into the token but no suffix is 1135 /// used, so it may be inferred to be a `f64` later in the compiler. 1136 /// Literals created from negative numbers may not survive rountrips through 1137 /// `TokenStream` or strings and may be broken into two tokens (`-` and 1138 /// positive literal). 1139 /// 1140 /// # Panics 1141 /// 1142 /// This function requires that the specified float is finite, for example 1143 /// if it is infinity or NaN this function will panic. f32_unsuffixed(f: f32) -> Literal1144 pub fn f32_unsuffixed(f: f32) -> Literal { 1145 assert!(f.is_finite()); 1146 Literal::_new(imp::Literal::f32_unsuffixed(f)) 1147 } 1148 1149 /// Creates a new suffixed floating-point literal. 1150 /// 1151 /// This constructor will create a literal like `1.0f32` where the value 1152 /// specified is the preceding part of the token and `f32` is the suffix of 1153 /// the token. This token will always be inferred to be an `f32` in the 1154 /// compiler. Literals created from negative numbers may not survive 1155 /// rountrips through `TokenStream` or strings and may be broken into two 1156 /// tokens (`-` and positive literal). 1157 /// 1158 /// # Panics 1159 /// 1160 /// This function requires that the specified float is finite, for example 1161 /// if it is infinity or NaN this function will panic. f32_suffixed(f: f32) -> Literal1162 pub fn f32_suffixed(f: f32) -> Literal { 1163 assert!(f.is_finite()); 1164 Literal::_new(imp::Literal::f32_suffixed(f)) 1165 } 1166 1167 /// String literal. string(string: &str) -> Literal1168 pub fn string(string: &str) -> Literal { 1169 Literal::_new(imp::Literal::string(string)) 1170 } 1171 1172 /// Character literal. character(ch: char) -> Literal1173 pub fn character(ch: char) -> Literal { 1174 Literal::_new(imp::Literal::character(ch)) 1175 } 1176 1177 /// Byte string literal. byte_string(s: &[u8]) -> Literal1178 pub fn byte_string(s: &[u8]) -> Literal { 1179 Literal::_new(imp::Literal::byte_string(s)) 1180 } 1181 1182 /// Returns the span encompassing this literal. span(&self) -> Span1183 pub fn span(&self) -> Span { 1184 Span::_new(self.inner.span()) 1185 } 1186 1187 /// Configures the span associated for this literal. set_span(&mut self, span: Span)1188 pub fn set_span(&mut self, span: Span) { 1189 self.inner.set_span(span.inner); 1190 } 1191 1192 /// Returns a `Span` that is a subset of `self.span()` containing only 1193 /// the source bytes in range `range`. Returns `None` if the would-be 1194 /// trimmed span is outside the bounds of `self`. 1195 /// 1196 /// Warning: the underlying [`proc_macro::Literal::subspan`] method is 1197 /// nightly-only. When called from within a procedural macro not using a 1198 /// nightly compiler, this method will always return `None`. 1199 /// 1200 /// [`proc_macro::Literal::subspan`]: https://doc.rust-lang.org/proc_macro/struct.Literal.html#method.subspan subspan<R: RangeBounds<usize>>(&self, range: R) -> Option<Span>1201 pub fn subspan<R: RangeBounds<usize>>(&self, range: R) -> Option<Span> { 1202 self.inner.subspan(range).map(Span::_new) 1203 } 1204 } 1205 1206 impl Debug for Literal { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result1207 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 1208 Debug::fmt(&self.inner, f) 1209 } 1210 } 1211 1212 impl Display for Literal { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result1213 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 1214 Display::fmt(&self.inner, f) 1215 } 1216 } 1217 1218 /// Public implementation details for the `TokenStream` type, such as iterators. 1219 pub mod token_stream { 1220 use crate::marker::Marker; 1221 use crate::{imp, TokenTree}; 1222 use std::fmt::{self, Debug}; 1223 1224 pub use crate::TokenStream; 1225 1226 /// An iterator over `TokenStream`'s `TokenTree`s. 1227 /// 1228 /// The iteration is "shallow", e.g. the iterator doesn't recurse into 1229 /// delimited groups, and returns whole groups as token trees. 1230 #[derive(Clone)] 1231 pub struct IntoIter { 1232 inner: imp::TokenTreeIter, 1233 _marker: Marker, 1234 } 1235 1236 impl Iterator for IntoIter { 1237 type Item = TokenTree; 1238 next(&mut self) -> Option<TokenTree>1239 fn next(&mut self) -> Option<TokenTree> { 1240 self.inner.next() 1241 } 1242 } 1243 1244 impl Debug for IntoIter { fmt(&self, f: &mut fmt::Formatter) -> fmt::Result1245 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { 1246 Debug::fmt(&self.inner, f) 1247 } 1248 } 1249 1250 impl IntoIterator for TokenStream { 1251 type Item = TokenTree; 1252 type IntoIter = IntoIter; 1253 into_iter(self) -> IntoIter1254 fn into_iter(self) -> IntoIter { 1255 IntoIter { 1256 inner: self.inner.into_iter(), 1257 _marker: Marker, 1258 } 1259 } 1260 } 1261 } 1262