Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/add_explicit_enum_discriminant.rs')
-rw-r--r--crates/ide-assists/src/handlers/add_explicit_enum_discriminant.rs37
1 files changed, 30 insertions, 7 deletions
diff --git a/crates/ide-assists/src/handlers/add_explicit_enum_discriminant.rs b/crates/ide-assists/src/handlers/add_explicit_enum_discriminant.rs
index 10b0879e63..7960373e61 100644
--- a/crates/ide-assists/src/handlers/add_explicit_enum_discriminant.rs
+++ b/crates/ide-assists/src/handlers/add_explicit_enum_discriminant.rs
@@ -1,8 +1,11 @@
use hir::Semantics;
use ide_db::{RootDatabase, assists::AssistId, source_change::SourceChangeBuilder};
-use syntax::{AstNode, ast};
+use syntax::{
+ AstNode,
+ ast::{self, Radix},
+};
-use crate::{AssistContext, Assists};
+use crate::{AssistContext, Assists, utils::add_group_separators};
// Assist: add_explicit_enum_discriminant
//
@@ -53,8 +56,9 @@ pub(crate) fn add_explicit_enum_discriminant(
"Add explicit enum discriminants",
enum_node.syntax().text_range(),
|builder| {
+ let mut radix = Radix::Decimal;
for variant_node in variant_list.variants() {
- add_variant_discriminant(&ctx.sema, builder, &variant_node);
+ add_variant_discriminant(&ctx.sema, builder, &variant_node, &mut radix);
}
},
);
@@ -66,8 +70,10 @@ fn add_variant_discriminant(
sema: &Semantics<'_, RootDatabase>,
builder: &mut SourceChangeBuilder,
variant_node: &ast::Variant,
+ radix: &mut Radix,
) {
- if variant_node.expr().is_some() {
+ if let Some(expr) = variant_node.expr() {
+ *radix = expr_radix(&expr).unwrap_or(*radix);
return;
}
@@ -80,7 +86,24 @@ fn add_variant_discriminant(
let variant_range = variant_node.syntax().text_range();
- builder.insert(variant_range.end(), format!(" = {discriminant}"));
+ let (group_size, prefix, text) = match radix {
+ Radix::Binary => (4, "0b", format!("{discriminant:b}")),
+ Radix::Octal => (3, "0o", format!("{discriminant:o}")),
+ Radix::Decimal => (6, "", discriminant.to_string()),
+ Radix::Hexadecimal => (4, "0x", format!("{discriminant:x}")),
+ };
+ let pretty_num = add_group_separators(&text, group_size);
+ builder.insert(variant_range.end(), format!(" = {prefix}{pretty_num}"));
+}
+
+fn expr_radix(expr: &ast::Expr) -> Option<Radix> {
+ if let ast::Expr::Literal(lit) = expr
+ && let ast::LiteralKind::IntNumber(num) = lit.kind()
+ {
+ Some(num.radix())
+ } else {
+ None
+ }
}
#[cfg(test)]
@@ -172,9 +195,9 @@ enum TheEnum {
#[repr(i64)]
enum TheEnum {
Foo = 1 << 63,
- Bar = -9223372036854775807,
+ Bar = -9_223372_036854_775807,
Baz = 0x7fff_ffff_ffff_fffe,
- Quux = 9223372036854775807,
+ Quux = 0x7fff_ffff_ffff_ffff,
}
"#,
);