Unnamed repository; edit this file 'description' to name the repository.
fix: offer on `!` for apply_demorgan_iterator
Example
---
```rust
fn main() {
let arr = [1, 2, 3];
let cond = $0!arr.into_iter().all(|num| num != 4);
}
```
**Before this PR**
Assist not applicable
**After this PR**
```rust
fn main() {
let arr = [1, 2, 3];
let cond = arr.into_iter().any(|num| num == 4);
}
```
| -rw-r--r-- | crates/ide-assists/src/handlers/apply_demorgan.rs | 28 |
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 b87a757047..03be28314b 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 }; @@ -394,6 +400,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, |