about summary refs log tree commit diff
diff options
context:
space:
mode:
authorA4-Tacks <wdsjxhno1001@163.com>2025-09-05 06:30:28 +0800
committerA4-Tacks <wdsjxhno1001@163.com>2025-09-05 06:30:28 +0800
commitec34e8e69fb2e133e6ec0ebc87443f6fa8bda092 (patch)
treef98a890a50e60ea4a949eee93553e33ef246b775
parentab5113a316959f2558f03a7bf590e967602f02df (diff)
downloadrust-ec34e8e69fb2e133e6ec0ebc87443f6fa8bda092.tar.gz
rust-ec34e8e69fb2e133e6ec0ebc87443f6fa8bda092.zip
Fix precedence parenthesis for replace_arith_op
Example
---
```rust
fn main() {
    let x = 1*x $0+ 2;
}
```

**Before this PR**:

```rust
fn main() {
    let x = 1*x.wrapping_add(2);
}
```

**After this PR**:

```rust
fn main() {
    let x = (1*x).wrapping_add(2);
}
```
-rw-r--r--src/tools/rust-analyzer/crates/ide-assists/src/handlers/replace_arith_op.rs23
1 files changed, 22 insertions, 1 deletions
diff --git a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/replace_arith_op.rs b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/replace_arith_op.rs
index 440ab4d4604..94ac1c342d3 100644
--- a/src/tools/rust-analyzer/crates/ide-assists/src/handlers/replace_arith_op.rs
+++ b/src/tools/rust-analyzer/crates/ide-assists/src/handlers/replace_arith_op.rs
@@ -88,7 +88,11 @@ fn replace_arith(acc: &mut Assists, ctx: &AssistContext<'_>, kind: ArithKind) ->
         |builder| {
             let method_name = kind.method_name(op);
 
-            builder.replace(range, format!("{lhs}.{method_name}({rhs})"))
+            if lhs.precedence().needs_parentheses_in(ast::prec::ExprPrecedence::Postfix) {
+                builder.replace(range, format!("({lhs}).{method_name}({rhs})"))
+            } else {
+                builder.replace(range, format!("{lhs}.{method_name}({rhs})"))
+            }
         },
     )
 }
@@ -228,6 +232,23 @@ fn main() {
     }
 
     #[test]
+    fn replace_arith_with_wrapping_add_add_parenthesis() {
+        check_assist(
+            replace_arith_with_wrapping,
+            r#"
+fn main() {
+    let x = 1*x $0+ 2;
+}
+"#,
+            r#"
+fn main() {
+    let x = (1*x).wrapping_add(2);
+}
+"#,
+        )
+    }
+
+    #[test]
     fn replace_arith_not_applicable_with_non_empty_selection() {
         check_assist_not_applicable(
             replace_arith_with_checked,