Skip to content

Commit d2c1dbd

Browse files
committed
report constants and variables in ParseCallbacks::new_item_found
1 parent bd011d4 commit d2c1dbd

File tree

4 files changed

+108
-0
lines changed

4 files changed

+108
-0
lines changed

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,11 @@ typedef enum NamedEnum AliasOfNamedEnum;
3030
// Functions
3131

3232
void named_function();
33+
34+
// Constants
35+
36+
const int MOD = 998244353;
37+
38+
// Variable
39+
40+
const char* name;

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

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -180,6 +180,28 @@ fn test_item_discovery_callback_c() {
180180
553,
181181
),
182182
),
183+
(
184+
DiscoveredItemId::new(30),
185+
ItemExpectations::new(
186+
DiscoveredItem::Constant {
187+
final_name: "MOD".to_string(),
188+
},
189+
36,
190+
11,
191+
596,
192+
),
193+
),
194+
(
195+
DiscoveredItemId::new(34),
196+
ItemExpectations::new(
197+
DiscoveredItem::Variable {
198+
final_name: "name".to_string(),
199+
},
200+
40,
201+
13,
202+
639,
203+
),
204+
),
183205
]);
184206
test_item_discovery_callback(
185207
"/tests/parse_callbacks/item_discovery_callback/header_item_discovery.h", &expected);
@@ -280,6 +302,12 @@ fn compare_item_info(
280302
DiscoveredItem::Method { .. } => {
281303
compare_method_info(&expected_item.item, &generated_item.0)
282304
}
305+
DiscoveredItem::Constant { .. } => {
306+
compare_constant_info(&expected_item.item, &generated_item.0)
307+
}
308+
DiscoveredItem::Variable { .. } => {
309+
compare_variable_info(&expected_item.item, &generated_item.0)
310+
}
283311
};
284312

285313
if is_a_match {
@@ -508,3 +536,51 @@ pub fn compare_method_info(
508536
}
509537
true
510538
}
539+
540+
pub fn compare_constant_info(
541+
expected_item: &DiscoveredItem,
542+
generated_item: &DiscoveredItem,
543+
) -> bool {
544+
let DiscoveredItem::Constant {
545+
final_name: expected_final_name,
546+
} = expected_item
547+
else {
548+
unreachable!()
549+
};
550+
551+
let DiscoveredItem::Constant {
552+
final_name: generated_final_name,
553+
} = generated_item
554+
else {
555+
unreachable!()
556+
};
557+
558+
if !compare_names(expected_final_name, generated_final_name) {
559+
return false;
560+
}
561+
true
562+
}
563+
564+
pub fn compare_variable_info(
565+
expected_item: &DiscoveredItem,
566+
generated_item: &DiscoveredItem,
567+
) -> bool {
568+
let DiscoveredItem::Variable {
569+
final_name: expected_final_name,
570+
} = expected_item
571+
else {
572+
unreachable!()
573+
};
574+
575+
let DiscoveredItem::Variable {
576+
final_name: generated_final_name,
577+
} = generated_item
578+
else {
579+
unreachable!()
580+
};
581+
582+
if !compare_names(expected_final_name, generated_final_name) {
583+
return false;
584+
}
585+
true
586+
}

bindgen/callbacks.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,18 @@ pub enum DiscoveredItem {
250250
/// Type to which this method belongs.
251251
parent: DiscoveredItemId,
252252
}, // modules, etc.
253+
254+
/// A constant.
255+
Constant {
256+
/// The final name of the generated binding
257+
final_name: String,
258+
},
259+
260+
/// A variable.
261+
Variable {
262+
/// The final name of the generated binding
263+
final_name: String,
264+
},
253265
}
254266

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

bindgen/codegen/mod.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -683,6 +683,12 @@ impl CodeGenerator for Var {
683683
let ty = var_ty.to_rust_ty_or_opaque(ctx, &());
684684

685685
if let Some(val) = self.val() {
686+
utils::call_discovered_item_callback(ctx, item, || {
687+
DiscoveredItem::Constant {
688+
final_name: canonical_name.clone(),
689+
}
690+
});
691+
686692
match *val {
687693
VarType::Bool(val) => {
688694
result.push(quote! {
@@ -778,6 +784,12 @@ impl CodeGenerator for Var {
778784
}
779785
}
780786
} else {
787+
utils::call_discovered_item_callback(ctx, item, || {
788+
DiscoveredItem::Variable {
789+
final_name: canonical_name.clone(),
790+
}
791+
});
792+
781793
let symbol: &str = self.link_name().unwrap_or_else(|| {
782794
let link_name =
783795
self.mangled_name().unwrap_or_else(|| self.name());

0 commit comments

Comments
 (0)