xref: /third_party/rust/crates/syn/codegen/src/cfg.rs (revision fad3a1d3)
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