Open
Description
Hi,
Sorry if I'm missing something but there doesn't seem to be a way to override the integer type of a constified enum module.
I tried the naive approach of using ParseCallbacks::int_macro
, but to no avail.
Input C Header
typedef uint16_t node_kind;
#define NODE_KIND_LIST_SHIFT 6
enum node_kinds {
NODE_KIND_FOO = 1,
NODE_KIND_BAR,
// ...
NODE_KIND_FOO_LIST = 1 << NODE_KIND_LIST_SHIFT,
NODE_KIND_BAR_LIST,
};
Bindgen Invocation
use bindgen::{callbacks::{IntKind, ParseCallbacks}, Builder, EnumVariation};
struct MyCallbacks;
impl ParseCallbacks for MyCallBacks {
// This works for macros, but not for enum members
fn int_macro(&self, name: &str, value: i64) -> Option<IntKind> {
match name {
s if s.starts_with("NODE_KIND_") => {
assert!(value >= 0 && value <= u16::MAX as _, "{name} ({value}) overflows u16 bounds.");
Some(IntKind::U16)
}
_ => None,
}
}
}
Builder::default()
.header("input.h")
.default_enum_style(EnumVariation::ModuleConsts)
.parse_callbacks(Box::new(MyCallbacks))
.generate()
.unwrap()
Actual Results
pub type node_kind = u16;
pub const NODE_KIND_LIST_SHIFT: u16 = 6;
pub mod node_kinds {
pub type Type = ::std::os::raw::c_uint;
pub const NODE_KIND_FOO: Type = 1;
pub const NODE_KIND_BAR: Type = 2;
// ...
pub const NODE_KIND_FOO_LIST: Type = 64;
pub const NODE_KIND_BAR_LIST: Type = 65;
}
Expected Results
There should be a way to obtain the following result:
pub type node_kind = u16;
pub const NODE_KIND_LIST_SHIFT: u16 = 6;
pub mod node_kinds {
pub type Type = u16;
pub const NODE_KIND_FOO: Type = 1;
pub const NODE_KIND_BAR: Type = 2;
// ...
pub const NODE_KIND_FOO_LIST: Type = 64;
pub const NODE_KIND_BAR_LIST: Type = 65;
}
As a side note, this is another use case for #1916.