Unnamed repository; edit this file 'description' to name the repository.
Merge pull request #22151 from A4-Tacks/demorgan-iter-on-not
fix: offer on `!` for apply_demorgan_iterator
Chayim Refael Friedman 4 weeks ago
parent 6f458d8 · parent 17ba84f · commit e7d5b5b
-rw-r--r--crates/ide-assists/src/handlers/apply_demorgan.rs28
1 files changed, 27 insertions, 1 deletions
diff --git a/crates/ide-assists/src/handlers/apply_demorgan.rs b/crates/ide-assists/src/handlers/apply_demorgan.rs
index 9a414ba235..31e7f1c176 100644
--- a/crates/ide-assists/src/handlers/apply_demorgan.rs
+++ b/crates/ide-assists/src/handlers/apply_demorgan.rs
@@ -190,7 +190,13 @@ pub(crate) fn apply_demorgan(acc: &mut Assists, ctx: &AssistContext<'_>) -> Opti
// }
// ```
pub(crate) fn apply_demorgan_iterator(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
- let method_call: ast::MethodCallExpr = ctx.find_node_at_offset()?;
+ let method_call: ast::MethodCallExpr = ctx.find_node_at_offset().or_else(|| {
+ let parent = ctx.find_token_syntax_at_offset(T![!])?.parent()?;
+ match ast::PrefixExpr::cast(parent)?.expr()? {
+ ast::Expr::MethodCallExpr(method_call) => Some(method_call),
+ _ => None,
+ }
+ })?;
let (name, arg_expr) = validate_method_call_expr(ctx, &method_call)?;
let ast::Expr::ClosureExpr(closure_expr) = arg_expr else { return None };
@@ -399,6 +405,26 @@ fn f() { if let 1 = 1 &&$0 true { } }
}
#[test]
+ fn demorgan_iterator_on_not() {
+ check_assist(
+ apply_demorgan_iterator,
+ r#"
+//- minicore: iterator
+fn main() {
+ let arr = [1, 2, 3];
+ let cond = $0!arr.into_iter().all(|num| num != 4);
+}
+"#,
+ r#"
+fn main() {
+ let arr = [1, 2, 3];
+ let cond = arr.into_iter().any(|num| num == 4);
+}
+"#,
+ );
+ }
+
+ #[test]
fn demorgan_keep_pars_for_op_precedence() {
check_assist(
apply_demorgan,