11use hir:: Semantics ;
22use ide_db:: { RootDatabase , assists:: AssistId , source_change:: SourceChangeBuilder } ;
3- use syntax:: { AstNode , ast} ;
3+ use syntax:: {
4+ AstNode ,
5+ ast:: { self , Radix } ,
6+ } ;
47
5- use crate :: { AssistContext , Assists } ;
8+ use crate :: { AssistContext , Assists , utils :: add_group_separators } ;
69
710// Assist: add_explicit_enum_discriminant
811//
@@ -53,8 +56,9 @@ pub(crate) fn add_explicit_enum_discriminant(
5356 "Add explicit enum discriminants" ,
5457 enum_node. syntax ( ) . text_range ( ) ,
5558 |builder| {
59+ let mut radix = Radix :: Decimal ;
5660 for variant_node in variant_list. variants ( ) {
57- add_variant_discriminant ( & ctx. sema , builder, & variant_node) ;
61+ add_variant_discriminant ( & ctx. sema , builder, & variant_node, & mut radix ) ;
5862 }
5963 } ,
6064 ) ;
@@ -66,8 +70,10 @@ fn add_variant_discriminant(
6670 sema : & Semantics < ' _ , RootDatabase > ,
6771 builder : & mut SourceChangeBuilder ,
6872 variant_node : & ast:: Variant ,
73+ radix : & mut Radix ,
6974) {
70- if variant_node. expr ( ) . is_some ( ) {
75+ if let Some ( expr) = variant_node. expr ( ) {
76+ * radix = expr_radix ( & expr) . unwrap_or ( * radix) ;
7177 return ;
7278 }
7379
@@ -80,7 +86,24 @@ fn add_variant_discriminant(
8086
8187 let variant_range = variant_node. syntax ( ) . text_range ( ) ;
8288
83- builder. insert ( variant_range. end ( ) , format ! ( " = {discriminant}" ) ) ;
89+ let ( group_size, prefix, text) = match radix {
90+ Radix :: Binary => ( 4 , "0b" , format ! ( "{discriminant:b}" ) ) ,
91+ Radix :: Octal => ( 3 , "0o" , format ! ( "{discriminant:o}" ) ) ,
92+ Radix :: Decimal => ( 6 , "" , discriminant. to_string ( ) ) ,
93+ Radix :: Hexadecimal => ( 4 , "0x" , format ! ( "{discriminant:x}" ) ) ,
94+ } ;
95+ let pretty_num = add_group_separators ( & text, group_size) ;
96+ builder. insert ( variant_range. end ( ) , format ! ( " = {prefix}{pretty_num}" ) ) ;
97+ }
98+
99+ fn expr_radix ( expr : & ast:: Expr ) -> Option < Radix > {
100+ if let ast:: Expr :: Literal ( lit) = expr
101+ && let ast:: LiteralKind :: IntNumber ( num) = lit. kind ( )
102+ {
103+ Some ( num. radix ( ) )
104+ } else {
105+ None
106+ }
84107}
85108
86109#[ cfg( test) ]
@@ -172,9 +195,9 @@ enum TheEnum {
172195#[repr(i64)]
173196enum TheEnum {
174197 Foo = 1 << 63,
175- Bar = -9223372036854775807 ,
198+ Bar = -9_223372_036854_775807 ,
176199 Baz = 0x7fff_ffff_ffff_fffe,
177- Quux = 9223372036854775807 ,
200+ Quux = 0x7fff_ffff_ffff_ffff ,
178201}
179202"# ,
180203 ) ;
0 commit comments