Skip to content

Commit 5880594

Browse files
adetayloremilio
authored andcommitted
Report enums in ParseCallbacks.
ParseCallbacks previously reported structs but not enums. Enhance it to do so. At the moment, little information is provided about enums - but bindgen doesn't handle (rare) anonymous enums so this seems the right amount of information to report. At the moment, effectively this just provides a mapping between name and DiscoveredItemId. One of a number of PRs I'll be raising for google/autocxx#124. In future PRs I'll be hoping to add further callbacks which report more information based on DiscoveredItemId, so having the DiscoveredItemId for each enum is an important pre-requisite.
1 parent a10bcfd commit 5880594

File tree

4 files changed

+71
-3
lines changed

4 files changed

+71
-3
lines changed

bindgen-tests/tests/parse_callbacks/item_discovery_callback/header_item_discovery.h

+14-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Unions
1+
// Structs
22
void function_using_anonymous_struct(struct {} arg0);
33

44
struct NamedStruct {
@@ -13,4 +13,16 @@ void function_using_anonymous_union(union {} arg0);
1313
union NamedUnion {
1414
};
1515

16-
typedef union NamedUnion AliasOfNamedUnion;
16+
typedef union NamedUnion AliasOfNamedUnion;
17+
18+
// Enums
19+
20+
// We don't include an anonymous enum because such enums
21+
// are not visible outside the function, and thus tend not
22+
// to be useful - bindgen doesn't handle them for this reason.
23+
24+
enum NamedEnum {
25+
Fish,
26+
};
27+
28+
typedef enum NamedEnum AliasOfNamedEnum;

bindgen-tests/tests/parse_callbacks/item_discovery_callback/mod.rs

+40
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,19 @@ pub fn test_item_discovery_callback() {
6060
alias_for: DiscoveredItemId::new(20),
6161
},
6262
),
63+
(
64+
DiscoveredItemId::new(27),
65+
DiscoveredItem::Alias {
66+
alias_name: "AliasOfNamedEnum".to_string(),
67+
alias_for: DiscoveredItemId::new(24),
68+
},
69+
),
70+
(
71+
DiscoveredItemId::new(24),
72+
DiscoveredItem::Enum {
73+
final_name: "NamedEnum".to_string(),
74+
},
75+
),
6376
(
6477
DiscoveredItemId::new(30),
6578
DiscoveredItem::Struct {
@@ -126,6 +139,9 @@ fn compare_item_info(
126139
expected,
127140
generated,
128141
),
142+
DiscoveredItem::Enum { .. } => {
143+
compare_enum_info(expected_item, generated_item)
144+
}
129145
}
130146
}
131147

@@ -203,6 +219,30 @@ pub fn compare_union_info(
203219
}
204220
}
205221

222+
pub fn compare_enum_info(
223+
expected_item: &DiscoveredItem,
224+
generated_item: &DiscoveredItem,
225+
) -> bool {
226+
let DiscoveredItem::Enum {
227+
final_name: expected_final_name,
228+
} = expected_item
229+
else {
230+
unreachable!()
231+
};
232+
233+
let DiscoveredItem::Enum {
234+
final_name: generated_final_name,
235+
} = generated_item
236+
else {
237+
unreachable!()
238+
};
239+
240+
if !compare_names(expected_final_name, generated_final_name) {
241+
return false;
242+
}
243+
true
244+
}
245+
206246
pub fn compare_alias_info(
207247
expected_item: &DiscoveredItem,
208248
generated_item: &DiscoveredItem,

bindgen/callbacks.rs

+8-1
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,14 @@ pub enum DiscoveredItem {
217217

218218
/// The identifier of the discovered type
219219
alias_for: DiscoveredItemId,
220-
}, // functions, modules, etc.
220+
},
221+
222+
/// Represents an enum.
223+
Enum {
224+
/// The final name of the generated binding
225+
final_name: String,
226+
},
227+
// functions, modules, etc.
221228
}
222229

223230
/// Relevant information about a type to which new derive attributes will be added using

bindgen/codegen/mod.rs

+9
Original file line numberDiff line numberDiff line change
@@ -3770,6 +3770,15 @@ impl CodeGenerator for Enum {
37703770
let repr = repr.to_rust_ty_or_opaque(ctx, item);
37713771
let has_typedef = ctx.is_enum_typedef_combo(item.id());
37723772

3773+
ctx.options().for_each_callback(|cb| {
3774+
cb.new_item_found(
3775+
DiscoveredItemId::new(item.id().as_usize()),
3776+
DiscoveredItem::Enum {
3777+
final_name: name.to_string(),
3778+
},
3779+
);
3780+
});
3781+
37733782
let mut builder =
37743783
EnumBuilder::new(&name, attrs, &repr, variation, has_typedef);
37753784

0 commit comments

Comments
 (0)