summaryrefslogtreecommitdiffstats
path: root/third_party/rust/bindgen/callbacks.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 19:33:14 +0000
commit36d22d82aa202bb199967e9512281e9a53db42c9 (patch)
tree105e8c98ddea1c1e4784a60a5a6410fa416be2de /third_party/rust/bindgen/callbacks.rs
parentInitial commit. (diff)
downloadfirefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.tar.xz
firefox-esr-36d22d82aa202bb199967e9512281e9a53db42c9.zip
Adding upstream version 115.7.0esr.upstream/115.7.0esr
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/bindgen/callbacks.rs')
-rw-r--r--third_party/rust/bindgen/callbacks.rs165
1 files changed, 165 insertions, 0 deletions
diff --git a/third_party/rust/bindgen/callbacks.rs b/third_party/rust/bindgen/callbacks.rs
new file mode 100644
index 0000000000..dc20e2581e
--- /dev/null
+++ b/third_party/rust/bindgen/callbacks.rs
@@ -0,0 +1,165 @@
+//! 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
+ }
+
+ /// 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 file inclusion, with the full path of the included file.
+ fn include_file(&self, _filename: &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
+ }
+}
+
+/// 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,
+}
+
+/// An 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,
+}