Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/inlay_hints/discriminant.rs')
| -rw-r--r-- | crates/ide/src/inlay_hints/discriminant.rs | 91 |
1 files changed, 51 insertions, 40 deletions
diff --git a/crates/ide/src/inlay_hints/discriminant.rs b/crates/ide/src/inlay_hints/discriminant.rs index f9047efaf1..9bff98f611 100644 --- a/crates/ide/src/inlay_hints/discriminant.rs +++ b/crates/ide/src/inlay_hints/discriminant.rs @@ -9,7 +9,8 @@ use ide_db::{base_db::FileId, famous_defs::FamousDefs, RootDatabase}; use syntax::ast::{self, AstNode, HasName}; use crate::{ - DiscriminantHints, InlayHint, InlayHintLabel, InlayHintsConfig, InlayKind, InlayTooltip, + DiscriminantHints, InlayHint, InlayHintLabel, InlayHintPosition, InlayHintsConfig, InlayKind, + InlayTooltip, }; pub(super) fn enum_hints( @@ -41,10 +42,11 @@ fn variant_hints( sema: &Semantics<'_, RootDatabase>, variant: &ast::Variant, ) -> Option<()> { - if variant.eq_token().is_some() { + if variant.expr().is_some() { return None; } + let eq_token = variant.eq_token(); let name = variant.name()?; let descended = sema.descend_node_into_attributes(variant.clone()).pop(); @@ -52,30 +54,39 @@ fn variant_hints( let v = sema.to_def(desc_pat)?; let d = v.eval(sema.db); + let range = match variant.field_list() { + Some(field_list) => name.syntax().text_range().cover(field_list.syntax().text_range()), + None => name.syntax().text_range(), + }; + let eq_ = if eq_token.is_none() { " =" } else { "" }; + let label = InlayHintLabel::simple( + match d { + Ok(x) => { + if x >= 10 { + format!("{eq_} {x} ({x:#X})") + } else { + format!("{eq_} {x}") + } + } + Err(_) => format!("{eq_} ?"), + }, + Some(InlayTooltip::String(match &d { + Ok(_) => "enum variant discriminant".into(), + Err(e) => format!("{e:?}").into(), + })), + None, + ); acc.push(InlayHint { - range: match variant.field_list() { - Some(field_list) => name.syntax().text_range().cover(field_list.syntax().text_range()), - None => name.syntax().text_range(), + range: match eq_token { + Some(t) => range.cover(t.text_range()), + _ => range, }, kind: InlayKind::Discriminant, - label: InlayHintLabel::simple( - match d { - Ok(x) => { - if x >= 10 { - format!("{x} ({x:#X})") - } else { - format!("{x}") - } - } - Err(_) => "?".into(), - }, - Some(InlayTooltip::String(match &d { - Ok(_) => "enum variant discriminant".into(), - Err(e) => format!("{e:?}").into(), - })), - None, - ), + label, text_edit: None, + position: InlayHintPosition::After, + pad_left: false, + pad_right: false, }); Some(()) @@ -113,14 +124,14 @@ mod tests { r#" enum Enum { Variant, -//^^^^^^^0 +//^^^^^^^ = 0$ Variant1, -//^^^^^^^^1 +//^^^^^^^^ = 1$ Variant2, -//^^^^^^^^2 +//^^^^^^^^ = 2$ Variant5 = 5, Variant6, -//^^^^^^^^6 +//^^^^^^^^ = 6$ } "#, ); @@ -128,14 +139,14 @@ enum Enum { r#" enum Enum { Variant, -//^^^^^^^0 +//^^^^^^^ = 0 Variant1, -//^^^^^^^^1 +//^^^^^^^^ = 1 Variant2, -//^^^^^^^^2 +//^^^^^^^^ = 2 Variant5 = 5, Variant6, -//^^^^^^^^6 +//^^^^^^^^ = 6 } "#, ); @@ -147,16 +158,16 @@ enum Enum { r#" enum Enum { Variant(), - //^^^^^^^^^0 + //^^^^^^^^^ = 0 Variant1, - //^^^^^^^^1 + //^^^^^^^^ = 1 Variant2 {}, - //^^^^^^^^^^^2 + //^^^^^^^^^^^ = 2 Variant3, - //^^^^^^^^3 + //^^^^^^^^ = 3 Variant5 = 5, Variant6, - //^^^^^^^^6 + //^^^^^^^^ = 6 } "#, ); @@ -180,16 +191,16 @@ enum Enum { r#" enum Enum { Variant(), - //^^^^^^^^^0 + //^^^^^^^^^ = 0 Variant1, - //^^^^^^^^1 + //^^^^^^^^ = 1 Variant2 {}, - //^^^^^^^^^^^2 + //^^^^^^^^^^^ = 2 Variant3, - //^^^^^^^^3 + //^^^^^^^^ = 3 Variant5 = 5, Variant6, - //^^^^^^^^6 + //^^^^^^^^ = 6 } "#, ); |