mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-29 06:23:25 +00:00
Auto merge of #15515 - cardoso:flip-binexpr/lhs-binexpr, r=Veykril
Check if lhs is also a binexpr and use its rhs in flip binexpr assist Closes #15508 From the original PR, flip binexpr assist is not meant to preserve equivalence, so I went with the simplest solution here. I can add some extra checks to keep equivalence, but I think they should go in different specific assists (eg. flip arith op / flip logic op / etc), otherwise this one will get out of hand pretty quickly.
This commit is contained in:
commit
5ae781562e
1 changed files with 30 additions and 1 deletions
|
@ -19,8 +19,19 @@ use crate::{AssistContext, AssistId, AssistKind, Assists};
|
||||||
// ```
|
// ```
|
||||||
pub(crate) fn flip_binexpr(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
|
pub(crate) fn flip_binexpr(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
|
||||||
let expr = ctx.find_node_at_offset::<BinExpr>()?;
|
let expr = ctx.find_node_at_offset::<BinExpr>()?;
|
||||||
let lhs = expr.lhs()?.syntax().clone();
|
|
||||||
let rhs = expr.rhs()?.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();
|
let op_range = expr.op_token()?.text_range();
|
||||||
// The assist should be applied only if the cursor is on the operator
|
// The assist should be applied only if the cursor is on the operator
|
||||||
let cursor_in_range = op_range.contains_range(ctx.selection_trimmed());
|
let cursor_in_range = op_range.contains_range(ctx.selection_trimmed());
|
||||||
|
@ -114,6 +125,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]
|
#[test]
|
||||||
fn flip_binexpr_works_inside_match() {
|
fn flip_binexpr_works_inside_match() {
|
||||||
check_assist(
|
check_assist(
|
||||||
|
|
Loading…
Reference in a new issue