Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-assists/src/handlers/flip_binexpr.rs')
-rw-r--r--crates/ide-assists/src/handlers/flip_binexpr.rs31
1 files changed, 30 insertions, 1 deletions
diff --git a/crates/ide-assists/src/handlers/flip_binexpr.rs b/crates/ide-assists/src/handlers/flip_binexpr.rs
index 2ea6f58fa0..8b46a23f9a 100644
--- a/crates/ide-assists/src/handlers/flip_binexpr.rs
+++ b/crates/ide-assists/src/handlers/flip_binexpr.rs
@@ -19,8 +19,19 @@ use crate::{AssistContext, AssistId, AssistKind, Assists};
// ```
pub(crate) fn flip_binexpr(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
let expr = ctx.find_node_at_offset::<BinExpr>()?;
- let lhs = expr.lhs()?.syntax().clone();
let rhs = expr.rhs()?.syntax().clone();
+ let lhs = expr.lhs()?.syntax().clone();
+
+ let lhs = if let Some(bin_expr) = BinExpr::cast(lhs.clone()) {
+ if bin_expr.op_kind() == expr.op_kind() {
+ bin_expr.rhs()?.syntax().clone()
+ } else {
+ lhs
+ }
+ } else {
+ lhs
+ };
+
let op_range = expr.op_token()?.text_range();
// The assist should be applied only if the cursor is on the operator
let cursor_in_range = op_range.contains_range(ctx.selection_trimmed());
@@ -115,6 +126,24 @@ mod tests {
}
#[test]
+ fn flip_binexpr_works_for_lhs_arith() {
+ check_assist(
+ flip_binexpr,
+ r"fn f() { let res = 1 + (2 - 3) +$0 4 + 5; }",
+ r"fn f() { let res = 1 + 4 + (2 - 3) + 5; }",
+ )
+ }
+
+ #[test]
+ fn flip_binexpr_works_for_lhs_cmp() {
+ check_assist(
+ flip_binexpr,
+ r"fn f() { let res = 1 + (2 - 3) >$0 4 + 5; }",
+ r"fn f() { let res = 4 + 5 < 1 + (2 - 3); }",
+ )
+ }
+
+ #[test]
fn flip_binexpr_works_inside_match() {
check_assist(
flip_binexpr,