@@ -5,8 +5,7 @@ use crate::token::{self, Token};
5
5
use rustc_lexer:: unescape:: { byte_from_char, unescape_byte, unescape_char, unescape_literal, Mode } ;
6
6
use rustc_span:: symbol:: { kw, sym, Symbol } ;
7
7
use rustc_span:: Span ;
8
- use std:: ascii;
9
- use std:: str;
8
+ use std:: { ascii, fmt, str} ;
10
9
11
10
// Escapes a string, represented as a symbol. Reuses the original symbol,
12
11
// avoiding interning, if no changes are required.
@@ -162,54 +161,60 @@ impl LitKind {
162
161
token:: Err => LitKind :: Err ,
163
162
} )
164
163
}
164
+ }
165
165
166
- /// Synthesizes a token from a semantic literal.
167
- /// This function is used when the original token doesn't exist (e.g. the literal is created
168
- /// by an AST-based macro) or unavailable (e.g. from HIR pretty-printing).
169
- pub fn synthesize_token_lit ( & self ) -> token:: Lit {
170
- let ( kind, symbol, suffix) = match * self {
171
- LitKind :: Str ( symbol, ast:: StrStyle :: Cooked ) => {
172
- ( token:: Str , escape_string_symbol ( symbol) , None )
166
+ impl fmt:: Display for LitKind {
167
+ fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
168
+ match * self {
169
+ LitKind :: Byte ( b) => {
170
+ let b: String = ascii:: escape_default ( b) . map ( Into :: < char > :: into) . collect ( ) ;
171
+ write ! ( f, "b'{}'" , b) ?;
173
172
}
174
- LitKind :: Str ( symbol, ast:: StrStyle :: Raw ( n) ) => ( token:: StrRaw ( n) , symbol, None ) ,
175
- LitKind :: ByteStr ( ref bytes, ast:: StrStyle :: Cooked ) => {
176
- ( token:: ByteStr , escape_byte_str_symbol ( bytes) , None )
173
+ LitKind :: Char ( ch) => write ! ( f, "'{}'" , escape_char_symbol( ch) ) ?,
174
+ LitKind :: Str ( sym, StrStyle :: Cooked ) => write ! ( f, "\" {}\" " , escape_string_symbol( sym) ) ?,
175
+ LitKind :: Str ( sym, StrStyle :: Raw ( n) ) => write ! (
176
+ f,
177
+ "r{delim}\" {string}\" {delim}" ,
178
+ delim = "#" . repeat( n as usize ) ,
179
+ string = sym
180
+ ) ?,
181
+ LitKind :: ByteStr ( ref bytes, StrStyle :: Cooked ) => {
182
+ write ! ( f, "b\" {}\" " , escape_byte_str_symbol( bytes) ) ?
177
183
}
178
- LitKind :: ByteStr ( ref bytes, ast :: StrStyle :: Raw ( n) ) => {
184
+ LitKind :: ByteStr ( ref bytes, StrStyle :: Raw ( n) ) => {
179
185
// Unwrap because raw byte string literals can only contain ASCII.
180
- let string = str:: from_utf8 ( bytes) . unwrap ( ) ;
181
- ( token:: ByteStrRaw ( n) , Symbol :: intern ( & string) , None )
182
- }
183
- LitKind :: Byte ( byte) => {
184
- let string: String = ascii:: escape_default ( byte) . map ( Into :: < char > :: into) . collect ( ) ;
185
- ( token:: Byte , Symbol :: intern ( & string) , None )
186
+ let symbol = str:: from_utf8 ( bytes) . unwrap ( ) ;
187
+ write ! (
188
+ f,
189
+ "br{delim}\" {string}\" {delim}" ,
190
+ delim = "#" . repeat( n as usize ) ,
191
+ string = symbol
192
+ ) ?;
186
193
}
187
- LitKind :: Char ( ch) => ( token:: Char , escape_char_symbol ( ch) , None ) ,
188
194
LitKind :: Int ( n, ty) => {
189
- let suffix = match ty {
190
- ast :: LitIntType :: Unsigned ( ty ) => Some ( ty . name ( ) ) ,
191
- ast:: LitIntType :: Signed ( ty) => Some ( ty. name ( ) ) ,
192
- ast:: LitIntType :: Unsuffixed => None ,
193
- } ;
194
- ( token :: Integer , sym :: integer ( n ) , suffix )
195
+ write ! ( f , "{}" , n ) ? ;
196
+ match ty {
197
+ ast:: LitIntType :: Unsigned ( ty) => write ! ( f , "{}" , ty. name( ) ) ? ,
198
+ ast:: LitIntType :: Signed ( ty ) => write ! ( f , "{}" , ty . name ( ) ) ? ,
199
+ ast :: LitIntType :: Unsuffixed => { }
200
+ }
195
201
}
196
202
LitKind :: Float ( symbol, ty) => {
197
- let suffix = match ty {
198
- ast :: LitFloatType :: Suffixed ( ty ) => Some ( ty . name ( ) ) ,
199
- ast:: LitFloatType :: Unsuffixed => None ,
200
- } ;
201
- ( token :: Float , symbol , suffix )
203
+ write ! ( f , "{}" , symbol ) ? ;
204
+ match ty {
205
+ ast:: LitFloatType :: Suffixed ( ty ) => write ! ( f , "{}" , ty . name ( ) ) ? ,
206
+ ast :: LitFloatType :: Unsuffixed => { }
207
+ }
202
208
}
203
- LitKind :: Bool ( value) => {
204
- let symbol = if value { kw:: True } else { kw:: False } ;
205
- ( token:: Bool , symbol, None )
209
+ LitKind :: Bool ( b) => write ! ( f, "{}" , if b { "true" } else { "false" } ) ?,
210
+ LitKind :: Err => {
211
+ // This only shows up in places like `-Zunpretty=hir` output, so we
212
+ // don't bother to produce something useful.
213
+ write ! ( f, "<bad-literal>" ) ?;
206
214
}
207
- // This only shows up in places like `-Zunpretty=hir` output, so we
208
- // don't bother to produce something useful.
209
- LitKind :: Err => ( token:: Err , Symbol :: intern ( "<bad-literal>" ) , None ) ,
210
- } ;
215
+ }
211
216
212
- token :: Lit :: new ( kind , symbol , suffix )
217
+ Ok ( ( ) )
213
218
}
214
219
}
215
220
0 commit comments