1use crate::attrs::AttributeSpanWrapper;
2use crate::field::Field;
3use crate::model::Model;
4use crate::util::{inner_of_option_ty, is_option_ty, wrap_in_dummy_mod};
5use proc_macro2::{Span, TokenStream};
6use quote::quote;
7use quote::quote_spanned;
8use std::collections::{HashMap, HashSet};
9use syn::spanned::Spanned as _;
10use syn::{parse_quote, Lifetime};
11use syn::{DeriveInput, Expr, Path, Result, Type};
12
13pub fn derive(item: DeriveInput) -> Result<TokenStream> {
14 let model = Model::from_item(&item, false, true)?;
15
16 let tokens = model
17 .table_names()
18 .iter()
19 .map(|table_name| derive_into_single_table(&item, &model, table_name))
20 .collect::<Result<Vec<_>>>()?;
21
22 Ok(wrap_in_dummy_mod({
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut tokens, i) = tokens.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let tokens =
match tokens.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&tokens, &mut _s);
}
}
_s
}quote! {
23 #(#tokens)*
24 }))
25}
26
27fn derive_into_single_table(
28 item: &DeriveInput,
29 model: &Model,
30 table_name: &Path,
31) -> Result<TokenStream> {
32 let treat_none_as_default_value = model.treat_none_as_default_value();
33 let struct_name = &item.ident;
34
35 let (impl_generics, ty_generics, where_clause) = item.generics.split_for_impl();
36
37 let mut generate_borrowed_insert = true;
38
39 let mut direct_field_ty = Vec::with_capacity(model.fields().len());
40 let mut direct_field_assign = Vec::with_capacity(model.fields().len());
41 let mut ref_field_ty = Vec::with_capacity(model.fields().len());
42 let mut ref_field_assign = Vec::with_capacity(model.fields().len());
43
44 let mut field_ty_bounds = Vec::with_capacity(model.fields().len());
46 let mut borrowed_field_ty_bounds = Vec::with_capacity(model.fields().len());
47 let mut field_ty_bounds_guard = HashMap::new();
48 let mut borrowed_field_ty_bounds_guard = HashMap::new();
49
50 for field in model.fields() {
51 if field.skip_insertion() {
53 continue;
54 }
55 let treat_none_as_default_value = match &field.treat_none_as_default_value {
57 Some(attr) => {
58 if let Some(embed) = &field.embed {
59 return Err(syn::Error::new(
60 embed.attribute_span,
61 "`embed` and `treat_none_as_default_value` are mutually exclusive",
62 ));
63 }
64
65 if !is_option_ty(&field.ty) {
66 return Err(syn::Error::new(
67 field.ty.span(),
68 "expected `treat_none_as_default_value` field to be of type `Option<_>`",
69 ));
70 }
71
72 attr.item
73 }
74 None => treat_none_as_default_value,
75 };
76
77 match (field.serialize_as.as_ref(), field.embed()) {
78 (None, true) => {
79 direct_field_ty.push(field_ty_embed(field, None));
80 direct_field_assign.push(field_expr_embed(field, None));
81 ref_field_ty.push(field_ty_embed(field, Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'insert");
_s
}quote!(&'insert))));
82 ref_field_assign.push(field_expr_embed(field, Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
_s
}quote!(&))));
83 }
84 (None, false) => {
85 direct_field_ty.push(field_ty(
86 field,
87 table_name,
88 None,
89 treat_none_as_default_value,
90 )?);
91 direct_field_assign.push(field_expr(
92 field,
93 table_name,
94 None,
95 treat_none_as_default_value,
96 )?);
97 ref_field_ty.push(field_ty(
98 field,
99 table_name,
100 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'insert");
_s
}quote!(&'insert)),
101 treat_none_as_default_value,
102 )?);
103 ref_field_assign.push(field_expr(
104 field,
105 table_name,
106 Some({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
_s
}quote!(&)),
107 treat_none_as_default_value,
108 )?);
109
110 field_ty_bounds.push(generate_field_bound(
111 field,
112 table_name,
113 &field.ty,
114 treat_none_as_default_value,
115 false,
116 &mut field_ty_bounds_guard,
117 )?);
118
119 borrowed_field_ty_bounds.push(generate_field_bound(
120 field,
121 table_name,
122 &field.ty,
123 treat_none_as_default_value,
124 true,
125 &mut borrowed_field_ty_bounds_guard,
126 )?);
127 }
128 (Some(AttributeSpanWrapper { item: ty, .. }), false) => {
129 direct_field_ty.push(field_ty_serialize_as(
130 field,
131 table_name,
132 ty,
133 treat_none_as_default_value,
134 )?);
135 direct_field_assign.push(field_expr_serialize_as(
136 field,
137 table_name,
138 ty,
139 treat_none_as_default_value,
140 )?);
141
142 field_ty_bounds.push(generate_field_bound(
143 field,
144 table_name,
145 ty,
146 treat_none_as_default_value,
147 false,
148 &mut field_ty_bounds_guard,
149 )?);
150
151 generate_borrowed_insert = false; }
153 (Some(AttributeSpanWrapper { attribute_span, .. }), true) => {
154 return Err(syn::Error::new(
155 *attribute_span,
156 "`#[diesel(embed)]` cannot be combined with `#[diesel(serialize_as)]`",
157 ));
158 }
159 }
160 }
161
162 let field_ty_bounds = field_ty_bounds
163 .into_iter()
164 .filter_map(|(type_to_check, bound)| {
165 filter_bounds(&field_ty_bounds_guard, type_to_check, bound)
166 });
167 let insert_owned = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&struct_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut field_ty_bounds, i) = field_ty_bounds.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let field_ty_bounds =
match field_ty_bounds.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&field_ty_bounds, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "type");
::quote::__private::push_ident(&mut _s, "Values");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut direct_field_ty, i) =
direct_field_ty.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let direct_field_ty =
match direct_field_ty.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&direct_field_ty, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_shr(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Values");
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "values");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut direct_field_ty, i) =
direct_field_ty.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let direct_field_ty =
match direct_field_ty.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&direct_field_ty, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_shr(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Values");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "values");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut direct_field_assign, i) =
direct_field_assign.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let direct_field_assign =
match direct_field_assign.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&direct_field_assign, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
_s
});
_s
});
_s
});
_s
}quote! {
168 impl #impl_generics diesel::insertable::Insertable<#table_name::table> for #struct_name #ty_generics
169 where
170 #where_clause
171 #(#field_ty_bounds,)*
172 {
173 type Values = <(#(#direct_field_ty,)*) as diesel::insertable::Insertable<#table_name::table>>::Values;
174
175 fn values(self) -> <(#(#direct_field_ty,)*) as diesel::insertable::Insertable<#table_name::table>>::Values {
176 diesel::insertable::Insertable::<#table_name::table>::values((#(#direct_field_assign,)*))
177 }
178 }
179 };
180
181 let insert_borrowed = if generate_borrowed_insert {
182 let mut impl_generics = item.generics.clone();
183 impl_generics.params.push(::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_lifetime(&mut _s, "\'insert");
_s
})parse_quote!('insert));
184 let (impl_generics, ..) = impl_generics.split_for_impl();
185 let borrowed_field_ty_bounds =
186 borrowed_field_ty_bounds
187 .into_iter()
188 .filter_map(|(type_to_check, bound)| {
189 filter_bounds(&borrowed_field_ty_bounds_guard, type_to_check, bound)
190 });
191
192 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::__private::push_and(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'insert");
::quote::ToTokens::to_tokens(&struct_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "where");
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut borrowed_field_ty_bounds, i) =
borrowed_field_ty_bounds.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let borrowed_field_ty_bounds =
match borrowed_field_ty_bounds.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&borrowed_field_ty_bounds, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "type");
::quote::__private::push_ident(&mut _s, "Values");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut ref_field_ty, i) = ref_field_ty.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let ref_field_ty =
match ref_field_ty.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&ref_field_ty, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_shr(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Values");
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "values");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut ref_field_ty, i) = ref_field_ty.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let ref_field_ty =
match ref_field_ty.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&ref_field_ty, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_shr(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Values");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "values");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut ref_field_assign, i) =
ref_field_assign.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let ref_field_assign =
match ref_field_assign.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&ref_field_assign, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
_s
});
_s
});
_s
});
_s
}quote! {
193 impl #impl_generics diesel::insertable::Insertable<#table_name::table>
194 for &'insert #struct_name #ty_generics
195 where
196 #where_clause
197 #(#borrowed_field_ty_bounds,)*
198 {
199 type Values = <(#(#ref_field_ty,)*) as diesel::insertable::Insertable<#table_name::table>>::Values;
200
201 fn values(self) -> <(#(#ref_field_ty,)*) as diesel::insertable::Insertable<#table_name::table>>::Values {
202 diesel::insertable::Insertable::<#table_name::table>::values((#(#ref_field_assign,)*))
203 }
204 }
205 }
206 } else {
207 ::quote::__private::TokenStream::new();quote! {}
208 };
209
210 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&insert_owned, &mut _s);
::quote::ToTokens::to_tokens(&insert_borrowed, &mut _s);
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "internal");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "derives");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "insertable");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "UndecoratedInsertRecord");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "table");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&struct_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
::quote::__private::TokenStream::new());
_s
}quote! {
211 #insert_owned
212
213 #insert_borrowed
214
215 impl #impl_generics diesel::internal::derives::insertable::UndecoratedInsertRecord<#table_name::table>
216 for #struct_name #ty_generics
217 #where_clause
218 {
219 }
220 })
221}
222
223fn filter_bounds(
228 guard: &HashMap<Type, HashSet<Vec<Lifetime>>>,
229 type_to_check: syn::Type,
230 bound: TokenStream,
231) -> Option<TokenStream> {
232 let count = guard
233 .get(&type_to_check)
234 .map(|t| t.len())
235 .unwrap_or_default();
236 (count <= 1).then_some(bound)
237}
238
239fn field_ty_embed(field: &Field, lifetime: Option<TokenStream>) -> TokenStream {
240 let field_ty = &field.ty;
241 let span = Span::mixed_site().located_at(field.span);
242 {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::ToTokens::to_tokens(&lifetime, &mut _s);
::quote::ToTokens::to_tokens(&field_ty, &mut _s);
_s
}quote_spanned!(span=> #lifetime #field_ty)
243}
244
245fn field_expr_embed(field: &Field, lifetime: Option<TokenStream>) -> TokenStream {
246 let field_name = &field.name;
247 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&lifetime, &mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
_s
}quote!(#lifetime self.#field_name)
248}
249
250fn field_ty_serialize_as(
251 field: &Field,
252 table_name: &Path,
253 ty: &Type,
254 treat_none_as_default_value: bool,
255) -> Result<TokenStream> {
256 let column_name = field.column_name()?.to_ident()?;
257 let span = Span::mixed_site().located_at(field.span);
258 if treat_none_as_default_value {
259 let inner_ty = inner_of_option_ty(ty);
260
261 Ok({
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::__private::push_ident_spanned(&mut _s, _span, "std");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "option");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Option");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "diesel");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "dsl");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Eq");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&inner_ty, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::__private::push_shr_spanned(&mut _s, _span);
_s
}quote_spanned! {span=>
262 std::option::Option<diesel::dsl::Eq<
263 #table_name::#column_name,
264 #inner_ty,
265 >>
266 })
267 } else {
268 Ok({
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::__private::push_ident_spanned(&mut _s, _span, "diesel");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "dsl");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Eq");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::__private::push_gt_spanned(&mut _s, _span);
_s
}quote_spanned! {span=>
269 diesel::dsl::Eq<
270 #table_name::#column_name,
271 #ty,
272 >
273 })
274 }
275}
276
277fn field_expr_serialize_as(
278 field: &Field,
279 table_name: &Path,
280 ty: &Type,
281 treat_none_as_default_value: bool,
282) -> Result<TokenStream> {
283 let field_name = &field.name;
284 let column_name = field.column_name()?.to_ident()?;
285 let column = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
_s
}quote!(#table_name::#column_name);
286 if treat_none_as_default_value {
287 if is_option_ty(ty) {
288 Ok(
289 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "convert");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Into");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
_s
});
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "map");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "v");
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "v");
_s
});
_s
});
_s
}quote!(::std::convert::Into::<#ty>::into(self.#field_name).map(|v| diesel::ExpressionMethods::eq(#column, v))),
290 )
291 } else {
292 Ok(
293 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "convert");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Into");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
_s
});
_s
});
_s
});
_s
}quote!(std::option::Option::Some(diesel::ExpressionMethods::eq(#column, ::std::convert::Into::<#ty>::into(self.#field_name)))),
294 )
295 }
296 } else {
297 Ok(
298 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "convert");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Into");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "into");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
_s
});
_s
});
_s
}quote!(diesel::ExpressionMethods::eq(#column, ::std::convert::Into::<#ty>::into(self.#field_name))),
299 )
300 }
301}
302
303fn field_ty(
304 field: &Field,
305 table_name: &Path,
306 lifetime: Option<TokenStream>,
307 treat_none_as_default_value: bool,
308) -> Result<TokenStream> {
309 let column_name = field.column_name()?.to_ident()?;
310 let span = Span::mixed_site().located_at(field.span);
311 if treat_none_as_default_value {
312 let inner_ty = inner_of_option_ty(&field.ty);
313
314 Ok({
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::__private::push_ident_spanned(&mut _s, _span, "std");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "option");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Option");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "diesel");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "dsl");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Eq");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&lifetime, &mut _s);
::quote::ToTokens::to_tokens(&inner_ty, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::__private::push_shr_spanned(&mut _s, _span);
_s
}quote_spanned! {span=>
315 std::option::Option<diesel::dsl::Eq<
316 #table_name::#column_name,
317 #lifetime #inner_ty,
318 >>
319 })
320 } else {
321 let inner_ty = &field.ty;
322
323 Ok({
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::__private::push_ident_spanned(&mut _s, _span, "diesel");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "dsl");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Eq");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&lifetime, &mut _s);
::quote::ToTokens::to_tokens(&inner_ty, &mut _s);
::quote::__private::push_comma_spanned(&mut _s, _span);
::quote::__private::push_gt_spanned(&mut _s, _span);
_s
}quote_spanned! {span=>
324 diesel::dsl::Eq<
325 #table_name::#column_name,
326 #lifetime #inner_ty,
327 >
328 })
329 }
330}
331
332fn field_expr(
333 field: &Field,
334 table_name: &Path,
335 lifetime: Option<TokenStream>,
336 treat_none_as_default_value: bool,
337) -> Result<TokenStream> {
338 let field_name = &field.name;
339 let column_name = field.column_name()?.to_ident()?;
340
341 let column: Expr = ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
_s
})parse_quote!(#table_name::#column_name);
342 if treat_none_as_default_value {
343 if is_option_ty(&field.ty) {
344 if lifetime.is_some() {
345 Ok(
346 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "as_ref");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "map");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "x");
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "x");
_s
});
_s
});
_s
}quote!(self.#field_name.as_ref().map(|x| diesel::ExpressionMethods::eq(#column, x))),
347 )
348 } else {
349 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "map");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "x");
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "x");
_s
});
_s
});
_s
}quote!(self.#field_name.map(|x| diesel::ExpressionMethods::eq(#column, x))))
350 }
351 } else {
352 Ok(
353 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Option");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&lifetime, &mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
_s
});
_s
});
_s
}quote!(std::option::Option::Some(diesel::ExpressionMethods::eq(#column, #lifetime self.#field_name))),
354 )
355 }
356 } else {
357 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "diesel");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ExpressionMethods");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "eq");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&column, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&lifetime, &mut _s);
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::ToTokens::to_tokens(&field_name, &mut _s);
_s
});
_s
}quote!(diesel::ExpressionMethods::eq(#column, #lifetime self.#field_name)))
358 }
359}
360
361fn generate_field_bound(
363 field: &Field,
364 table_name: &Path,
365 ty: &Type,
366 treat_none_as_default_value: bool,
367 borrowed: bool,
368 guard: &mut HashMap<Type, HashSet<Vec<Lifetime>>>,
369) -> Result<(syn::Type, TokenStream)> {
370 let column_name = field.column_name()?.to_ident()?;
371 let span = Span::mixed_site().located_at(field.span);
372 let ty_to_check = if treat_none_as_default_value {
373 inner_of_option_ty(ty)
374 } else {
375 ty
376 };
377 let mut type_for_guard = ty_to_check.clone();
378 let mut collector = LifetimeCollector::default();
385 syn::visit_mut::visit_type_mut(&mut collector, &mut type_for_guard);
386 let life_times = collector.lifetimes;
387
388 guard
389 .entry(type_for_guard.clone())
390 .or_default()
391 .insert(life_times);
392 let bound_ty = if borrowed {
393 {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::__private::push_and_spanned(&mut _s, _span);
::quote::__private::push_lifetime_spanned(&mut _s, _span, "\'insert");
::quote::ToTokens::to_tokens(&ty_to_check, &mut _s);
_s
}quote_spanned! {span=> &'insert #ty_to_check}
394 } else {
395 {
let mut _s = ::quote::__private::TokenStream::new();
let _: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::ToTokens::to_tokens(&ty_to_check, &mut _s);
_s
}quote_spanned! {span=> #ty_to_check}
396 };
397 let bound = {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::ToTokens::to_tokens(&bound_ty, &mut _s);
::quote::__private::push_colon_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "diesel");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "expression");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "AsExpression");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&table_name, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&column_name, &mut _s);
::quote::__private::push_ident_spanned(&mut _s, _span, "as");
::quote::__private::push_ident_spanned(&mut _s, _span, "diesel");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Expression");
::quote::__private::push_gt_spanned(&mut _s, _span);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "SqlType");
::quote::__private::push_gt_spanned(&mut _s, _span);
_s
}quote_spanned! {span=>
398 #bound_ty: diesel::expression::AsExpression<
399 <#table_name::#column_name as diesel::Expression>::SqlType
400 >
401 };
402 Ok((type_for_guard, bound))
403}
404
405#[derive(#[automatically_derived]
impl ::core::default::Default for LifetimeCollector {
#[inline]
fn default() -> LifetimeCollector {
LifetimeCollector { lifetimes: ::core::default::Default::default() }
}
}Default)]
406struct LifetimeCollector {
407 lifetimes: Vec<Lifetime>,
408}
409
410impl syn::visit_mut::VisitMut for LifetimeCollector {
411 fn visit_lifetime_mut(&mut self, i: &mut syn::Lifetime) {
412 self.lifetimes
413 .push(std::mem::replace(i, ::syn::__private::parse_quote({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_lifetime(&mut _s, "\'static");
_s
})syn::parse_quote!('static)));
414
415 syn::visit_mut::visit_lifetime_mut(self, i);
416 }
417}