Skip to content

Commit 90b7d0e

Browse files
Googlercopybara-github
authored andcommitted
Clean up some ApiSnippets
PiperOrigin-RevId: 778117503 Change-Id: I5f525ad468f833bef0785983817ca7b32952bf85
1 parent b1431ba commit 90b7d0e

File tree

4 files changed

+63
-106
lines changed

4 files changed

+63
-106
lines changed

rs_bindings_from_cc/generate_bindings/database/code_snippet.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,14 +1220,8 @@ pub struct CppDetails {
12201220
}
12211221

12221222
impl CppDetails {
1223-
pub fn new(includes: CppIncludes) -> Self {
1224-
CppDetails { includes, thunks: vec![] }
1225-
}
1226-
}
1227-
1228-
impl Extend<ThunkImpl> for CppDetails {
1229-
fn extend<T: IntoIterator<Item = ThunkImpl>>(&mut self, iter: T) {
1230-
self.thunks.extend(iter);
1223+
pub fn new(includes: CppIncludes, thunks: Vec<ThunkImpl>) -> Self {
1224+
CppDetails { includes, thunks }
12311225
}
12321226
}
12331227

rs_bindings_from_cc/generate_bindings/generate_struct_and_union.rs

Lines changed: 27 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ use itertools::Itertools;
2323
use proc_macro2::{Ident, TokenStream};
2424
use quote::quote;
2525
use std::collections::HashMap;
26-
use std::iter;
2726
use std::num::NonZeroUsize;
2827
use std::rc::Rc;
28+
use std::{iter, mem};
2929

3030
/// Returns whether fields of type `ty` need to be wrapped in `ManuallyDrop<T>`
3131
/// to prevent the fields from being destructed twice (once by the C++
@@ -478,15 +478,14 @@ pub fn generate_record(db: &dyn BindingsGenerator, record: Rc<Record>) -> Result
478478
})
479479
.collect(),
480480
};
481-
let mut features = FlagSet::empty();
482-
481+
let mut api_snippets = ApiSnippets::default();
483482
let recursively_pinned_attr = if record.is_unpin() {
484483
None
485484
} else {
486485
// negative_impls are necessary for universal initialization due to Rust's
487486
// coherence rules: PhantomPinned isn't enough to prove to Rust that a
488487
// blanket impl that requires Unpin doesn't apply. See http://<internal link>=h.f6jp8ifzgt3n
489-
features |= Feature::negative_impls;
488+
api_snippets.features |= Feature::negative_impls;
490489
Some(RecursivelyPinnedAttr { pinned_drop: record.should_implement_drop() })
491490
};
492491

@@ -517,21 +516,21 @@ pub fn generate_record(db: &dyn BindingsGenerator, record: Rc<Record>) -> Result
517516

518517
let fully_qualified_cc_name = cpp_tagless_type_name_for_record(&record, ir)?.to_string();
519518

520-
let mut record_generated_items = vec![];
519+
let mut record_generated_snippets = ApiSnippets::default();
521520
let mut record_child_generated_main_apis = vec![];
522521
for &child_item_id in &record.child_item_ids {
523522
let item = ir.find_untyped_decl(child_item_id);
524-
let mut api_snippets = db.generate_item(item.clone())?;
523+
let mut child_api_snippets = db.generate_item(item.clone())?;
525524
if item.place_in_nested_module_if_nested_in_record()
526525
&& db.has_bindings(item.clone()).is_ok()
527526
{
528527
// If it doesn't have bindings, we don't want to put it in the nested module.
529-
record_child_generated_main_apis.append(&mut api_snippets.main_api);
528+
record_child_generated_main_apis.append(&mut child_api_snippets.main_api);
530529
}
531-
record_generated_items.push(api_snippets);
530+
record_generated_snippets.append(child_api_snippets);
532531
}
533532

534-
let generated_inherited_functions: Vec<ApiSnippets> = filter_out_ambiguous_member_functions(
533+
filter_out_ambiguous_member_functions(
535534
db,
536535
record.clone(),
537536
collect_unqualified_member_functions_from_all_bases(db, &record),
@@ -544,8 +543,9 @@ pub fn generate_record(db: &dyn BindingsGenerator, record: Rc<Record>) -> Result
544543
db.generate_function(ir_func.clone(), Some(record.clone())).ok().flatten()?;
545544
Some((*generated_func.snippets).clone())
546545
})
547-
.collect();
548-
record_generated_items.extend(generated_inherited_functions);
546+
.for_each(|func_snippets| {
547+
record_generated_snippets.append(func_snippets);
548+
});
549549

550550
// Both the template definition and its instantiation should enable experimental
551551
// features.
@@ -554,7 +554,7 @@ pub fn generate_record(db: &dyn BindingsGenerator, record: Rc<Record>) -> Result
554554
crubit_features |= ir.target_crubit_features(defining_target);
555555
}
556556
if crubit_features.contains(crubit_feature::CrubitFeature::Experimental) {
557-
record_generated_items.push(cc_struct_upcast_impl(db, &record, ir)?);
557+
record_generated_snippets.append(cc_struct_upcast_impl(db, &record, ir)?);
558558
}
559559
let no_unique_address_accessors =
560560
if crubit_features.contains(crubit_feature::CrubitFeature::Experimental) {
@@ -572,18 +572,10 @@ pub fn generate_record(db: &dyn BindingsGenerator, record: Rc<Record>) -> Result
572572
None
573573
};
574574

575-
let mut items = vec![];
576-
let mut thunks_from_record_items = vec![];
577-
let mut thunk_impls_from_record_items = vec![cc_struct_layout_assertion(db, &record)?];
578-
let mut assertions_from_record_items = vec![];
579-
580-
for generated in record_generated_items {
581-
items.extend(generated.main_api);
582-
thunks_from_record_items.extend(generated.thunks);
583-
assertions_from_record_items.extend(generated.assertions);
584-
thunk_impls_from_record_items.extend(generated.cc_details);
585-
features |= generated.features;
586-
}
575+
api_snippets.cc_details.push(cc_struct_layout_assertion(db, &record)?);
576+
577+
let items = mem::take(&mut record_generated_snippets.main_api);
578+
api_snippets.append(record_generated_snippets);
587579

588580
let cxx_impl = if fully_qualified_cc_name.contains('<') {
589581
// cxx can't parse templated type names.
@@ -638,7 +630,7 @@ pub fn generate_record(db: &dyn BindingsGenerator, record: Rc<Record>) -> Result
638630
nested_items: record_child_generated_main_apis,
639631
};
640632

641-
features |= Feature::negative_impls;
633+
api_snippets.features |= Feature::negative_impls;
642634
let record_trait_assertions = {
643635
let mut assert_impls = FlagSet::empty();
644636
let mut assert_not_impls = FlagSet::empty();
@@ -665,27 +657,19 @@ pub fn generate_record(db: &dyn BindingsGenerator, record: Rc<Record>) -> Result
665657
}
666658
};
667659

668-
let mut assertions = vec![];
669-
assertions.push(rs_size_align_assertions(qualified_ident, &record.size_align));
670-
assertions.push(record_trait_assertions);
671-
assertions.push(field_offset_assertions);
672-
assertions.extend(fields_that_must_be_copy.into_iter().map(|formatted_field_type| {
673-
Assertion::Impls {
660+
api_snippets.assertions.push(rs_size_align_assertions(qualified_ident, &record.size_align));
661+
api_snippets.assertions.push(record_trait_assertions);
662+
api_snippets.assertions.push(field_offset_assertions);
663+
api_snippets.assertions.extend(fields_that_must_be_copy.into_iter().map(
664+
|formatted_field_type| Assertion::Impls {
674665
type_name: formatted_field_type,
675666
all_of: AssertableTrait::Copy.into(),
676667
none_of: FlagSet::empty(),
677-
}
678-
}));
679-
assertions.extend(assertions_from_record_items);
680-
681-
Ok(ApiSnippets {
682-
main_api: vec![MainApi::Record(record_tokens)],
683-
features,
684-
assertions,
685-
thunks: thunks_from_record_items,
686-
cc_details: thunk_impls_from_record_items,
687-
..Default::default()
688-
})
668+
},
669+
));
670+
671+
api_snippets.main_api.push(MainApi::Record(record_tokens));
672+
Ok(api_snippets)
689673
}
690674

691675
pub fn rs_size_align_assertions(type_name: TokenStream, size_align: &ir::SizeAlign) -> Assertion {

rs_bindings_from_cc/generate_bindings/lib.rs

Lines changed: 24 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ use quote::{quote, ToTokens};
2424
use rs_type_kind::rs_type_kind_with_lifetime_elision;
2525
use std::collections::BTreeSet;
2626
use std::ffi::OsStr;
27+
use std::mem;
2728
use std::path::Path;
2829
use std::rc::Rc;
2930
use token_stream_printer::{
@@ -128,22 +129,11 @@ fn generate_global_var(db: &dyn BindingsGenerator, var: Rc<GlobalVar>) -> Result
128129

129130
fn generate_namespace(db: &dyn BindingsGenerator, namespace: Rc<Namespace>) -> Result<ApiSnippets> {
130131
let ir = db.ir();
131-
let mut items = vec![];
132-
let mut thunks = vec![];
133-
let mut cc_details = vec![];
134-
let mut assertions = vec![];
135-
let mut features = FlagSet::empty();
132+
let mut api_snippets = ApiSnippets::default();
136133

137134
for item_id in namespace.child_item_ids.iter() {
138-
let item: &Item = ir.find_decl(*item_id).with_context(|| {
139-
format!("Failed to look up namespace.child_item_ids for {:?}", namespace)
140-
})?;
141-
let generated = db.generate_item(item.clone())?;
142-
items.extend(generated.main_api);
143-
thunks.extend(generated.thunks);
144-
cc_details.extend(generated.cc_details);
145-
assertions.extend(generated.assertions);
146-
features |= generated.features;
135+
let item = ir.find_untyped_decl(*item_id);
136+
api_snippets.append(db.generate_item(item.clone())?);
147137
}
148138

149139
let reopened_namespace_idx = ir.get_reopened_namespace_idx(namespace.id)?;
@@ -163,19 +153,14 @@ fn generate_namespace(db: &dyn BindingsGenerator, namespace: Rc<Namespace>) -> R
163153
});
164154
let insert_use_stmt_for_inline_namespace = namespace.is_inline && is_canonical_namespace_module;
165155

166-
Ok(ApiSnippets {
167-
main_api: vec![MainApi::Namespace {
168-
name,
169-
previous_namespace_to_use,
170-
items,
171-
insert_use_stmt_for_inline_namespace,
172-
}],
173-
features,
174-
thunks,
175-
cc_details,
176-
assertions,
177-
..Default::default()
178-
})
156+
let items = mem::take(&mut api_snippets.main_api);
157+
api_snippets.main_api.push(MainApi::Namespace {
158+
name,
159+
previous_namespace_to_use,
160+
items,
161+
insert_use_stmt_for_inline_namespace,
162+
});
163+
Ok(api_snippets)
179164
}
180165

181166
/// Implementation of `BindingsGenerator::generate_item`.
@@ -319,30 +304,24 @@ pub fn generate_bindings_tokens(
319304
environment: Environment,
320305
) -> Result<BindingsTokens> {
321306
let db = new_database(ir, errors, fatal_errors, environment);
322-
let mut items = vec![];
323-
let mut thunks = vec![];
324-
let mut cc_details =
325-
CppDetails::new(generate_rs_api_impl_includes(&db, crubit_support_path_format));
326-
let mut assertions = vec![];
327-
328-
let mut features = FlagSet::empty();
307+
let mut snippets = ApiSnippets::default();
329308

330309
// For #![rustfmt::skip].
331-
features |= Feature::custom_inner_attributes;
310+
snippets.features |= Feature::custom_inner_attributes;
332311
// For the `vector` in `cc_std`.
333-
features |= Feature::allocator_api;
334-
features |= Feature::cfg_sanitize;
312+
snippets.features |= Feature::allocator_api;
313+
snippets.features |= Feature::cfg_sanitize;
335314

336315
for top_level_item_id in ir.top_level_item_ids() {
337-
let item: &Item = ir.find_untyped_decl(*top_level_item_id);
338-
let generated = db.generate_item(item.clone())?;
339-
items.extend(generated.main_api);
340-
thunks.extend(generated.thunks);
341-
assertions.extend(generated.assertions);
342-
cc_details.extend(generated.cc_details);
343-
features |= generated.features;
316+
let item = ir.find_untyped_decl(*top_level_item_id);
317+
snippets.append(db.generate_item(item.clone())?);
344318
}
345319

320+
let ApiSnippets { main_api, thunks, assertions, cc_details, features } = snippets;
321+
322+
let cc_details =
323+
CppDetails::new(generate_rs_api_impl_includes(&db, crubit_support_path_format), cc_details);
324+
346325
let mod_detail = if thunks.is_empty() {
347326
quote! {}
348327
} else {
@@ -396,7 +375,7 @@ pub fn generate_bindings_tokens(
396375
#![deny(warnings)] __NEWLINE__ __NEWLINE__
397376

398377

399-
#( #items __NEWLINE__ __NEWLINE__ )*
378+
#( #main_api __NEWLINE__ __NEWLINE__ )*
400379

401380
#mod_detail __NEWLINE__ __NEWLINE__
402381

rs_bindings_from_cc/test/golden/nested_types_rs_api.rs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -273,19 +273,19 @@ mod detail {
273273
}
274274

275275
const _: () = {
276-
assert!(::core::mem::size_of::<crate::Foo>() == 4);
277-
assert!(::core::mem::align_of::<crate::Foo>() == 4);
278-
static_assertions::assert_impl_all!(crate::Foo: Copy,Clone);
279-
static_assertions::assert_not_impl_any!(crate::Foo: Drop);
280-
assert!(::core::mem::offset_of!(crate::Foo, foo) == 0);
281-
assert!(::core::mem::size_of::<crate::foo::Bar>() == 4);
282-
assert!(::core::mem::align_of::<crate::foo::Bar>() == 4);
283-
static_assertions::assert_impl_all!(crate::foo::Bar: Copy,Clone);
284-
static_assertions::assert_not_impl_any!(crate::foo::Bar: Drop);
285-
assert!(::core::mem::offset_of!(crate::foo::Bar, bar) == 0);
286276
assert!(::core::mem::size_of::<crate::foo::bar::Baz>() == 4);
287277
assert!(::core::mem::align_of::<crate::foo::bar::Baz>() == 4);
288278
static_assertions::assert_impl_all!(crate::foo::bar::Baz: Copy,Clone);
289279
static_assertions::assert_not_impl_any!(crate::foo::bar::Baz: Drop);
290280
assert!(::core::mem::offset_of!(crate::foo::bar::Baz, baz) == 0);
281+
assert!(::core::mem::size_of::<crate::foo::Bar>() == 4);
282+
assert!(::core::mem::align_of::<crate::foo::Bar>() == 4);
283+
static_assertions::assert_impl_all!(crate::foo::Bar: Copy,Clone);
284+
static_assertions::assert_not_impl_any!(crate::foo::Bar: Drop);
285+
assert!(::core::mem::offset_of!(crate::foo::Bar, bar) == 0);
286+
assert!(::core::mem::size_of::<crate::Foo>() == 4);
287+
assert!(::core::mem::align_of::<crate::Foo>() == 4);
288+
static_assertions::assert_impl_all!(crate::Foo: Copy,Clone);
289+
static_assertions::assert_not_impl_any!(crate::Foo: Drop);
290+
assert!(::core::mem::offset_of!(crate::Foo, foo) == 0);
291291
};

0 commit comments

Comments
 (0)