Skip to content

Commit a56e577

Browse files
authored
Merge pull request #20748 from A4-Tacks/migrate-arith-op-prec
Migrate `replace_arith_op` assist to use `SyntaxEditor`
2 parents 6280982 + 918d3b8 commit a56e577

File tree

1 file changed

+15
-12
lines changed

1 file changed

+15
-12
lines changed

crates/ide-assists/src/handlers/replace_arith_op.rs

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use ide_db::assists::{AssistId, GroupLabel};
22
use syntax::{
3-
AstNode, TextRange,
4-
ast::{self, ArithOp, BinaryOp},
3+
AstNode,
4+
ast::{self, ArithOp, BinaryOp, syntax_factory::SyntaxFactory},
55
};
66

77
use crate::assist_context::{AssistContext, Assists};
@@ -71,28 +71,31 @@ pub(crate) fn replace_arith_with_wrapping(
7171

7272
fn replace_arith(acc: &mut Assists, ctx: &AssistContext<'_>, kind: ArithKind) -> Option<()> {
7373
let (lhs, op, rhs) = parse_binary_op(ctx)?;
74+
let op_expr = lhs.syntax().parent()?;
7475

7576
if !is_primitive_int(ctx, &lhs) || !is_primitive_int(ctx, &rhs) {
7677
return None;
7778
}
7879

79-
let start = lhs.syntax().text_range().start();
80-
let end = rhs.syntax().text_range().end();
81-
let range = TextRange::new(start, end);
82-
8380
acc.add_group(
8481
&GroupLabel("Replace arithmetic...".into()),
8582
kind.assist_id(),
8683
kind.label(),
87-
range,
84+
op_expr.text_range(),
8885
|builder| {
86+
let mut edit = builder.make_editor(rhs.syntax());
87+
let make = SyntaxFactory::with_mappings();
8988
let method_name = kind.method_name(op);
9089

91-
if lhs.precedence().needs_parentheses_in(ast::prec::ExprPrecedence::Postfix) {
92-
builder.replace(range, format!("({lhs}).{method_name}({rhs})"))
93-
} else {
94-
builder.replace(range, format!("{lhs}.{method_name}({rhs})"))
95-
}
90+
let needs_parentheses =
91+
lhs.precedence().needs_parentheses_in(ast::prec::ExprPrecedence::Postfix);
92+
let receiver = if needs_parentheses { make.expr_paren(lhs).into() } else { lhs };
93+
let arith_expr =
94+
make.expr_method_call(receiver, make.name_ref(&method_name), make.arg_list([rhs]));
95+
edit.replace(op_expr, arith_expr.syntax());
96+
97+
edit.add_mappings(make.finish_with_mappings());
98+
builder.add_file_edits(ctx.vfs_file_id(), edit);
9699
},
97100
)
98101
}

0 commit comments

Comments
 (0)