Reduce intermediate string allocations in render::compound::render_record and ::render_tuple

This commit is contained in:
Morgan Thomas 2022-03-12 05:01:25 -08:00
parent d430ddd809
commit f27c0ef1cf

View file

@ -22,24 +22,21 @@ pub(crate) fn render_record(
fields: &[hir::Field], fields: &[hir::Field],
name: Option<&str>, name: Option<&str>,
) -> RenderedCompound { ) -> RenderedCompound {
let fields = fields.iter(); let completions = fields.iter().enumerate().format_with(", ", |(idx, field), f| {
let (completions, types): (Vec<_>, Vec<_>) = fields
.enumerate()
.map(|(idx, field)| {
(
if snippet_cap.is_some() { if snippet_cap.is_some() {
format!("{}: ${{{}:()}}", field.name(db), idx + 1) f(&format_args!("{}: ${{{}:()}}", field.name(db), idx + 1))
} else { } else {
format!("{}: ()", field.name(db)) f(&format_args!("{}: ()", field.name(db)))
}, }
format!("{}: {}", field.name(db), field.ty(db).display(db)), });
)
}) let types = fields.iter().format_with(", ", |field, f| {
.unzip(); f(&format_args!("{}: {}", field.name(db), field.ty(db).display(db)))
});
RenderedCompound { RenderedCompound {
literal: format!("{} {{ {} }}", name.unwrap_or(""), completions.iter().format(", ")), literal: format!("{} {{ {} }}", name.unwrap_or(""), completions),
detail: format!("{} {{ {} }}", name.unwrap_or(""), types.iter().format(", ")), detail: format!("{} {{ {} }}", name.unwrap_or(""), types),
} }
} }
@ -51,24 +48,19 @@ pub(crate) fn render_tuple(
fields: &[hir::Field], fields: &[hir::Field],
name: Option<&str>, name: Option<&str>,
) -> RenderedCompound { ) -> RenderedCompound {
let fields = fields.iter(); let completions = fields.iter().enumerate().format_with(", ", |(idx, _), f| {
let (completions, types): (Vec<_>, Vec<_>) = fields
.enumerate()
.map(|(idx, field)| {
(
if snippet_cap.is_some() { if snippet_cap.is_some() {
format!("${{{}:()}}", (idx + 1).to_string()) f(&format_args!("${{{}:()}}", idx + 1))
} else { } else {
"()".to_string() f(&format_args!("()"))
}, }
field.ty(db).display(db).to_string(), });
)
}) let types = fields.iter().format_with(", ", |field, f| f(&field.ty(db).display(db)));
.unzip();
RenderedCompound { RenderedCompound {
literal: format!("{}({})", name.unwrap_or(""), completions.iter().format(", ")), literal: format!("{}({})", name.unwrap_or(""), completions),
detail: format!("{}({})", name.unwrap_or(""), types.iter().format(", ")), detail: format!("{}({})", name.unwrap_or(""), types),
} }
} }