1 | use super::*; |
---|---|
2 | |
3 | impl Writer { |
4 | pub fn write_core(&self) -> TokenStream { |
5 | if self.config.sys { |
6 | if self.config.package || !self.config.no_core { |
7 | quote! { windows_sys::core:: } |
8 | } else if self.config.flat { |
9 | quote! {} |
10 | } else { |
11 | let mut tokens = TokenStream::new(); |
12 | |
13 | for _ in 0..self.namespace.split('.').count() { |
14 | tokens.push_str("super::"); |
15 | } |
16 | |
17 | tokens |
18 | } |
19 | } else { |
20 | quote! { windows_core:: } |
21 | } |
22 | } |
23 | |
24 | pub fn write_generic_phantoms(&self, generics: &[Type]) -> TokenStream { |
25 | if generics.is_empty() { |
26 | quote! {} |
27 | } else { |
28 | let generics = generics.iter().map(|ty| ty.write_name(self)); |
29 | quote! { #(core::marker::PhantomData::<#generics>),* } |
30 | } |
31 | } |
32 | |
33 | pub fn write_generic_named_phantoms(&self, generics: &[Type]) -> TokenStream { |
34 | if generics.is_empty() { |
35 | quote! {} |
36 | } else { |
37 | let generics = generics.iter().map(|ty| ty.write_name(self)); |
38 | quote! { #(#generics: core::marker::PhantomData::<#generics>),* } |
39 | } |
40 | } |
41 | |
42 | pub fn write_generic_constraints(&self, generics: &[Type]) -> TokenStream { |
43 | if generics.is_empty() { |
44 | quote! {} |
45 | } else { |
46 | let generics = generics.iter().map(|ty| ty.write_name(self)); |
47 | quote! { #(#generics: windows_core::RuntimeType + 'static,)* } |
48 | } |
49 | } |
50 | |
51 | pub fn write_namespace(&self, type_name: TypeName) -> TokenStream { |
52 | let mut tokens = TokenStream::new(); |
53 | |
54 | if type_name.namespace().is_empty() { |
55 | return tokens; |
56 | } |
57 | |
58 | if let Some(reference) = { |
59 | if self.config.types.contains_key(&type_name) { |
60 | None |
61 | } else { |
62 | self.config.references.contains(type_name) |
63 | } |
64 | } { |
65 | tokens.push_str(&reference.name); |
66 | tokens.push_str("::"); |
67 | |
68 | if reference.style == ReferenceStyle::Flat { |
69 | return tokens; |
70 | } |
71 | |
72 | let mut namespace = type_name.namespace().split('.').peekable(); |
73 | |
74 | if reference.style == ReferenceStyle::SkipRoot { |
75 | namespace.next(); |
76 | } |
77 | |
78 | for namespace in namespace { |
79 | tokens.push_str(namespace); |
80 | tokens.push_str("::"); |
81 | } |
82 | |
83 | tokens |
84 | } else { |
85 | if self.config.flat || type_name.namespace() == self.namespace { |
86 | return tokens; |
87 | } |
88 | |
89 | let mut relative = self.namespace.split('.').peekable(); |
90 | let mut namespace = type_name.namespace().split('.').peekable(); |
91 | |
92 | while relative.peek() == namespace.peek() { |
93 | if relative.next().is_none() { |
94 | break; |
95 | } |
96 | |
97 | namespace.next(); |
98 | } |
99 | |
100 | for _ in 0..relative.count() { |
101 | tokens.push_str("super::"); |
102 | } |
103 | |
104 | for namespace in namespace { |
105 | tokens.push_str(namespace); |
106 | tokens.push_str("::"); |
107 | } |
108 | |
109 | tokens |
110 | } |
111 | } |
112 | } |
113 |