Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/promote_local_to_const.rs')
-rw-r--r--crates/ide-assists/src/handlers/promote_local_to_const.rs26
1 files changed, 22 insertions, 4 deletions
diff --git a/crates/ide-assists/src/handlers/promote_local_to_const.rs b/crates/ide-assists/src/handlers/promote_local_to_const.rs
index 23c88e65d6..5dcda1deb0 100644
--- a/crates/ide-assists/src/handlers/promote_local_to_const.rs
+++ b/crates/ide-assists/src/handlers/promote_local_to_const.rs
@@ -63,6 +63,11 @@ pub(crate) fn promote_local_to_const(acc: &mut Assists, ctx: &AssistContext<'_,
return None;
}
+ let const_name = to_upper_snake_case(&name.to_string());
+ if const_name.is_empty() || const_name.chars().all(|c| c == '_') {
+ return None;
+ }
+
acc.add(
AssistId::refactor("promote_local_to_const"),
"Promote local to constant",
@@ -70,15 +75,14 @@ pub(crate) fn promote_local_to_const(acc: &mut Assists, ctx: &AssistContext<'_,
|edit| {
let editor = edit.make_editor(let_stmt.syntax());
let make = editor.make();
- let name = to_upper_snake_case(&name.to_string());
let usages = Definition::Local(local).usages(&ctx.sema).all();
if let Some(usages) = usages.references.get(&ctx.file_id()) {
- let name_ref = make.name_ref(&name);
+ let name_ref = make.name_ref(&const_name);
for usage in usages {
let Some(usage_name) = usage.name.as_name_ref().cloned() else { continue };
if let Some(record_field) = ast::RecordExprField::for_name_ref(&usage_name) {
- let path = make.ident_path(&name);
+ let path = make.ident_path(&const_name);
let name_expr = make.expr_path(path);
utils::replace_record_field_expr(ctx, edit, record_field, name_expr);
} else {
@@ -88,7 +92,8 @@ pub(crate) fn promote_local_to_const(acc: &mut Assists, ctx: &AssistContext<'_,
}
}
- let item = make.item_const(None, None, make.name(&name), make.ty(&ty), initializer);
+ let item =
+ make.item_const(None, None, make.name(&const_name), make.ty(&ty), initializer);
if let Some((cap, name)) = ctx.config.snippet_cap.zip(item.name()) {
let tabstop = edit.make_tabstop_before(cap);
@@ -293,6 +298,19 @@ fn foo() {
}
#[test]
+ fn not_applicable_when_name_converts_to_all_underscores() {
+ check_assist_not_applicable(
+ promote_local_to_const,
+ r"
+fn foo() {
+ let _$0_ = 0;
+ __;
+}
+",
+ );
+ }
+
+ #[test]
fn not_applicable_non_simple_ident() {
cov_mark::check!(promote_local_non_simple_ident);
check_assist_not_applicable(