From 85576d7914ca986eafc321fbbfe95dce73fbf826 Mon Sep 17 00:00:00 2001 From: Nahor Date: Sat, 17 Feb 2024 10:29:54 -0800 Subject: [PATCH] feat(collection): chain iterators rather than extend vector Since we are going to iterate anyway, instead of growing the label vector, chain the iterators. This should be more efficient. In some cases, this also remove a compilation warning about the label vector being unnecessarily mutable. --- miette-derive/src/label.rs | 76 ++++++++++++++++++++------------------ 1 file changed, 40 insertions(+), 36 deletions(-) diff --git a/miette-derive/src/label.rs b/miette-derive/src/label.rs index 9f16f7f..5e1243a 100644 --- a/miette-derive/src/label.rs +++ b/miette-derive/src/label.rs @@ -162,7 +162,6 @@ impl Labels { pub(crate) fn gen_struct(&self, fields: &syn::Fields) -> Option { let (display_pat, display_members) = display_pat_members(fields); - let labels_gen_var = quote! { labels }; let labels = self.0.iter().filter_map(|highlight| { let Label { span, @@ -194,7 +193,7 @@ impl Labels { )) }) }); - let collections = self.0.iter().filter_map(|label| { + let collections_chain = self.0.iter().filter_map(|label| { let Label { span, label, @@ -211,18 +210,20 @@ impl Labels { quote! { std::option::Option::None } }; Some(quote! { - let display = #display; - #labels_gen_var.extend(self.#span.iter().map(|label| { - miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(label) - .map(|span| { - use miette::macro_helpers::{ToLabelSpanWrapper,ToLabeledSpan}; - let mut labeled_span = ToLabelSpanWrapper::to_labeled_span(span.clone()); - if display.is_some() && labeled_span.label().is_none() { - labeled_span.set_label(display.clone()) - } - labeled_span - }) - })); + .chain({ + let display = #display; + self.#span.iter().map(move |label| { + miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(label) + .map(|span| { + use miette::macro_helpers::{ToLabelSpanWrapper,ToLabeledSpan}; + let mut labeled_span = ToLabelSpanWrapper::to_labeled_span(span.clone()); + if display.is_some() && labeled_span.label().is_none() { + labeled_span.set_label(display.clone()) + } + labeled_span + }) + }) + }) }) }); @@ -232,12 +233,13 @@ impl Labels { use miette::macro_helpers::ToOption; let Self #display_pat = self; - let mut #labels_gen_var = vec![ + let labels_iter = vec![ #(#labels),* - ]; - #(#collections)* + ] + .into_iter() + #(#collections_chain)*; - std::option::Option::Some(Box::new(#labels_gen_var.into_iter().filter(Option::is_some).map(Option::unwrap))) + std::option::Option::Some(Box::new(labels_iter.filter(Option::is_some).map(Option::unwrap))) } }) } @@ -249,7 +251,6 @@ impl Labels { |ident, fields, DiagnosticConcreteArgs { labels, .. }| { let (display_pat, display_members) = display_pat_members(fields); labels.as_ref().and_then(|labels| { - let labels_gen_var = quote! { labels }; let variant_labels = labels.0.iter().filter_map(|label| { let Label { span, label, ty, lbl_ty } = label; if *lbl_ty == LabelType::Collection { @@ -282,7 +283,7 @@ impl Labels { )) }) }); - let collections = labels.0.iter().filter_map(|label| { + let collections_chain = labels.0.iter().filter_map(|label| { let Label { span, label, ty, lbl_ty } = label; if *lbl_ty != LabelType::Collection { return None; @@ -300,18 +301,20 @@ impl Labels { quote! { std::option::Option::None } }; Some(quote! { - let display = #display; - #labels_gen_var.extend(#field.iter().map(|label| { - miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(label) - .map(|span| { - use miette::macro_helpers::{ToLabelSpanWrapper,ToLabeledSpan}; - let mut labeled_span = ToLabelSpanWrapper::to_labeled_span(span.clone()); - if display.is_some() && labeled_span.label().is_none() { - labeled_span.set_label(display.clone()) - } - labeled_span - }) - })); + .chain({ + let display = #display; + #field.iter().map(move |label| { + miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(label) + .map(|span| { + use miette::macro_helpers::{ToLabelSpanWrapper,ToLabeledSpan}; + let mut labeled_span = ToLabelSpanWrapper::to_labeled_span(span.clone()); + if display.is_some() && labeled_span.label().is_none() { + labeled_span.set_label(display.clone()); + } + labeled_span + }) + }) + }) }) }); let variant_name = ident.clone(); @@ -320,11 +323,12 @@ impl Labels { _ => Some(quote! { Self::#variant_name #display_pat => { use miette::macro_helpers::ToOption; - let mut #labels_gen_var = vec![ + let labels_iter = vec![ #(#variant_labels),* - ]; - #(#collections)* - std::option::Option::Some(std::boxed::Box::new(#labels_gen_var.into_iter().filter(Option::is_some).map(Option::unwrap))) + ] + .into_iter() + #(#collections_chain)*; + std::option::Option::Some(std::boxed::Box::new(labels_iter.filter(Option::is_some).map(Option::unwrap))) } }), }