Factor out the `owning_target` check.
By not interleaving it with code generation, it's much easier to see the logic, and there's less code to boot.
PiperOrigin-RevId: 509517438
diff --git a/rs_bindings_from_cc/ir.rs b/rs_bindings_from_cc/ir.rs
index 21c41e5..9941436 100644
--- a/rs_bindings_from_cc/ir.rs
+++ b/rs_bindings_from_cc/ir.rs
@@ -608,9 +608,24 @@
Item::Func(func) => func.enclosing_namespace_id,
Item::Namespace(namespace) => namespace.enclosing_namespace_id,
Item::TypeAlias(type_alias) => type_alias.enclosing_namespace_id,
- Item::Comment(_) => None,
- Item::UnsupportedItem(_) => None,
- Item::UseMod(_) => None,
+ Item::Comment(..) => None,
+ Item::UnsupportedItem(..) => None,
+ Item::UseMod(..) => None,
+ }
+ }
+
+ /// Returns the target that this should generate source code in.
+ pub fn owning_target(&self) -> Option<&BazelLabel> {
+ match self {
+ Item::Func(..) => None,
+ Item::IncompleteRecord(record) => Some(&record.owning_target),
+ Item::Record(record) => Some(&record.owning_target),
+ Item::Enum(e) => Some(&e.owning_target),
+ Item::TypeAlias(type_alias) => Some(&type_alias.owning_target),
+ Item::UnsupportedItem(..) => None,
+ Item::Comment(..) => None,
+ Item::Namespace(..) => None,
+ Item::UseMod(..) => None,
}
}
}
diff --git a/rs_bindings_from_cc/src_code_gen.rs b/rs_bindings_from_cc/src_code_gen.rs
index 483c4bb..f27a0f2 100644
--- a/rs_bindings_from_cc/src_code_gen.rs
+++ b/rs_bindings_from_cc/src_code_gen.rs
@@ -2680,6 +2680,11 @@
errors: &mut dyn ErrorReporting,
) -> Result<GeneratedItem> {
let ir = db.ir();
+ if let Some(owning_target) = item.owning_target() {
+ if !ir.is_current_target(owning_target) && !ir.is_stdlib_target(owning_target) {
+ return Ok(GeneratedItem::default());
+ }
+ }
let overloaded_funcs = db.overloaded_funcs();
let generated_item = match item {
Item::Func(func) => match db.generate_func(func.clone()) {
@@ -2703,39 +2708,11 @@
}
}
},
- Item::IncompleteRecord(incomplete_record) => {
- if !ir.is_current_target(&incomplete_record.owning_target)
- && !ir.is_stdlib_target(&incomplete_record.owning_target)
- {
- GeneratedItem::default()
- } else {
- generate_incomplete_record(incomplete_record)?
- }
- }
- Item::Record(record) => {
- if !ir.is_current_target(&record.owning_target)
- && !ir.is_stdlib_target(&record.owning_target)
- {
- GeneratedItem::default()
- } else {
- generate_record(db, record, errors)?
- }
- }
- Item::Enum(enum_) => {
- if !ir.is_current_target(&enum_.owning_target)
- && !ir.is_stdlib_target(&enum_.owning_target)
- {
- GeneratedItem::default()
- } else {
- generate_enum(db, enum_)?
- }
- }
+ Item::IncompleteRecord(incomplete_record) => generate_incomplete_record(incomplete_record)?,
+ Item::Record(record) => generate_record(db, record, errors)?,
+ Item::Enum(enum_) => generate_enum(db, enum_)?,
Item::TypeAlias(type_alias) => {
- if !ir.is_current_target(&type_alias.owning_target)
- && !ir.is_stdlib_target(&type_alias.owning_target)
- {
- GeneratedItem::default()
- } else if type_alias.enclosing_record_id.is_some() {
+ if type_alias.enclosing_record_id.is_some() {
// TODO(b/200067824): support nested type aliases.
generate_unsupported(&make_unsupported_nested_type_alias(type_alias)?, errors)?
} else {