Unnamed repository; edit this file 'description' to name the repository.
internal: add SyntaxEditor-based replace_expr for RecordExprField
albab-hasan 3 weeks ago
parent 5906877 · commit 722f32c
-rw-r--r--crates/ide-assists/src/handlers/inline_call.rs7
-rw-r--r--crates/syntax/src/ast/edit_in_place.rs19
2 files changed, 20 insertions, 6 deletions
diff --git a/crates/ide-assists/src/handlers/inline_call.rs b/crates/ide-assists/src/handlers/inline_call.rs
index 9273ad4cc5..6e45f537e4 100644
--- a/crates/ide-assists/src/handlers/inline_call.rs
+++ b/crates/ide-assists/src/handlers/inline_call.rs
@@ -560,12 +560,7 @@ fn inline(
let inline_direct = |editor: &SyntaxEditor, usage: &PathExpr, replacement: &ast::Expr| {
if let Some(field) = path_expr_as_record_field(usage) {
cov_mark::hit!(inline_call_inline_direct_field);
- let field_name = field.field_name().unwrap();
- let new_field = editor.make().record_expr_field(
- editor.make().name_ref(&field_name.text()),
- Some(replacement.clone()),
- );
- editor.replace(field.syntax(), new_field.syntax());
+ field.replace_expr_with_editor(editor, replacement.clone());
} else {
editor.replace(usage.syntax(), replacement.syntax());
}
diff --git a/crates/syntax/src/ast/edit_in_place.rs b/crates/syntax/src/ast/edit_in_place.rs
index 46ea4daba8..5396826394 100644
--- a/crates/syntax/src/ast/edit_in_place.rs
+++ b/crates/syntax/src/ast/edit_in_place.rs
@@ -10,6 +10,7 @@ use crate::{
SyntaxNode, SyntaxToken,
algo::{self, neighbor},
ast::{self, edit::IndentLevel, make},
+ syntax_editor::SyntaxEditor,
ted,
};
@@ -451,6 +452,24 @@ impl ast::RecordExprField {
ted::insert_all_raw(ted::Position::last_child_of(self.syntax()), children);
}
}
+
+ /// [`SyntaxEditor`]-based equivalent of [`replace_expr`](Self::replace_expr).
+ pub fn replace_expr_with_editor(&self, editor: &SyntaxEditor, expr: ast::Expr) {
+ if self.name_ref().is_some() {
+ if let Some(prev) = self.expr() {
+ editor.replace(prev.syntax(), expr.syntax());
+ }
+ } else if let Some(ast::Expr::PathExpr(path_expr)) = self.expr()
+ && let Some(path) = path_expr.path()
+ && let Some(name_ref) = path.as_single_name_ref()
+ {
+ // shorthand `{ x }` → expand to `{ x: expr }`
+ let new_field = editor
+ .make()
+ .record_expr_field(editor.make().name_ref(&name_ref.text()), Some(expr));
+ editor.replace(self.syntax(), new_field.syntax());
+ }
+ }
}
impl ast::RecordPatFieldList {