Skip to content

Commit

Permalink
Add callback to override field visibility
Browse files Browse the repository at this point in the history
  • Loading branch information
Jethro Beekman committed May 25, 2023
1 parent da0c42c commit cc966e4
Show file tree
Hide file tree
Showing 7 changed files with 358 additions and 42 deletions.
185 changes: 185 additions & 0 deletions bindgen-tests/tests/expectations/tests/field-visibility-callback.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

42 changes: 37 additions & 5 deletions bindgen-tests/tests/expectations/tests/private_fields.rs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions bindgen-tests/tests/headers/field-visibility-callback.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
// bindgen-flags: --default-visibility private
// bindgen-parse-callbacks: field-visibility-default-private

struct my_struct {
int a;
int private_b;
int c: 1;
int private_d: 1;
};
5 changes: 5 additions & 0 deletions bindgen-tests/tests/headers/private_fields.hpp
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
// bindgen-flags: --respect-cxx-access-specs
// bindgen-parse-callbacks: field-visibility-default-public

class PubPriv {
public:
Expand Down Expand Up @@ -50,9 +51,13 @@ class Override {
// override with annotation
/** <div rustbindgen private></div> */
unsigned int b;
// override with callback
unsigned int private_c;

unsigned int bf_a : 4;
// override with annotation
/** <div rustbindgen private></div> */
unsigned int bf_b : 4;
// override with callback
unsigned int private_bf_c : 4;
};
61 changes: 51 additions & 10 deletions bindgen-tests/tests/parse_callbacks/mod.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
use bindgen::callbacks::*;
use bindgen::FieldVisibilityKind;

#[derive(Debug)]
pub struct RemovePrefixParseCallback {
Expand Down Expand Up @@ -86,25 +87,65 @@ impl ParseCallbacks for BlocklistedTypeImplementsTrait {
}
}

#[derive(Debug)]
struct FieldVisibility {
default: FieldVisibilityKind,
}

/// Implements the `field_visibility` function of the trait by checking if the
/// field name starts with `private_`. If it does it makes it private, if it
/// doesn't it makes it public, taking into account the default visibility.
impl ParseCallbacks for FieldVisibility {
fn field_visibility(
&self,
FieldInfo { field_name, .. }: FieldInfo,
) -> Option<FieldVisibilityKind> {
match (self.default, field_name.starts_with("private_")) {
(FieldVisibilityKind::Private, false) => {
Some(FieldVisibilityKind::Public)
}
(FieldVisibilityKind::Public, true) => {
Some(FieldVisibilityKind::Private)
}
(FieldVisibilityKind::PublicCrate, _) => unimplemented!(),
_ => None,
}
}
}

pub fn lookup(cb: &str) -> Box<dyn ParseCallbacks> {
fn try_strip_prefix<'a>(s: &'a str, prefix: &str) -> Option<&'a str> {
if s.starts_with(prefix) {
Some(&s[prefix.len()..])
} else {
None
}
}

match cb {
"enum-variant-rename" => Box::new(EnumVariantRename),
"blocklisted-type-implements-trait" => {
Box::new(BlocklistedTypeImplementsTrait)
}
call_back => {
if call_back.starts_with("remove-function-prefix-") {
let prefix = call_back
.split("remove-function-prefix-")
.last()
.to_owned();
let lnopc = RemovePrefixParseCallback::new(prefix.unwrap());
if let Some(prefix) =
try_strip_prefix(call_back, "remove-function-prefix-")
{
let lnopc = RemovePrefixParseCallback::new(prefix);
Box::new(lnopc)
} else if call_back.starts_with("prefix-link-name-") {
let prefix =
call_back.split("prefix-link-name-").last().to_owned();
let plnpc = PrefixLinkNameParseCallback::new(prefix.unwrap());
} else if let Some(prefix) =
try_strip_prefix(call_back, "prefix-link-name-")
{
let plnpc = PrefixLinkNameParseCallback::new(prefix);
Box::new(plnpc)
} else if let Some(default) =
try_strip_prefix(call_back, "field-visibility-default-")
{
Box::new(FieldVisibility {
default: default.parse().expect(
"unable to parse field-visibility-default callback",
),
})
} else {
panic!("Couldn't find name ParseCallbacks: {}", cb)
}
Expand Down
Loading

0 comments on commit cc966e4

Please sign in to comment.