Unnamed repository; edit this file 'description' to name the repository.
internal: add SyntaxEditor-based replace_expr for RecordExprField
| -rw-r--r-- | crates/ide-assists/src/handlers/inline_call.rs | 7 | ||||
| -rw-r--r-- | crates/syntax/src/ast/edit_in_place.rs | 19 |
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 { |