1 | use super::*; |
2 | |
3 | impl Writer { |
4 | pub fn write_cfg<R: HasAttributes>( |
5 | &self, |
6 | row: R, |
7 | namespace: &str, |
8 | dependencies: &TypeMap, |
9 | not: bool, |
10 | ) -> TokenStream { |
11 | let mut features = BTreeSet::new(); |
12 | let mut arches = BTreeSet::new(); |
13 | |
14 | for attribute in row.attributes() { |
15 | match attribute.name() { |
16 | "SupportedArchitectureAttribute" => { |
17 | if let Some((_, Value::I32(value))) = attribute.args().first() { |
18 | if value & 1 == 1 { |
19 | arches.insert("x86" ); |
20 | } |
21 | if value & 2 == 2 { |
22 | arches.insert("x86_64" ); |
23 | arches.insert("arm64ec" ); |
24 | } |
25 | if value & 4 == 4 { |
26 | arches.insert("aarch64" ); |
27 | } |
28 | } |
29 | } |
30 | "DeprecatedAttribute" => { |
31 | features.insert("deprecated" .to_string()); |
32 | } |
33 | _ => {} |
34 | } |
35 | } |
36 | |
37 | let mut tokens = quote! {}; |
38 | |
39 | match arches.len() { |
40 | 0 => {} |
41 | 1 => tokens.combine(quote! { #[cfg(#(target_arch = #arches),*)] }), |
42 | _ => tokens.combine(quote! { #[cfg(any(#(target_arch = #arches),*))] }), |
43 | } |
44 | |
45 | let mut compact: Vec<&'static str> = dependencies.keys().map(|tn| tn.namespace()).collect(); |
46 | compact.sort(); |
47 | compact.dedup(); |
48 | |
49 | for pos in 0..compact.len() { |
50 | match (compact.get(pos), compact.get(pos + 1)) { |
51 | (Some(first), Some(second)) if namespace_starts_with(second, first) => { |
52 | compact.remove(pos); |
53 | } |
54 | (_, None) => break, |
55 | _ => continue, |
56 | } |
57 | } |
58 | |
59 | for dependency in compact { |
60 | if dependency.is_empty() |
61 | || namespace_starts_with(namespace, dependency) |
62 | || dependency == "Windows.Foundation" |
63 | || dependency == "Windows.Win32.Foundation" |
64 | { |
65 | continue; |
66 | } |
67 | |
68 | let mut feature = String::new(); |
69 | |
70 | for name in dependency.split('.' ).skip(1) { |
71 | feature.push_str(name); |
72 | feature.push('_' ); |
73 | } |
74 | |
75 | feature.truncate(feature.len() - 1); |
76 | features.insert(feature); |
77 | } |
78 | |
79 | match features.len() { |
80 | 0 => {} |
81 | 1 => { |
82 | if not { |
83 | tokens.combine(quote! { #[cfg(not(#(feature = #features)*))] }); |
84 | } else { |
85 | tokens.combine(quote! { #[cfg(#(feature = #features)*)] }); |
86 | } |
87 | } |
88 | _ => { |
89 | if not { |
90 | tokens.combine(quote! { #[cfg(not(all( #(feature = #features),* )))] }); |
91 | } else { |
92 | tokens.combine(quote! { #[cfg(all( #(feature = #features),* ))] }); |
93 | } |
94 | } |
95 | } |
96 | |
97 | tokens |
98 | } |
99 | } |
100 | |