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.rs56
1 files changed, 39 insertions, 17 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 23153b4c56..5cc110cf12 100644
--- a/crates/ide-assists/src/handlers/promote_local_to_const.rs
+++ b/crates/ide-assists/src/handlers/promote_local_to_const.rs
@@ -8,13 +8,10 @@ use ide_db::{
use stdx::to_upper_snake_case;
use syntax::{
ast::{self, make, HasName},
- AstNode, WalkEvent,
+ ted, AstNode, WalkEvent,
};
-use crate::{
- assist_context::{AssistContext, Assists},
- utils::{render_snippet, Cursor},
-};
+use crate::assist_context::{AssistContext, Assists};
// Assist: promote_local_to_const
//
@@ -70,29 +67,33 @@ pub(crate) fn promote_local_to_const(acc: &mut Assists, ctx: &AssistContext<'_>)
cov_mark::hit!(promote_local_non_const);
return None;
}
- let target = let_stmt.syntax().text_range();
+
acc.add(
AssistId("promote_local_to_const", AssistKind::Refactor),
"Promote local to constant",
- target,
- |builder| {
+ let_stmt.syntax().text_range(),
+ |edit| {
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 = make::name_ref(&name);
+
for usage in usages {
- builder.replace(usage.range, &name);
+ let Some(usage) = usage.name.as_name_ref().cloned() else { continue };
+ let usage = edit.make_mut(usage);
+ ted::replace(usage.syntax(), name.clone_for_update().syntax());
}
}
- let item = make::item_const(None, make::name(&name), make::ty(&ty), initializer);
- match ctx.config.snippet_cap.zip(item.name()) {
- Some((cap, name)) => builder.replace_snippet(
- cap,
- target,
- render_snippet(cap, item.syntax(), Cursor::Before(name.syntax())),
- ),
- None => builder.replace(target, item.to_string()),
+ let item = make::item_const(None, make::name(&name), make::ty(&ty), initializer)
+ .clone_for_update();
+ let let_stmt = edit.make_mut(let_stmt);
+
+ if let Some((cap, name)) = ctx.config.snippet_cap.zip(item.name()) {
+ edit.add_tabstop_before(cap, name);
}
+
+ ted::replace(let_stmt.syntax(), item.syntax());
},
)
}
@@ -158,6 +159,27 @@ fn foo() {
}
#[test]
+ fn multiple_uses() {
+ check_assist(
+ promote_local_to_const,
+ r"
+fn foo() {
+ let x$0 = 0;
+ let y = x;
+ let z = (x, x, x, x);
+}
+",
+ r"
+fn foo() {
+ const $0X: i32 = 0;
+ let y = X;
+ let z = (X, X, X, X);
+}
+",
+ );
+ }
+
+ #[test]
fn not_applicable_non_const_meth_call() {
cov_mark::check!(promote_local_non_const);
check_assist_not_applicable(