From f27c0ef1cf41ad381ac4168bb291442b68a4932b Mon Sep 17 00:00:00 2001 From: Morgan Thomas Date: Sat, 12 Mar 2022 05:01:25 -0800 Subject: [PATCH] Reduce intermediate string allocations in render::compound::render_record and ::render_tuple --- crates/ide_completion/src/render/compound.rs | 56 +++++++++----------- 1 file changed, 24 insertions(+), 32 deletions(-) diff --git a/crates/ide_completion/src/render/compound.rs b/crates/ide_completion/src/render/compound.rs index a1a199c6e2..c7f3bd1f79 100644 --- a/crates/ide_completion/src/render/compound.rs +++ b/crates/ide_completion/src/render/compound.rs @@ -22,24 +22,21 @@ pub(crate) fn render_record( fields: &[hir::Field], name: Option<&str>, ) -> RenderedCompound { - let fields = fields.iter(); + let completions = fields.iter().enumerate().format_with(", ", |(idx, field), f| { + if snippet_cap.is_some() { + f(&format_args!("{}: ${{{}:()}}", field.name(db), idx + 1)) + } else { + f(&format_args!("{}: ()", field.name(db))) + } + }); + + let types = fields.iter().format_with(", ", |field, f| { + f(&format_args!("{}: {}", field.name(db), field.ty(db).display(db))) + }); - let (completions, types): (Vec<_>, Vec<_>) = fields - .enumerate() - .map(|(idx, field)| { - ( - if snippet_cap.is_some() { - format!("{}: ${{{}:()}}", field.name(db), idx + 1) - } else { - format!("{}: ()", field.name(db)) - }, - format!("{}: {}", field.name(db), field.ty(db).display(db)), - ) - }) - .unzip(); RenderedCompound { - literal: format!("{} {{ {} }}", name.unwrap_or(""), completions.iter().format(", ")), - detail: format!("{} {{ {} }}", name.unwrap_or(""), types.iter().format(", ")), + literal: format!("{} {{ {} }}", name.unwrap_or(""), completions), + detail: format!("{} {{ {} }}", name.unwrap_or(""), types), } } @@ -51,24 +48,19 @@ pub(crate) fn render_tuple( fields: &[hir::Field], name: Option<&str>, ) -> RenderedCompound { - let fields = fields.iter(); + let completions = fields.iter().enumerate().format_with(", ", |(idx, _), f| { + if snippet_cap.is_some() { + f(&format_args!("${{{}:()}}", idx + 1)) + } else { + f(&format_args!("()")) + } + }); + + let types = fields.iter().format_with(", ", |field, f| f(&field.ty(db).display(db))); - let (completions, types): (Vec<_>, Vec<_>) = fields - .enumerate() - .map(|(idx, field)| { - ( - if snippet_cap.is_some() { - format!("${{{}:()}}", (idx + 1).to_string()) - } else { - "()".to_string() - }, - field.ty(db).display(db).to_string(), - ) - }) - .unzip(); RenderedCompound { - literal: format!("{}({})", name.unwrap_or(""), completions.iter().format(", ")), - detail: format!("{}({})", name.unwrap_or(""), types.iter().format(", ")), + literal: format!("{}({})", name.unwrap_or(""), completions), + detail: format!("{}({})", name.unwrap_or(""), types), } }