Skip to content

Commit 80f5022

Browse files
authored
Merge pull request #20218 from Hmikihiro/migrate_convert_match_to_let_else
Migrate `convert_match_to_let_else` assist to use `SyntaxEditor`
2 parents 56f1403 + b273929 commit 80f5022

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

src/tools/rust-analyzer/crates/ide-assists/src/handlers/convert_match_to_let_else.rs

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
use ide_db::defs::{Definition, NameRefClass};
22
use syntax::{
33
AstNode, SyntaxNode,
4-
ast::{self, HasName, Name},
5-
ted,
4+
ast::{self, HasName, Name, syntax_factory::SyntaxFactory},
5+
syntax_editor::SyntaxEditor,
66
};
77

88
use crate::{
@@ -121,34 +121,36 @@ fn find_extracted_variable(ctx: &AssistContext<'_>, arm: &ast::MatchArm) -> Opti
121121

122122
// Rename `extracted` with `binding` in `pat`.
123123
fn rename_variable(pat: &ast::Pat, extracted: &[Name], binding: ast::Pat) -> SyntaxNode {
124-
let syntax = pat.syntax().clone_for_update();
124+
let syntax = pat.syntax().clone_subtree();
125+
let mut editor = SyntaxEditor::new(syntax.clone());
126+
let make = SyntaxFactory::with_mappings();
125127
let extracted = extracted
126128
.iter()
127-
.map(|e| syntax.covering_element(e.syntax().text_range()))
129+
.map(|e| e.syntax().text_range() - pat.syntax().text_range().start())
130+
.map(|r| syntax.covering_element(r))
128131
.collect::<Vec<_>>();
129132
for extracted_syntax in extracted {
130133
// If `extracted` variable is a record field, we should rename it to `binding`,
131134
// otherwise we just need to replace `extracted` with `binding`.
132-
133135
if let Some(record_pat_field) =
134136
extracted_syntax.ancestors().find_map(ast::RecordPatField::cast)
135137
{
136138
if let Some(name_ref) = record_pat_field.field_name() {
137-
ted::replace(
139+
editor.replace(
138140
record_pat_field.syntax(),
139-
ast::make::record_pat_field(
140-
ast::make::name_ref(&name_ref.text()),
141-
binding.clone(),
141+
make.record_pat_field(
142+
make.name_ref(&name_ref.text()),
143+
binding.clone_for_update(),
142144
)
143-
.syntax()
144-
.clone_for_update(),
145+
.syntax(),
145146
);
146147
}
147148
} else {
148-
ted::replace(extracted_syntax, binding.clone().syntax().clone_for_update());
149+
editor.replace(extracted_syntax, binding.syntax().clone_for_update());
149150
}
150151
}
151-
syntax
152+
editor.add_mappings(make.finish_with_mappings());
153+
editor.finish().new_root().clone()
152154
}
153155

154156
#[cfg(test)]

0 commit comments

Comments
 (0)