Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22447 from A4-Tacks/extract-var-in-macro-rep-ins
fix: Fix extract variable in token tree replace range
| -rw-r--r-- | crates/ide-assists/src/handlers/extract_variable.rs | 31 |
1 files changed, 27 insertions, 4 deletions
diff --git a/crates/ide-assists/src/handlers/extract_variable.rs b/crates/ide-assists/src/handlers/extract_variable.rs index d4a0490f16..e1b91c9e89 100644 --- a/crates/ide-assists/src/handlers/extract_variable.rs +++ b/crates/ide-assists/src/handlers/extract_variable.rs @@ -13,7 +13,10 @@ use syntax::{ syntax_editor::{Element, Position}, }; -use crate::{AssistContext, AssistId, Assists, utils::is_body_const}; +use crate::{ + AssistContext, AssistId, Assists, + utils::{cover_edit_range, is_body_const}, +}; // Assist: extract_variable // @@ -107,9 +110,7 @@ pub(crate) fn extract_variable(acc: &mut Assists, ctx: &AssistContext<'_, '_>) - .skip_while(|it| !it.text_range().contains_range(range)) .find_map(valid_target_expr(ctx))?; let original_range = ctx.sema.original_range(expr.syntax()); - let (first, last) = extract_token_range_of(&node, original_range.range)?; - let to_extract = first.syntax_element()..=last.syntax_element(); - (to_extract, expr) + (cover_edit_range(&node, original_range.range), expr) } else { let expr = node .descendants() @@ -3004,4 +3005,26 @@ fn main() { "Extract into variable", ); } + + #[test] + fn regression_22441() { + check_assist_by_label( + extract_variable, + r#" +//- minicore: option, write +fn main() { + let maybe_str = Some("world"); + write!((), "Hello, {}!", $0maybe_str.unwrap()$0); +} +"#, + r#" +fn main() { + let maybe_str = Some("world"); + let $0var_name = maybe_str.unwrap(); + write!((), "Hello, {}!", var_name); +} +"#, + "Extract into variable", + ); + } } |