summaryrefslogtreecommitdiffstats
path: root/third_party/rust/derive_more-impl/src/mul_helpers.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/derive_more-impl/src/mul_helpers.rs')
-rw-r--r--third_party/rust/derive_more-impl/src/mul_helpers.rs36
1 files changed, 36 insertions, 0 deletions
diff --git a/third_party/rust/derive_more-impl/src/mul_helpers.rs b/third_party/rust/derive_more-impl/src/mul_helpers.rs
new file mode 100644
index 0000000000..dbc1c6257c
--- /dev/null
+++ b/third_party/rust/derive_more-impl/src/mul_helpers.rs
@@ -0,0 +1,36 @@
+use crate::utils::{add_where_clauses_for_new_ident, MultiFieldData, RefType};
+use proc_macro2::TokenStream;
+use quote::quote;
+use syn::{Generics, Ident};
+
+pub fn generics_and_exprs(
+ multi_field_data: MultiFieldData,
+ scalar_ident: &Ident,
+ type_where_clauses: TokenStream,
+ ref_type: RefType,
+) -> (Generics, Vec<TokenStream>) {
+ let MultiFieldData {
+ fields,
+ casted_traits,
+ members,
+ method_ident,
+ ..
+ } = multi_field_data;
+ let reference = ref_type.reference();
+ let exprs: Vec<_> = casted_traits
+ .iter()
+ .zip(members)
+ .map(|(casted_trait, member)| {
+ quote! { #casted_trait::#method_ident(#reference #member, rhs) }
+ })
+ .collect();
+
+ let new_generics = add_where_clauses_for_new_ident(
+ &multi_field_data.state.input.generics,
+ &fields,
+ scalar_ident,
+ type_where_clauses,
+ true,
+ );
+ (new_generics, exprs)
+}