diff --git a/src/bindgen/ir/enumeration.rs b/src/bindgen/ir/enumeration.rs index 2e633a7df..96312cae5 100644 --- a/src/bindgen/ir/enumeration.rs +++ b/src/bindgen/ir/enumeration.rs @@ -154,7 +154,7 @@ impl EnumVariant { let body_rule = enum_annotations .parse_atom::("rename-variant-name-fields") - .unwrap_or(config.enumeration.rename_variant_name_fields); + .unwrap_or(config.enumeration.rename_variant_name_fields.clone()); let body = match variant.fields { syn::Fields::Unit => VariantBody::Empty(annotations), @@ -556,7 +556,7 @@ impl Item for Enum { let rules = self .annotations .parse_atom::("rename-all") - .unwrap_or(config.enumeration.rename_variants); + .unwrap_or(config.enumeration.rename_variants.clone()); if let Some(r) = rules.not_none() { self.variants = self diff --git a/src/bindgen/ir/function.rs b/src/bindgen/ir/function.rs index 79adfce94..99d926746 100644 --- a/src/bindgen/ir/function.rs +++ b/src/bindgen/ir/function.rs @@ -159,7 +159,7 @@ impl Function { let rules = self .annotations .parse_atom::("rename-all") - .unwrap_or(config.function.rename_args); + .unwrap_or(config.function.rename_args.clone()); if let Some(r) = rules.not_none() { let args = std::mem::take(&mut self.args); diff --git a/src/bindgen/ir/structure.rs b/src/bindgen/ir/structure.rs index 9b33a15c7..fe71d22c6 100644 --- a/src/bindgen/ir/structure.rs +++ b/src/bindgen/ir/structure.rs @@ -342,7 +342,7 @@ impl Item for Struct { let field_rules = self .annotations .parse_atom::("rename-all") - .unwrap_or(config.structure.rename_fields); + .unwrap_or(config.structure.rename_fields.clone()); if let Some(o) = self.annotations.list("field-names") { for (dest, src) in names.zip(o) { diff --git a/src/bindgen/ir/union.rs b/src/bindgen/ir/union.rs index 410e21a27..fb47a1efa 100644 --- a/src/bindgen/ir/union.rs +++ b/src/bindgen/ir/union.rs @@ -171,7 +171,7 @@ impl Item for Union { let rules = self .annotations .parse_atom::("rename-all") - .unwrap_or(config.structure.rename_fields); + .unwrap_or(config.structure.rename_fields.clone()); if let Some(o) = self.annotations.list("field-names") { let mut overriden_fields = Vec::new(); diff --git a/src/bindgen/mangle.rs b/src/bindgen/mangle.rs index 52c3be93e..c5de0c8c9 100644 --- a/src/bindgen/mangle.rs +++ b/src/bindgen/mangle.rs @@ -93,6 +93,7 @@ impl<'a> Mangler<'a> { &self .config .rename_types + .clone() .apply(&sub_path, IdentifierType::Type), ); } @@ -101,6 +102,7 @@ impl<'a> Mangler<'a> { &self .config .rename_types + .clone() .apply(primitive.to_repr_rust(), IdentifierType::Type), ); } diff --git a/src/bindgen/rename.rs b/src/bindgen/rename.rs index f594939e8..aa40b68ba 100644 --- a/src/bindgen/rename.rs +++ b/src/bindgen/rename.rs @@ -28,7 +28,7 @@ impl<'a> IdentifierType<'a> { } /// A rule to apply to an identifier when generating bindings. -#[derive(Debug, Clone, Copy, Default)] +#[derive(Debug, Clone, Default)] pub enum RenameRule { /// Do not apply any renaming. The default. #[default] @@ -50,6 +50,8 @@ pub enum RenameRule { /// Converts the identifier to SCREAMING_SNAKE_CASE and prefixes enum variants /// with the enum name. QualifiedScreamingSnakeCase, + /// Adds a given prefix + Prefix(String), } impl RenameRule { @@ -61,7 +63,7 @@ impl RenameRule { } /// Applies the rename rule to a string - pub fn apply<'a>(self, text: &'a str, context: IdentifierType) -> Cow<'a, str> { + pub fn apply<'a>(&self, text: &'a str, context: IdentifierType) -> Cow<'a, str> { use heck::*; if text.is_empty() { @@ -90,6 +92,7 @@ impl RenameRule { result.push_str(&RenameRule::ScreamingSnakeCase.apply(text, context)); result } + RenameRule::Prefix(prefix) => prefix.to_owned() + text, }) } } @@ -98,6 +101,9 @@ impl FromStr for RenameRule { type Err = String; fn from_str(s: &str) -> Result { + const PREFIX: &str = "prefix:"; + const PREFIX_LEN: usize = PREFIX.len(); + match s { "none" => Ok(RenameRule::None), "None" => Ok(RenameRule::None), @@ -132,6 +138,8 @@ impl FromStr for RenameRule { "QualifiedScreamingSnakeCase" => Ok(RenameRule::QualifiedScreamingSnakeCase), "qualified_screaming_snake_case" => Ok(RenameRule::QualifiedScreamingSnakeCase), + s if s.starts_with(PREFIX) => Ok(RenameRule::Prefix(s[PREFIX_LEN..].to_string())), + _ => Err(format!("Unrecognized RenameRule: '{}'.", s)), } }