@@ -15,7 +15,7 @@ use ide_db::{
15
15
FxIndexSet , RootDatabase ,
16
16
} ;
17
17
use itertools:: Itertools ;
18
- use syntax:: { ast, AstNode , SyntaxKind :: * , SyntaxNode , T } ;
18
+ use syntax:: { ast, match_ast , AstNode , AstToken , SyntaxKind :: * , SyntaxNode , T } ;
19
19
20
20
use crate :: {
21
21
doc_links:: token_as_doc_comment,
@@ -268,6 +268,64 @@ fn hover_simple(
268
268
let c = token. parent ( ) . and_then ( |x| x. parent ( ) ) . and_then ( ast:: ClosureExpr :: cast) ?;
269
269
render:: closure_expr ( sema, config, c)
270
270
} )
271
+ } )
272
+ // tokens
273
+ . or_else ( || {
274
+ let mut res = HoverResult :: default ( ) ;
275
+ match_ast ! {
276
+ match original_token {
277
+ ast:: String ( string) => {
278
+ res. markup = Markup :: fenced_block_text( format_args!( "{}" , string. value( ) ?) ) ;
279
+ } ,
280
+ ast:: ByteString ( string) => {
281
+ res. markup = Markup :: fenced_block_text( format_args!( "{:?}" , string. value( ) ?) ) ;
282
+ } ,
283
+ ast:: CString ( string) => {
284
+ let val = string. value( ) ?;
285
+ res. markup = Markup :: fenced_block_text( format_args!( "{}" , std:: str :: from_utf8( val. as_ref( ) ) . ok( ) ?) ) ;
286
+ } ,
287
+ ast:: Char ( char ) => {
288
+ let mut res = HoverResult :: default ( ) ;
289
+ res. markup = Markup :: fenced_block_text( format_args!( "{}" , char . value( ) ?) ) ;
290
+ } ,
291
+ ast:: Byte ( byte) => {
292
+ res. markup = Markup :: fenced_block_text( format_args!( "0x{:X}" , byte. value( ) ?) ) ;
293
+ } ,
294
+ ast:: FloatNumber ( num) => {
295
+ res. markup = if num. suffix( ) == Some ( "f32" ) {
296
+ match num. value_f32( ) {
297
+ Ok ( num) => {
298
+ Markup :: fenced_block_text( format_args!( "{num} (bits: 0x{:X})" , num. to_bits( ) ) )
299
+ } ,
300
+ Err ( e) => {
301
+ Markup :: fenced_block_text( format_args!( "{e}" ) )
302
+ } ,
303
+ }
304
+ } else {
305
+ match num. value( ) {
306
+ Ok ( num) => {
307
+ Markup :: fenced_block_text( format_args!( "{num} (bits: 0x{:X})" , num. to_bits( ) ) )
308
+ } ,
309
+ Err ( e) => {
310
+ Markup :: fenced_block_text( format_args!( "{e}" ) )
311
+ } ,
312
+ }
313
+ } ;
314
+ } ,
315
+ ast:: IntNumber ( num) => {
316
+ res. markup = match num. value( ) {
317
+ Ok ( num) => {
318
+ Markup :: fenced_block_text( format_args!( "{num} (0x{num:X}|0x{num:b})" ) )
319
+ } ,
320
+ Err ( e) => {
321
+ Markup :: fenced_block_text( format_args!( "{e}" ) )
322
+ } ,
323
+ } ;
324
+ } ,
325
+ _ => return None
326
+ }
327
+ }
328
+ Some ( res)
271
329
} ) ;
272
330
273
331
result. map ( |mut res : HoverResult | {
0 commit comments