1use crate::token::Token;
2use crate::Entry;
3use crate::TokenStream;
4
5use std::fmt;
6
7impl fmt::Display for TokenStream {
8 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
9 let mut last_token_end = usize::MAX;
10 let mut this_token_span;
11 for token in &self.tokens {
12 let string = match token {
13 Entry::Error(_) => return Err(fmt::Error),
14 Entry::Ident(ident) => {
15 this_token_span = ident.span.clone();
16 ident.string().to_owned()
17 }
18 Entry::Punct(punct) => {
19 this_token_span = punct.span.clone();
20 char::from(punct.kind).to_string()
21 }
22 Entry::WhiteSpace(whitespace) => {
23 this_token_span = whitespace.span().clone();
24 whitespace.display()
25 }
26 #[cfg(feature = "scan-strings")]
27 Entry::LitStrDoubleQuote(str) => {
28 this_token_span = str.span().clone();
29 format!(r#""{}""#, str.string())
30 }
31 #[cfg(feature = "scan-strings")]
32 Entry::LitStrSingleQuote(str) => {
33 this_token_span = str.span().clone();
34 format!("'{}'", str.string())
35 }
36 };
37 for _ in last_token_end..this_token_span.start {
38 write!(f, " ")?;
39 }
40 write!(f, "{string}")?;
41 last_token_end = this_token_span.end;
42 }
43
44 Ok(())
45 }
46}