Skip to content

Cannot override integer type of constified enum module. #2711

Open
@ju1ius

Description

@ju1ius

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.

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions