3 pub fn gen(gen
: &Gen
, def
: MethodDef
) -> TokenStream
{
5 gen_sys_function(gen
, def
)
7 gen_win_function(gen
, def
)
11 fn gen_sys_function(gen
: &Gen
, def
: MethodDef
) -> TokenStream
{
12 let signature
= gen
.reader
.method_def_signature(def
, &[]);
13 let cfg
= gen
.reader
.signature_cfg(&signature
);
14 let mut tokens
= gen
.cfg_features(&cfg
);
15 tokens
.combine(&gen_link(gen
, &signature
, &cfg
));
19 fn gen_win_function(gen
: &Gen
, def
: MethodDef
) -> TokenStream
{
20 let name
= to_ident(gen
.reader
.method_def_name(def
));
21 let signature
= gen
.reader
.method_def_signature(def
, &[]);
22 let generics
= gen
.constraint_generics(&signature
.params
);
23 let where_clause
= gen
.where_clause(&signature
.params
);
24 let abi_return_type
= gen
.return_sig(&signature
);
25 let cfg
= gen
.reader
.signature_cfg(&signature
);
26 let doc
= gen
.cfg_doc(&cfg
);
27 let features
= gen
.cfg_features(&cfg
);
28 let link
= gen_link(gen
, &signature
, &cfg
);
30 let kind
= gen
.reader
.signature_kind(&signature
);
32 SignatureKind
::Query(_
) => {
33 let args
= gen
.win32_args(&signature
.params
, kind
);
34 let params
= gen
.win32_params(&signature
.params
, kind
);
35 let generics
= expand_generics(generics
, quote
!(T
));
37 expand_where_clause(where_clause
, quote
!(T
: ::windows
::core
::ComInterface
));
43 pub unsafe fn #name<#generics>(#params) -> ::windows::core::Result<T> #where_clause {
45 let mut result__
= ::std
::ptr
::null_mut();
46 #name(#args).from_abi(result__)
50 SignatureKind
::QueryOptional(_
) => {
51 let args
= gen
.win32_args(&signature
.params
, kind
);
52 let params
= gen
.win32_params(&signature
.params
, kind
);
53 let generics
= expand_generics(generics
, quote
!(T
));
55 expand_where_clause(where_clause
, quote
!(T
: ::windows
::core
::ComInterface
));
61 pub unsafe fn #name<#generics>(#params result__: *mut ::core::option::Option<T>) -> ::windows::core::Result<()> #where_clause {
67 SignatureKind
::ResultValue
=> {
68 let args
= gen
.win32_args(&signature
.params
, kind
);
69 let params
= gen
.win32_params(&signature
.params
, kind
);
70 let return_type
= signature
.params
[signature
.params
.len() - 1].ty
.deref();
71 let return_type
= gen
.type_name(&return_type
);
77 pub unsafe fn #name<#generics>(#params) -> ::windows::core::Result<#return_type> #where_clause {
79 let mut result__
= ::windows
::core
::zeroed
::<#return_type>();
80 #name(#args).from_abi(result__)
84 SignatureKind
::ResultVoid
=> {
85 let args
= gen
.win32_args(&signature
.params
, kind
);
86 let params
= gen
.win32_params(&signature
.params
, kind
);
92 pub unsafe fn #name<#generics>(#params) -> ::windows::core::Result<()> #where_clause {
98 SignatureKind
::ReturnValue
=> {
99 let args
= gen
.win32_args(&signature
.params
, kind
);
100 let params
= gen
.win32_params(&signature
.params
, kind
);
101 let return_type
= signature
.params
[signature
.params
.len() - 1].ty
.deref();
102 let is_nullable
= gen
.reader
.type_is_nullable(&return_type
);
103 let return_type
= gen
.type_name(&return_type
);
110 pub unsafe fn #name<#generics>(#params) -> ::windows::core::Result<#return_type> #where_clause {
112 let mut result__
= ::windows
::core
::zeroed
::<#return_type>();
114 ::windows
::core
::from_abi(result__
.assume_init())
122 pub unsafe fn #name<#generics>(#params) -> #return_type #where_clause {
124 let mut result__
= ::windows
::core
::zeroed
::<#return_type>();
126 ::std
::mem
::transmute(result__
)
131 SignatureKind
::ReturnStruct
| SignatureKind
::PreserveSig
=> {
132 if handle_last_error(gen
, def
, &signature
) {
133 let args
= gen
.win32_args(&signature
.params
, kind
);
134 let params
= gen
.win32_params(&signature
.params
, kind
);
135 let return_type
= gen
.type_name(&signature
.return_type
.unwrap());
141 pub unsafe fn #name<#generics>(#params) -> ::windows::core::Result<#return_type> #where_clause {
143 let result__
= #name(#args);
144 ::windows
::imp
::then(!result__
.is_invalid(), ||result__
).ok_or_else(::windows
::core
::Error
::from_win32
)
148 let args
= gen
.win32_args(&signature
.params
, kind
);
149 let params
= gen
.win32_params(&signature
.params
, kind
);
155 pub unsafe fn #name<#generics>(#params) #abi_return_type #where_clause {
162 SignatureKind
::ReturnVoid
=> {
163 let args
= gen
.win32_args(&signature
.params
, kind
);
164 let params
= gen
.win32_params(&signature
.params
, kind
);
165 let does_not_return
= does_not_return(gen
, def
);
171 pub unsafe fn #name<#generics>(#params) #does_not_return #where_clause {
180 fn gen_link(gen
: &Gen
, signature
: &Signature
, cfg
: &Cfg
) -> TokenStream
{
181 let name
= gen
.reader
.method_def_name(signature
.def
);
182 let ident
= to_ident(name
);
183 let library
= gen
.reader
.method_def_module_name(signature
.def
);
184 let abi
= gen
.reader
.method_def_extern_abi(signature
.def
);
186 let symbol
= if let Some(impl_map
) = gen
.reader
.method_def_impl_map(signature
.def
) {
187 gen
.reader
.impl_map_import_name(impl_map
)
192 let link_name
= if symbol
!= name
{
193 quote
! { #[link_name = #symbol] }
198 let params
= signature
.params
.iter().map(|p
| {
199 let name
= gen
.param_name(p
.def
);
200 let tokens
= if p
.kind
== SignatureParamKind
::ValueType
{
201 gen
.type_default_name(&p
.ty
)
203 gen
.type_abi_name(&p
.ty
)
205 quote
! { #name: #tokens }
208 let return_type
= gen
.return_sig(signature
);
210 if gen
.std
|| !gen
.namespace
.starts_with("Windows.") {
211 let library
= library
.trim_end_matches(".dll");
214 #[link(name = #library)]
217 pub fn #ident(#(#params),*) #return_type;
220 } else if let Some(library
) = gen
.reader
.method_def_static_lib(signature
.def
) {
222 #[link(name = #library, kind = "static")]
225 pub fn #ident(#(#params),*) #return_type;
229 let symbol
= if symbol
!= name
{
230 format
!(" \"{symbol}\"")
235 let doc
= if gen
.sys
{
241 let mut tokens
= String
::new();
242 for param
in params
{
243 tokens
.push_str(&format
!("{}, ", param
.as_str()));
245 let tokens
= tokens
.trim_end_matches(", ");
247 r
#"::windows_targets::link!("{library}" "{abi}"{symbol}{doc} fn {name}({tokens}){return_type});"#
253 fn does_not_return(gen
: &Gen
, def
: MethodDef
) -> TokenStream
{
254 if gen
.reader
.method_def_does_not_return(def
) {
261 fn handle_last_error(gen
: &Gen
, def
: MethodDef
, signature
: &Signature
) -> bool
{
262 if let Some(map
) = gen
.reader
.method_def_impl_map(def
) {
266 .contains(PInvokeAttributes
::LAST_ERROR
)
268 if let Some(Type
::TypeDef((return_type
, _
))) = &signature
.return_type
{
269 if gen
.reader
.type_def_is_handle(*return_type
) {
272 .type_def_underlying_type(*return_type
)
277 if !gen
.reader
.type_def_invalid_values(*return_type
).is_empty() {