1use proc_macro2::TokenStream; 2use quote::quote; 3use syn_codegen::Features; 4 5pub fn features<'a>( 6 features: &Features, 7 overriding_cfg: impl Into<Option<&'a str>>, 8) -> TokenStream { 9 let features = &features.any; 10 let cfg = match features.len() { 11 0 => None, 12 1 => Some(quote! { cfg(feature = #(#features)*) }), 13 _ => Some(quote! { cfg(any(#(feature = #features),*)) }), 14 }; 15 match (cfg, overriding_cfg.into()) { 16 (Some(cfg), Some(overriding_cfg)) => quote! { 17 #[#cfg] 18 #[cfg_attr(doc_cfg, doc(cfg(feature = #overriding_cfg)))] 19 }, 20 (Some(cfg), None) => quote! { 21 #[#cfg] 22 #[cfg_attr(doc_cfg, doc(#cfg))] 23 }, 24 (None, Some(overriding_cfg)) => quote! { 25 #[cfg_attr(doc_cfg, doc(cfg(feature = #overriding_cfg)))] 26 }, 27 (None, None) => TokenStream::new(), 28 } 29} 30