@@ -15,7 +15,7 @@ use ide_db::{
1515 FxIndexSet , RootDatabase ,
1616} ;
1717use itertools:: Itertools ;
18- use syntax:: { ast, AstNode , SyntaxKind :: * , SyntaxNode , T } ;
18+ use syntax:: { ast, match_ast , AstNode , AstToken , SyntaxKind :: * , SyntaxNode , T } ;
1919
2020use crate :: {
2121 doc_links:: token_as_doc_comment,
@@ -268,6 +268,64 @@ fn hover_simple(
268268 let c = token. parent ( ) . and_then ( |x| x. parent ( ) ) . and_then ( ast:: ClosureExpr :: cast) ?;
269269 render:: closure_expr ( sema, config, c)
270270 } )
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)
271329 } ) ;
272330
273331 result. map ( |mut res : HoverResult | {
0 commit comments