]>
git.proxmox.com Git - rustc.git/blob - vendor/windows-bindgen/src/interfaces.rs
3 pub fn gen(gen
: &Gen
, def
: TypeDef
) -> TokenStream
{
5 gen_sys_interface(gen
, def
)
7 gen_win_interface(gen
, def
)
11 fn gen_sys_interface(gen
: &Gen
, def
: TypeDef
) -> TokenStream
{
12 let name
= gen
.reader
.type_def_name(def
);
13 let ident
= to_ident(name
);
15 if gen
.reader
.type_def_is_exclusive(def
) {
19 pub type #ident = *mut ::core::ffi::c_void;
24 fn gen_win_interface(gen
: &Gen
, def
: TypeDef
) -> TokenStream
{
25 let generics
: &Vec
<Type
> = &gen
.reader
.type_def_generics(def
).collect();
26 let ident
= gen
.type_def_name(def
, generics
);
27 let is_exclusive
= gen
.reader
.type_def_is_exclusive(def
);
28 let phantoms
= gen
.generic_phantoms(generics
);
29 let constraints
= gen
.generic_constraints(generics
);
30 let cfg
= gen
.reader
.type_def_cfg(def
, &[]);
31 let doc
= gen
.cfg_doc(&cfg
);
32 let features
= gen
.cfg_features(&cfg
);
35 .type_interfaces(&Type
::TypeDef((def
, generics
.to_vec())));
36 let vtables
= gen
.reader
.type_def_vtables(def
);
37 let has_unknown_base
= matches
!(vtables
.first(), Some(Type
::IUnknown
));
39 let mut tokens
= if is_exclusive
{
40 quote
! { #[doc(hidden)] }
46 tokens
.combine("e
! {
49 pub struct #ident(::windows::core::IUnknown, #phantoms) where #constraints;
52 tokens
.combine("e
! {
55 pub struct #ident(::std::ptr::NonNull<::std::ffi::c_void>);
60 let mut methods
= quote
! {}
;
61 // We need to distinguish between public and virtual methods because some WinRT type hierarchies inherit colliding (overloaded)
62 // methods that must be distinguishable.
63 let method_names
= &mut MethodNames
::new();
64 let virtual_names
= &mut MethodNames
::new();
69 .contains(TypeAttributes
::WINRT
)
71 for method
in gen
.reader
.type_def_methods(def
) {
72 methods
.combine(&winrt_methods
::gen(
76 InterfaceKind
::Default
,
82 for interface
in &interfaces
{
83 if let Type
::TypeDef((def
, generics
)) = &interface
.ty
{
84 for method
in gen
.reader
.type_def_methods(*def
) {
85 methods
.combine(&winrt_methods
::gen(
98 let mut bases
= vtables
.len();
101 Type
::IUnknown
| Type
::IInspectable
=> {}
102 Type
::TypeDef((def
, _
)) => {
103 let kind
= if gen
.reader
.type_def_type_name(*def
) == TypeName
::IDispatch
{
106 InterfaceKind
::Default
108 for method
in gen
.reader
.type_def_methods(*def
) {
109 methods
.combine(&com_methods
::gen(
120 _
=> unimplemented
!(),
125 for method
in gen
.reader
.type_def_methods(def
) {
126 methods
.combine(&com_methods
::gen(
129 InterfaceKind
::Default
,
138 tokens
.combine("e
! {
140 impl<#constraints> #ident {
145 if !vtables
.is_empty() && generics
.is_empty() {
146 let mut hierarchy
= format
!("::windows::imp::interface_hierarchy!({ident}");
147 let mut hierarchy_cfg
= cfg
.clone();
150 let into
= gen
.type_name(ty
);
152 write
!(&mut hierarchy
, ", {into}").unwrap();
153 hierarchy_cfg
= hierarchy_cfg
.union(&gen
.reader
.type_cfg(ty
));
156 hierarchy
.push_str(");");
157 tokens
.combine(&gen
.cfg_features(&hierarchy_cfg
));
158 tokens
.push_str(&hierarchy
);
161 let into
= gen
.type_name(ty
);
162 let cfg
= gen
.cfg_features(&cfg
.union(&gen
.reader
.type_cfg(ty
)));
163 tokens
.combine("e
! {
165 impl<#constraints> windows::core::CanInto<#into> for #ident {}
173 .contains(TypeAttributes
::WINRT
)
175 for interface
in &interfaces
{
176 let into
= gen
.type_name(&interface
.ty
);
177 let cfg
= gen
.cfg_features(&cfg
.union(&gen
.reader
.type_cfg(&interface
.ty
)));
178 tokens
.combine("e
! {
180 impl<#constraints> windows::core::CanTryInto<#into> for #ident {}
185 tokens
.combine(&gen
.interface_core_traits(
193 tokens
.combine(&gen
.interface_winrt_trait(
201 tokens
.combine(&gen
.async_get(def
, generics
, &ident
, &constraints
, &phantoms
, &features
));
202 tokens
.combine(&iterators
::gen(
211 tokens
.combine(&gen
.agile(def
, &ident
, &constraints
, &features
));
214 tokens
.combine(&gen
.interface_trait(
222 tokens
.combine(&gen
.interface_vtbl(def
, generics
, &ident
, &constraints
, &features
));