1use super::*;
2
3#[derive(Copy, Clone, Debug, Hash, PartialEq, Eq)]
4pub struct TypeName(pub &'static str, pub &'static str);
5
6impl Ord for TypeName {
7 fn cmp(&self, other: &Self) -> Ordering {
8 // Type names are sorted before namespaces. The `Type` sort order depends on this.
9 // This is more efficient in general as many types typically share a namespace.
10 (self.1, self.0).cmp(&(other.1, other.0))
11 }
12}
13
14impl PartialOrd for TypeName {
15 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
16 Some(self.cmp(other))
17 }
18}
19
20impl TypeName {
21 pub const Object: Self = Self("System", "Object");
22 pub const GUID: Self = Self("System", "Guid");
23 pub const Type: Self = Self("System", "Type");
24 pub const IsConst: Self = Self("System.Runtime.CompilerServices", "IsConst");
25
26 pub const HResult: Self = Self("Windows.Foundation", "HResult");
27 pub const EventRegistrationToken: Self = Self("Windows.Foundation", "EventRegistrationToken");
28
29 pub const IAsyncAction: Self = Self("Windows.Foundation", "IAsyncAction");
30 pub const IAsyncActionWithProgress: Self =
31 Self("Windows.Foundation", "IAsyncActionWithProgress");
32 pub const IAsyncOperation: Self = Self("Windows.Foundation", "IAsyncOperation");
33 pub const IAsyncOperationWithProgress: Self =
34 Self("Windows.Foundation", "IAsyncOperationWithProgress");
35
36 pub const Matrix3x2: Self = Self("Windows.Foundation.Numerics", "Matrix3x2");
37 pub const Matrix4x4: Self = Self("Windows.Foundation.Numerics", "Matrix4x4");
38
39 pub const IIterable: Self = Self("Windows.Foundation.Collections", "IIterable");
40 pub const IIterator: Self = Self("Windows.Foundation.Collections", "IIterator");
41
42 pub const PWSTR: Self = Self("Windows.Win32.Foundation", "PWSTR");
43 pub const PSTR: Self = Self("Windows.Win32.Foundation", "PSTR");
44 pub const BSTR: Self = Self("Windows.Win32.Foundation", "BSTR");
45 pub const HRESULT: Self = Self("Windows.Win32.Foundation", "HRESULT");
46 pub const CHAR: Self = Self("Windows.Win32.Foundation", "CHAR");
47 pub const BOOL: Self = Self("Windows.Win32.Foundation", "BOOL");
48 pub const BOOLEAN: Self = Self("Windows.Win32.Foundation", "BOOLEAN");
49 pub const NTSTATUS: Self = Self("Windows.Win32.Foundation", "NTSTATUS");
50 pub const WIN32_ERROR: Self = Self("Windows.Win32.Foundation", "WIN32_ERROR");
51 pub const RPC_STATUS: Self = Self("Windows.Win32.System.Rpc", "RPC_STATUS");
52
53 pub const D2D_MATRIX_3X2_F: Self =
54 Self("Windows.Win32.Graphics.Direct2D.Common", "D2D_MATRIX_3X2_F");
55 pub const D3DMATRIX: Self = Self("Windows.Win32.Graphics.Direct3D", "D3DMATRIX");
56 pub const IUnknown: Self = Self("Windows.Win32.System.Com", "IUnknown");
57 pub const HSTRING: Self = Self("Windows.Win32.System.WinRT", "HSTRING");
58 pub const IInspectable: Self = Self("Windows.Win32.System.WinRT", "IInspectable");
59
60 pub const VARIANT: Self = Self("Windows.Win32.System.Variant", "VARIANT");
61 pub const PROPVARIANT: Self = Self("Windows.Win32.System.Com.StructuredStorage", "PROPVARIANT");
62
63 pub fn parse(full_name: &'static str) -> Self {
64 let index = full_name
65 .rfind('.')
66 .expect("Expected full name separated with `.`");
67 Self(&full_name[0..index], &full_name[index + 1..])
68 }
69
70 pub fn namespace(&self) -> &'static str {
71 self.0
72 }
73
74 pub fn name(&self) -> &'static str {
75 self.1
76 }
77
78 pub fn write(&self, writer: &Writer, generics: &[Type]) -> TokenStream {
79 let name = to_ident(self.name());
80 let namespace = writer.write_namespace(*self);
81
82 if generics.is_empty() {
83 quote! { #namespace #name }
84 } else {
85 let generics = generics.iter().map(|ty| ty.write_name(writer));
86 quote! { #namespace #name < #(#generics),* > }
87 }
88 }
89}
90
91impl std::fmt::Display for TypeName {
92 fn fmt(&self, fmt: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
93 write!(fmt, "{}.{}", self.0, self.1)
94 }
95}
96