MCPcopy Create free account
hub / github.com/SoftbearStudios/bitcode / derive_impl

Method derive_impl

bitcode_derive/src/decode.rs:229–321  ·  view source on GitHub ↗
(
        &self,
        output: [TokenStream; Item::COUNT],
        ident: Ident,
        mut generics: Generics,
    )

Source from the content-addressed store, hash-verified

227 }
228
229 fn derive_impl(
230 &self,
231 output: [TokenStream; Item::COUNT],
232 ident: Ident,
233 mut generics: Generics,
234 ) -> TokenStream {
235 let input_generics = generics.clone();
236 let (_, input_generics, _) = input_generics.split_for_impl();
237 let input_ty = quote! { #ident #input_generics };
238
239 // Add 'de lifetime after isolating input_generics.
240 let de = de_lifetime();
241 let de_where_predicate = WherePredicate::Lifetime(PredicateLifetime {
242 lifetime: de.clone(),
243 colon_token: parse_quote!(:),
244 bounds: generics
245 .params
246 .iter()
247 .filter_map(|p| {
248 if let GenericParam::Lifetime(p) = p {
249 Some(p.lifetime.clone())
250 } else {
251 None
252 }
253 })
254 .collect(),
255 });
256
257 // Push de_param after bounding 'de: 'a.
258 let de_param = GenericParam::Lifetime(LifetimeParam::new(de.clone()));
259 generics.params.push(de_param.clone());
260 generics
261 .make_where_clause()
262 .predicates
263 .push(de_where_predicate);
264
265 let combined_generics = generics.clone();
266 let (impl_generics, _, where_clause) = combined_generics.split_for_impl();
267
268 // Decoder can't contain any lifetimes from input (which would limit reuse of decoder).
269 remove_lifetimes(&mut generics);
270 generics.params.push(de_param); // Re-add de_param since remove_lifetimes removed it.
271 let (decoder_impl_generics, decoder_generics, decoder_where_clause) =
272 generics.split_for_impl();
273
274 let [mut type_body, mut default_body, populate_body, decode_in_place_body] = output;
275 if type_body.is_empty() {
276 type_body = quote! { __spooky: std::marker::PhantomData<&#de ()>, };
277 }
278 if default_body.is_empty() {
279 default_body = quote! { __spooky: Default::default(), };
280 }
281
282 let decoder_ident = Ident::new(&format!("{ident}Decoder"), Span::call_site());
283 let decoder_ty = quote! { #decoder_ident #decoder_generics };
284 let private = private();
285
286 quote! {

Callers

nothing calls this directly

Calls 5

de_lifetimeFunction · 0.85
LifetimeClass · 0.85
remove_lifetimesFunction · 0.85
privateFunction · 0.85
collectMethod · 0.45

Tested by

no test coverage detected