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