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