188: Generate extension names r=MaikKlein a=MaikKlein

Adds extension names to the function pointer structs.

`vk::KhrSwapchain::name()`

Currently Rust doesn't support `CStr` as associated consts, so functions have to be used for now.

Co-authored-by: Maik Klein <maikklein@googlemail.com>
This commit is contained in:
bors[bot] 2019-02-12 18:36:33 +00:00
commit 2619101393
2 changed files with 3651 additions and 2164 deletions

File diff suppressed because it is too large Load diff

View file

@ -427,9 +427,6 @@ impl quote::ToTokens for ConstVal {
} }
} }
impl Constant { impl Constant {
// pub fn type(&self) -> Type {
// }
pub fn value(&self) -> Option<ConstVal> { pub fn value(&self) -> Option<ConstVal> {
match *self { match *self {
Constant::Number(n) => Some(ConstVal::U64(n as u64)), Constant::Number(n) => Some(ConstVal::U64(n as u64)),
@ -871,6 +868,7 @@ pub fn generate_extension_constants<'a>(
const_cache: &mut HashSet<&'a str>, const_cache: &mut HashSet<&'a str>,
const_values: &mut HashMap<Ident, Vec<Ident>>, const_values: &mut HashMap<Ident, Vec<Ident>>,
) -> quote::Tokens { ) -> quote::Tokens {
use vk_parse::EnumSpec;
let items = extension_items let items = extension_items
.iter() .iter()
.filter_map(|item| match item { .filter_map(|item| match item {
@ -880,7 +878,6 @@ pub fn generate_extension_constants<'a>(
.flat_map(|iter| iter); .flat_map(|iter| iter);
let enum_tokens = items.filter_map(|item| match item { let enum_tokens = items.filter_map(|item| match item {
vk_parse::InterfaceItem::Enum(_enum) => { vk_parse::InterfaceItem::Enum(_enum) => {
use vk_parse::EnumSpec;
if const_cache.contains(_enum.name.as_str()) { if const_cache.contains(_enum.name.as_str()) {
return None; return None;
} }
@ -952,7 +949,22 @@ pub fn generate_extension_commands<'a>(
.collect_vec(); .collect_vec();
let name = format!("{}Fn", extension_name.to_camel_case()); let name = format!("{}Fn", extension_name.to_camel_case());
let ident = Ident::from(&name[2..]); let ident = Ident::from(&name[2..]);
generate_function_pointers(ident, &commands, fn_cache) let fp = generate_function_pointers(ident, &commands, fn_cache);
let byte_name = format!("{}\0", extension_name);
let byte_name_ident =
syn::LitByteStr::new(byte_name.as_bytes(), proc_macro2::Span::call_site());
let extension_cstr = quote! {
impl #ident {
pub fn name() -> &'static ::std::ffi::CStr {
::std::ffi::CStr::from_bytes_with_nul(#byte_name_ident).expect("Wrong extension string")
}
}
};
quote! {
#extension_cstr
#fp
}
} }
pub fn generate_extension<'a>( pub fn generate_extension<'a>(
extension: &'a vk_parse::Extension, extension: &'a vk_parse::Extension,