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.
This commit is contained in:
Nahor 2024-02-17 10:29:54 -08:00
parent d144f7a28e
commit 85576d7914
1 changed files with 40 additions and 36 deletions

View File

@ -162,7 +162,6 @@ impl Labels {
pub(crate) fn gen_struct(&self, fields: &syn::Fields) -> Option<TokenStream> { pub(crate) fn gen_struct(&self, fields: &syn::Fields) -> Option<TokenStream> {
let (display_pat, display_members) = display_pat_members(fields); let (display_pat, display_members) = display_pat_members(fields);
let labels_gen_var = quote! { labels };
let labels = self.0.iter().filter_map(|highlight| { let labels = self.0.iter().filter_map(|highlight| {
let Label { let Label {
span, 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 { let Label {
span, span,
label, label,
@ -211,18 +210,20 @@ impl Labels {
quote! { std::option::Option::None } quote! { std::option::Option::None }
}; };
Some(quote! { Some(quote! {
let display = #display; .chain({
#labels_gen_var.extend(self.#span.iter().map(|label| { let display = #display;
miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(label) self.#span.iter().map(move |label| {
.map(|span| { miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(label)
use miette::macro_helpers::{ToLabelSpanWrapper,ToLabeledSpan}; .map(|span| {
let mut labeled_span = ToLabelSpanWrapper::to_labeled_span(span.clone()); use miette::macro_helpers::{ToLabelSpanWrapper,ToLabeledSpan};
if display.is_some() && labeled_span.label().is_none() { let mut labeled_span = ToLabelSpanWrapper::to_labeled_span(span.clone());
labeled_span.set_label(display.clone()) if display.is_some() && labeled_span.label().is_none() {
} labeled_span.set_label(display.clone())
labeled_span }
}) labeled_span
})); })
})
})
}) })
}); });
@ -232,12 +233,13 @@ impl Labels {
use miette::macro_helpers::ToOption; use miette::macro_helpers::ToOption;
let Self #display_pat = self; let Self #display_pat = self;
let mut #labels_gen_var = vec![ let labels_iter = vec![
#(#labels),* #(#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, .. }| { |ident, fields, DiagnosticConcreteArgs { labels, .. }| {
let (display_pat, display_members) = display_pat_members(fields); let (display_pat, display_members) = display_pat_members(fields);
labels.as_ref().and_then(|labels| { labels.as_ref().and_then(|labels| {
let labels_gen_var = quote! { labels };
let variant_labels = labels.0.iter().filter_map(|label| { let variant_labels = labels.0.iter().filter_map(|label| {
let Label { span, label, ty, lbl_ty } = label; let Label { span, label, ty, lbl_ty } = label;
if *lbl_ty == LabelType::Collection { 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; let Label { span, label, ty, lbl_ty } = label;
if *lbl_ty != LabelType::Collection { if *lbl_ty != LabelType::Collection {
return None; return None;
@ -300,18 +301,20 @@ impl Labels {
quote! { std::option::Option::None } quote! { std::option::Option::None }
}; };
Some(quote! { Some(quote! {
let display = #display; .chain({
#labels_gen_var.extend(#field.iter().map(|label| { let display = #display;
miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(label) #field.iter().map(move |label| {
.map(|span| { miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(label)
use miette::macro_helpers::{ToLabelSpanWrapper,ToLabeledSpan}; .map(|span| {
let mut labeled_span = ToLabelSpanWrapper::to_labeled_span(span.clone()); use miette::macro_helpers::{ToLabelSpanWrapper,ToLabeledSpan};
if display.is_some() && labeled_span.label().is_none() { let mut labeled_span = ToLabelSpanWrapper::to_labeled_span(span.clone());
labeled_span.set_label(display.clone()) if display.is_some() && labeled_span.label().is_none() {
} labeled_span.set_label(display.clone());
labeled_span }
}) labeled_span
})); })
})
})
}) })
}); });
let variant_name = ident.clone(); let variant_name = ident.clone();
@ -320,11 +323,12 @@ impl Labels {
_ => Some(quote! { _ => Some(quote! {
Self::#variant_name #display_pat => { Self::#variant_name #display_pat => {
use miette::macro_helpers::ToOption; use miette::macro_helpers::ToOption;
let mut #labels_gen_var = vec![ let labels_iter = vec![
#(#variant_labels),* #(#variant_labels),*
]; ]
#(#collections)* .into_iter()
std::option::Option::Some(std::boxed::Box::new(#labels_gen_var.into_iter().filter(Option::is_some).map(Option::unwrap))) #(#collections_chain)*;
std::option::Option::Some(std::boxed::Box::new(labels_iter.filter(Option::is_some).map(Option::unwrap)))
} }
}), }),
} }