style: Handle the non-generic path earlier in the derive code.

No need to build the match body if there are no generics. This should hopefully
save some work too.

Depends on D26289

Differential Revision: https://phabricator.services.mozilla.com/D26290
This commit is contained in:
Emilio Cobos Álvarez 2019-04-09 01:48:18 +00:00
parent c3ab3f0963
commit fc0dad2074

View file

@ -30,6 +30,21 @@ pub fn derive_to_value(
// to this token stream, which should be the body of the impl block. // to this token stream, which should be the body of the impl block.
non_generic_implementation: impl FnOnce() -> Option<TokenStream>, non_generic_implementation: impl FnOnce() -> Option<TokenStream>,
) -> TokenStream { ) -> TokenStream {
let name = &input.ident;
if input.generics.type_params().next().is_none() {
if let Some(non_generic_implementation) = non_generic_implementation() {
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
return quote! {
impl #impl_generics #trait_path for #name #ty_generics
#where_clause
{
#non_generic_implementation
}
};
}
}
let mut where_clause = input.generics.where_clause.take(); let mut where_clause = input.generics.where_clause.take();
cg::propagate_clauses_to_output_type( cg::propagate_clauses_to_output_type(
&mut where_clause, &mut where_clause,
@ -73,20 +88,7 @@ pub fn derive_to_value(
}; };
input.generics.where_clause = where_clause; input.generics.where_clause = where_clause;
let name = &input.ident;
let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl(); let (impl_generics, ty_generics, where_clause) = input.generics.split_for_impl();
if input.generics.type_params().next().is_none() {
if let Some(non_generic_implementation) = non_generic_implementation() {
return quote! {
impl #impl_generics #trait_path for #name #ty_generics
#where_clause
{
#non_generic_implementation
}
};
}
}
let computed_value_type = cg::fmap_trait_output( let computed_value_type = cg::fmap_trait_output(
&input, &input,
&trait_path, &trait_path,