]>
Commit | Line | Data |
---|---|---|
f035d41b XL |
1 | use proc_macro2::{Ident, TokenStream}; |
2 | use quote::format_ident; | |
f9f354fc XL |
3 | |
4 | use syn; | |
5 | use try; | |
6 | ||
7 | pub fn wrap_in_const( | |
8 | serde_path: Option<&syn::Path>, | |
9 | trait_: &str, | |
10 | ty: &Ident, | |
11 | code: TokenStream, | |
12 | ) -> TokenStream { | |
13 | let try_replacement = try::replacement(); | |
14 | ||
064997fb | 15 | let dummy_const = if cfg!(no_underscore_consts) { |
f035d41b | 16 | format_ident!("_IMPL_{}_FOR_{}", trait_, unraw(ty)) |
064997fb FG |
17 | } else { |
18 | format_ident!("_") | |
f035d41b | 19 | }; |
f9f354fc XL |
20 | |
21 | let use_serde = match serde_path { | |
22 | Some(path) => quote! { | |
23 | use #path as _serde; | |
24 | }, | |
25 | None => quote! { | |
17df50a5 | 26 | #[allow(unused_extern_crates, clippy::useless_attribute)] |
f9f354fc XL |
27 | extern crate serde as _serde; |
28 | }, | |
29 | }; | |
30 | ||
31 | quote! { | |
32 | #[doc(hidden)] | |
33 | #[allow(non_upper_case_globals, unused_attributes, unused_qualifications)] | |
34 | const #dummy_const: () = { | |
35 | #use_serde | |
36 | #try_replacement | |
37 | #code | |
38 | }; | |
39 | } | |
40 | } | |
41 | ||
f9f354fc | 42 | fn unraw(ident: &Ident) -> String { |
353b0b11 | 43 | ident.to_string().trim_start_matches("r#").to_owned() |
f9f354fc | 44 | } |