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.rs | 26 |
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( |