diff --git a/crates/ide_completion/src/completions/postfix.rs b/crates/ide_completion/src/completions/postfix.rs index aaa346eeae9..4871698b243 100644 --- a/crates/ide_completion/src/completions/postfix.rs +++ b/crates/ide_completion/src/completions/postfix.rs @@ -2,7 +2,10 @@ mod format_like; -use ide_db::{helpers::SnippetCap, ty_filter::TryEnum}; +use ide_db::{ + helpers::{FamousDefs, SnippetCap}, + ty_filter::TryEnum, +}; use syntax::{ ast::{self, AstNode, AstToken}, SyntaxKind::{BLOCK_EXPR, EXPR_STMT}, @@ -110,6 +113,18 @@ pub(crate) fn complete_postfix(acc: &mut Completions, ctx: &CompletionContext) { .add_to(acc); postfix_snippet(ctx, cap, dot_receiver, "not", "!expr", &format!("!{}", receiver_text)) .add_to(acc); + } else if let Some(trait_) = FamousDefs(&ctx.sema, ctx.krate).core_iter_IntoIterator() { + if receiver_ty.impls_trait(ctx.db, trait_, &[]) { + postfix_snippet( + ctx, + cap, + dot_receiver, + "for", + "for ele in expr {}", + &format!("for ele in {} {{\n $0\n}}", receiver_text), + ) + .add_to(acc); + } } postfix_snippet(ctx, cap, dot_receiver, "ref", "&expr", &format!("&{}", receiver_text)) diff --git a/crates/ide_db/src/helpers.rs b/crates/ide_db/src/helpers.rs index e8cdcbf3fa5..c71b6d64798 100644 --- a/crates/ide_db/src/helpers.rs +++ b/crates/ide_db/src/helpers.rs @@ -134,6 +134,10 @@ impl FamousDefs<'_, '_> { self.find_trait("core:iter:traits:iterator:Iterator") } + pub fn core_iter_IntoIterator(&self) -> Option { + self.find_trait("core:iter:traits:collect:IntoIterator") + } + pub fn core_iter(&self) -> Option { self.find_module("core:iter") }