Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add rename-all=prefix #1021

Merged
merged 3 commits into from
Oct 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 8 additions & 7 deletions src/bindgen/ir/enumeration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -152,9 +152,10 @@ impl EnumVariant {
annotations.add_default("derive-ostream", AnnotationValue::Bool(b));
}

let body_rule = enum_annotations
.parse_atom::<RenameRule>("rename-variant-name-fields")
.unwrap_or(config.enumeration.rename_variant_name_fields);
let body_rule = enum_annotations.parse_atom::<RenameRule>("rename-variant-name-fields");
let body_rule = body_rule
.as_ref()
.unwrap_or(&config.enumeration.rename_variant_name_fields);

let body = match variant.fields {
syn::Fields::Unit => VariantBody::Empty(annotations),
Expand Down Expand Up @@ -555,10 +556,10 @@ impl Item for Enum {
}
}

let rules = self
.annotations
.parse_atom::<RenameRule>("rename-all")
.unwrap_or(config.enumeration.rename_variants);
let rules = self.annotations.parse_atom::<RenameRule>("rename-all");
let rules = rules
.as_ref()
.unwrap_or(&config.enumeration.rename_variants);

if let Some(r) = rules.not_none() {
self.variants = self
Expand Down
6 changes: 2 additions & 4 deletions src/bindgen/ir/function.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,10 +156,8 @@ impl Function {
self.ret.rename_for_config(config, &generic_params);

// Apply rename rules to argument names
let rules = self
.annotations
.parse_atom::<RenameRule>("rename-all")
.unwrap_or(config.function.rename_args);
let rules = self.annotations.parse_atom::<RenameRule>("rename-all");
let rules = rules.as_ref().unwrap_or(&config.function.rename_args);

if let Some(r) = rules.not_none() {
let args = std::mem::take(&mut self.args);
Expand Down
8 changes: 4 additions & 4 deletions src/bindgen/ir/structure.rs
Original file line number Diff line number Diff line change
Expand Up @@ -339,10 +339,10 @@ impl Item for Struct {
{
let names = self.fields.iter_mut().map(|field| &mut field.name);

let field_rules = self
.annotations
.parse_atom::<RenameRule>("rename-all")
.unwrap_or(config.structure.rename_fields);
let field_rules = self.annotations.parse_atom::<RenameRule>("rename-all");
let field_rules = field_rules
.as_ref()
.unwrap_or(&config.structure.rename_fields);

if let Some(o) = self.annotations.list("field-names") {
for (dest, src) in names.zip(o) {
Expand Down
6 changes: 2 additions & 4 deletions src/bindgen/ir/union.rs
Original file line number Diff line number Diff line change
Expand Up @@ -168,10 +168,8 @@ impl Item for Union {
field.ty.rename_for_config(config, &self.generic_params);
}

let rules = self
.annotations
.parse_atom::<RenameRule>("rename-all")
.unwrap_or(config.structure.rename_fields);
let rules = self.annotations.parse_atom::<RenameRule>("rename-all");
let rules = rules.as_ref().unwrap_or(&config.structure.rename_fields);

if let Some(o) = self.annotations.list("field-names") {
let mut overriden_fields = Vec::new();
Expand Down
14 changes: 11 additions & 3 deletions src/bindgen/rename.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand All @@ -50,18 +50,20 @@ 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 {
pub(crate) fn not_none(self) -> Option<Self> {
pub(crate) fn not_none(&self) -> Option<&Self> {
match self {
RenameRule::None => None,
other => Some(other),
}
}

/// 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() {
Expand Down Expand Up @@ -90,6 +92,7 @@ impl RenameRule {
result.push_str(&RenameRule::ScreamingSnakeCase.apply(text, context));
result
}
RenameRule::Prefix(prefix) => prefix.to_owned() + text,
})
}
}
Expand All @@ -98,6 +101,9 @@ impl FromStr for RenameRule {
type Err = String;

fn from_str(s: &str) -> Result<RenameRule, Self::Err> {
const PREFIX: &str = "prefix:";
const PREFIX_LEN: usize = PREFIX.len();

match s {
"none" => Ok(RenameRule::None),
"None" => Ok(RenameRule::None),
Expand Down Expand Up @@ -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)),
}
}
Expand Down
2 changes: 2 additions & 0 deletions tests/expectations/rename_case.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,5 @@ void test_snake_case(int32_t foo_bar);
void test_screaming_snake_case(int32_t FOO_BAR);

void test_gecko_case(int32_t aFooBar);

void test_prefix(int32_t prefix_foo_bar);
2 changes: 2 additions & 0 deletions tests/expectations/rename_case.compat.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ void test_screaming_snake_case(int32_t FOO_BAR);

void test_gecko_case(int32_t aFooBar);

void test_prefix(int32_t prefix_foo_bar);

#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
2 changes: 2 additions & 0 deletions tests/expectations/rename_case.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,6 @@ void test_screaming_snake_case(int32_t FOO_BAR);

void test_gecko_case(int32_t aFooBar);

void test_prefix(int32_t prefix_foo_bar);

} // extern "C"
2 changes: 2 additions & 0 deletions tests/expectations/rename_case.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,5 @@ cdef extern from *:
void test_screaming_snake_case(int32_t FOO_BAR);

void test_gecko_case(int32_t aFooBar);

void test_prefix(int32_t prefix_foo_bar);
4 changes: 4 additions & 0 deletions tests/rust/rename_case.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,7 @@ pub extern "C" fn test_screaming_snake_case(foo_bar: i32) {}
/// cbindgen:rename-all=GeckoCase
#[no_mangle]
pub extern "C" fn test_gecko_case(foo_bar: i32) {}

/// cbindgen:rename-all=prefix:prefix_
#[no_mangle]
pub extern "C" fn test_prefix(foo_bar: i32) {}
Loading