Skip to content

Commit 384488c

Browse files
committed
feat: Hover for literals showing additional value information
1 parent 6584e63 commit 384488c

File tree

6 files changed

+377
-25
lines changed

6 files changed

+377
-25
lines changed

crates/hir/src/semantics.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -433,7 +433,7 @@ impl<'db> SemanticsImpl<'db> {
433433
.find_map(|token| {
434434
self.resolve_offset_in_format_args(
435435
ast::String::cast(token)?,
436-
offset - quote.end(),
436+
offset.checked_sub(quote.end())?,
437437
)
438438
})
439439
.map(|(range, res)| (range + quote.end(), res));

crates/ide-assists/src/handlers/convert_integer_literal.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ pub(crate) fn convert_integer_literal(acc: &mut Assists, ctx: &AssistContext<'_>
2020
_ => return None,
2121
};
2222
let radix = literal.radix();
23-
let value = literal.value()?;
23+
let value = literal.value().ok()?;
2424
let suffix = literal.suffix();
2525

2626
let range = literal.syntax().text_range();

crates/ide/src/hover.rs

+59-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ use ide_db::{
1515
FxIndexSet, RootDatabase,
1616
};
1717
use itertools::Itertools;
18-
use syntax::{ast, AstNode, SyntaxKind::*, SyntaxNode, T};
18+
use syntax::{ast, match_ast, AstNode, AstToken, SyntaxKind::*, SyntaxNode, T};
1919

2020
use 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

Comments
 (0)