Skip to content

Commit 8033dad

Browse files
committed
Add pretty number for add_explicit_enum_discriminant
Example --- **Input**: ```rust #[repr(i64)] enum TheEnum { Foo = 1 << 63, Bar, Baz$0 = 0x7fff_ffff_ffff_fffe, Quux, } ``` **Before this PR**: ```rust #[repr(i64)] enum TheEnum { Foo = 1 << 63, Bar = -9223372036854775807, Baz = 0x7fff_ffff_ffff_fffe, Quux = 9223372036854775807, } ``` **After this PR**: ```rust #[repr(i64)] enum TheEnum { Foo = 1 << 63, Bar = -9_223372_036854_775807, Baz = 0x7fff_ffff_ffff_fffe, Quux = 0x7fff_ffff_ffff_ffff, } ```
1 parent c937fcc commit 8033dad

File tree

3 files changed

+43
-20
lines changed

3 files changed

+43
-20
lines changed

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

Lines changed: 30 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
use hir::Semantics;
22
use 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)]
173196
enum 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
);

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

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use syntax::{AstToken, ast, ast::Radix};
22

3-
use crate::{AssistContext, AssistId, Assists, GroupLabel};
3+
use crate::{AssistContext, AssistId, Assists, GroupLabel, utils::add_group_separators};
44

55
const MIN_NUMBER_OF_DIGITS_TO_FORMAT: usize = 5;
66

@@ -70,18 +70,6 @@ const fn group_size(r: Radix) -> usize {
7070
}
7171
}
7272

73-
fn add_group_separators(s: &str, group_size: usize) -> String {
74-
let mut chars = Vec::new();
75-
for (i, ch) in s.chars().filter(|&ch| ch != '_').rev().enumerate() {
76-
if i > 0 && i % group_size == 0 {
77-
chars.push('_');
78-
}
79-
chars.push(ch);
80-
}
81-
82-
chars.into_iter().rev().collect()
83-
}
84-
8573
#[cfg(test)]
8674
mod tests {
8775
use crate::tests::{check_assist_by_label, check_assist_not_applicable, check_assist_target};

crates/ide-assists/src/utils.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1080,6 +1080,18 @@ fn test_string_prefix() {
10801080
assert_eq!(Some("r"), string_prefix(r##"r#""#"##));
10811081
}
10821082

1083+
pub(crate) fn add_group_separators(s: &str, group_size: usize) -> String {
1084+
let mut chars = Vec::new();
1085+
for (i, ch) in s.chars().filter(|&ch| ch != '_').rev().enumerate() {
1086+
if i > 0 && i % group_size == 0 && ch != '-' {
1087+
chars.push('_');
1088+
}
1089+
chars.push(ch);
1090+
}
1091+
1092+
chars.into_iter().rev().collect()
1093+
}
1094+
10831095
/// Replaces the record expression, handling field shorthands including inside macros.
10841096
pub(crate) fn replace_record_field_expr(
10851097
ctx: &AssistContext<'_>,

0 commit comments

Comments
 (0)