forked from mirrors/gecko-dev
		
	 6bb8230ea7
			
		
	
	
		6bb8230ea7
		
	
	
	
	
		
			
			This sets the stage for an update to cubeb-coreaudio-rs. Differential Revision: https://phabricator.services.mozilla.com/D193899
		
			
				
	
	
		
			213 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			213 lines
		
	
	
	
		
			6.8 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! A public API for more fine-grained customization of bindgen behavior.
 | |
| 
 | |
| pub use crate::ir::analysis::DeriveTrait;
 | |
| pub use crate::ir::derive::CanDerive as ImplementsTrait;
 | |
| pub use crate::ir::enum_ty::{EnumVariantCustomBehavior, EnumVariantValue};
 | |
| pub use crate::ir::int::IntKind;
 | |
| use std::fmt;
 | |
| 
 | |
| /// An enum to allow ignoring parsing of macros.
 | |
| #[derive(Copy, Clone, Debug, PartialEq, Eq)]
 | |
| pub enum MacroParsingBehavior {
 | |
|     /// Ignore the macro, generating no code for it, or anything that depends on
 | |
|     /// it.
 | |
|     Ignore,
 | |
|     /// The default behavior bindgen would have otherwise.
 | |
|     Default,
 | |
| }
 | |
| 
 | |
| impl Default for MacroParsingBehavior {
 | |
|     fn default() -> Self {
 | |
|         MacroParsingBehavior::Default
 | |
|     }
 | |
| }
 | |
| 
 | |
| /// A trait to allow configuring different kinds of types in different
 | |
| /// situations.
 | |
| pub trait ParseCallbacks: fmt::Debug {
 | |
|     #[cfg(feature = "__cli")]
 | |
|     #[doc(hidden)]
 | |
|     fn cli_args(&self) -> Vec<String> {
 | |
|         vec![]
 | |
|     }
 | |
| 
 | |
|     /// This function will be run on every macro that is identified.
 | |
|     fn will_parse_macro(&self, _name: &str) -> MacroParsingBehavior {
 | |
|         MacroParsingBehavior::Default
 | |
|     }
 | |
| 
 | |
|     /// This function will run for every extern variable and function. The returned value determines
 | |
|     /// the name visible in the bindings.
 | |
|     fn generated_name_override(
 | |
|         &self,
 | |
|         _item_info: ItemInfo<'_>,
 | |
|     ) -> Option<String> {
 | |
|         None
 | |
|     }
 | |
| 
 | |
|     /// This function will run for every extern variable and function. The returned value determines
 | |
|     /// the link name in the bindings.
 | |
|     fn generated_link_name_override(
 | |
|         &self,
 | |
|         _item_info: ItemInfo<'_>,
 | |
|     ) -> Option<String> {
 | |
|         None
 | |
|     }
 | |
| 
 | |
|     /// The integer kind an integer macro should have, given a name and the
 | |
|     /// value of that macro, or `None` if you want the default to be chosen.
 | |
|     fn int_macro(&self, _name: &str, _value: i64) -> Option<IntKind> {
 | |
|         None
 | |
|     }
 | |
| 
 | |
|     /// This will be run on every string macro. The callback cannot influence the further
 | |
|     /// treatment of the macro, but may use the value to generate additional code or configuration.
 | |
|     fn str_macro(&self, _name: &str, _value: &[u8]) {}
 | |
| 
 | |
|     /// This will be run on every function-like macro. The callback cannot
 | |
|     /// influence the further treatment of the macro, but may use the value to
 | |
|     /// generate additional code or configuration.
 | |
|     ///
 | |
|     /// The first parameter represents the name and argument list (including the
 | |
|     /// parentheses) of the function-like macro. The second parameter represents
 | |
|     /// the expansion of the macro as a sequence of tokens.
 | |
|     fn func_macro(&self, _name: &str, _value: &[&[u8]]) {}
 | |
| 
 | |
|     /// This function should return whether, given an enum variant
 | |
|     /// name, and value, this enum variant will forcibly be a constant.
 | |
|     fn enum_variant_behavior(
 | |
|         &self,
 | |
|         _enum_name: Option<&str>,
 | |
|         _original_variant_name: &str,
 | |
|         _variant_value: EnumVariantValue,
 | |
|     ) -> Option<EnumVariantCustomBehavior> {
 | |
|         None
 | |
|     }
 | |
| 
 | |
|     /// Allows to rename an enum variant, replacing `_original_variant_name`.
 | |
|     fn enum_variant_name(
 | |
|         &self,
 | |
|         _enum_name: Option<&str>,
 | |
|         _original_variant_name: &str,
 | |
|         _variant_value: EnumVariantValue,
 | |
|     ) -> Option<String> {
 | |
|         None
 | |
|     }
 | |
| 
 | |
|     /// Allows to rename an item, replacing `_original_item_name`.
 | |
|     fn item_name(&self, _original_item_name: &str) -> Option<String> {
 | |
|         None
 | |
|     }
 | |
| 
 | |
|     /// This will be called on every header filename passed to (`Builder::header`)[`crate::Builder::header`].
 | |
|     fn header_file(&self, _filename: &str) {}
 | |
| 
 | |
|     /// This will be called on every file inclusion, with the full path of the included file.
 | |
|     fn include_file(&self, _filename: &str) {}
 | |
| 
 | |
|     /// This will be called every time `bindgen` reads an environment variable whether it has any
 | |
|     /// content or not.
 | |
|     fn read_env_var(&self, _key: &str) {}
 | |
| 
 | |
|     /// This will be called to determine whether a particular blocklisted type
 | |
|     /// implements a trait or not. This will be used to implement traits on
 | |
|     /// other types containing the blocklisted type.
 | |
|     ///
 | |
|     /// * `None`: use the default behavior
 | |
|     /// * `Some(ImplementsTrait::Yes)`: `_name` implements `_derive_trait`
 | |
|     /// * `Some(ImplementsTrait::Manually)`: any type including `_name` can't
 | |
|     ///   derive `_derive_trait` but can implemented it manually
 | |
|     /// * `Some(ImplementsTrait::No)`: `_name` doesn't implement `_derive_trait`
 | |
|     fn blocklisted_type_implements_trait(
 | |
|         &self,
 | |
|         _name: &str,
 | |
|         _derive_trait: DeriveTrait,
 | |
|     ) -> Option<ImplementsTrait> {
 | |
|         None
 | |
|     }
 | |
| 
 | |
|     /// Provide a list of custom derive attributes.
 | |
|     ///
 | |
|     /// If no additional attributes are wanted, this function should return an
 | |
|     /// empty `Vec`.
 | |
|     fn add_derives(&self, _info: &DeriveInfo<'_>) -> Vec<String> {
 | |
|         vec![]
 | |
|     }
 | |
| 
 | |
|     /// Process a source code comment.
 | |
|     fn process_comment(&self, _comment: &str) -> Option<String> {
 | |
|         None
 | |
|     }
 | |
| 
 | |
|     /// Potentially override the visibility of a composite type field.
 | |
|     ///
 | |
|     /// Caution: This allows overriding standard C++ visibility inferred by
 | |
|     /// `respect_cxx_access_specs`.
 | |
|     fn field_visibility(
 | |
|         &self,
 | |
|         _info: FieldInfo<'_>,
 | |
|     ) -> Option<crate::FieldVisibilityKind> {
 | |
|         None
 | |
|     }
 | |
| 
 | |
|     /// Process a function name that as exactly one `va_list` argument
 | |
|     /// to be wrapped as a variadic function with the wrapped static function
 | |
|     /// feature.
 | |
|     ///
 | |
|     /// The returned string is new function name.
 | |
|     #[cfg(feature = "experimental")]
 | |
|     fn wrap_as_variadic_fn(&self, _name: &str) -> Option<String> {
 | |
|         None
 | |
|     }
 | |
| }
 | |
| 
 | |
| /// Relevant information about a type to which new derive attributes will be added using
 | |
| /// [`ParseCallbacks::add_derives`].
 | |
| #[derive(Debug)]
 | |
| #[non_exhaustive]
 | |
| pub struct DeriveInfo<'a> {
 | |
|     /// The name of the type.
 | |
|     pub name: &'a str,
 | |
|     /// The kind of the type.
 | |
|     pub kind: TypeKind,
 | |
| }
 | |
| 
 | |
| #[derive(Debug, Clone, Copy, PartialEq, Eq)]
 | |
| /// The kind of the current type.
 | |
| pub enum TypeKind {
 | |
|     /// The type is a Rust `struct`.
 | |
|     Struct,
 | |
|     /// The type is a Rust `enum`.
 | |
|     Enum,
 | |
|     /// The type is a Rust `union`.
 | |
|     Union,
 | |
| }
 | |
| 
 | |
| /// A struct providing information about the item being passed to [`ParseCallbacks::generated_name_override`].
 | |
| #[non_exhaustive]
 | |
| pub struct ItemInfo<'a> {
 | |
|     /// The name of the item
 | |
|     pub name: &'a str,
 | |
|     /// The kind of item
 | |
|     pub kind: ItemKind,
 | |
| }
 | |
| 
 | |
| /// An enum indicating the kind of item for an ItemInfo.
 | |
| #[non_exhaustive]
 | |
| pub enum ItemKind {
 | |
|     /// A Function
 | |
|     Function,
 | |
|     /// A Variable
 | |
|     Var,
 | |
| }
 | |
| 
 | |
| /// Relevant information about a field for which visibility can be determined using
 | |
| /// [`ParseCallbacks::field_visibility`].
 | |
| #[derive(Debug)]
 | |
| #[non_exhaustive]
 | |
| pub struct FieldInfo<'a> {
 | |
|     /// The name of the type.
 | |
|     pub type_name: &'a str,
 | |
|     /// The name of the field.
 | |
|     pub field_name: &'a str,
 | |
| }
 |