summaryrefslogtreecommitdiff
path: root/bindgen/codegen/postprocessing/mod.rs
diff options
context:
space:
mode:
authorChristian Poveda <christian.poveda@ferrous-systems.com>2022-10-06 14:52:29 -0500
committerChristian Poveda <christian.poveda@ferrous-systems.com>2022-10-06 14:52:29 -0500
commit4dd91ff6d72fb5df122e5957f31d1368e84d80a2 (patch)
tree1481911049423b9af30b28cf5acc48036d83c215 /bindgen/codegen/postprocessing/mod.rs
parent576fd8d424c8248726542b0951c594a9734cd02a (diff)
Make postprocessing more robust
This is done by merging extern blocks and sorting items in every module instead of just in the root module. The tests were changed to use `cxx` namespaces so they effectively check that items are manipulated correctly in every single module.
Diffstat (limited to 'bindgen/codegen/postprocessing/mod.rs')
-rw-r--r--bindgen/codegen/postprocessing/mod.rs28
1 files changed, 14 insertions, 14 deletions
diff --git a/bindgen/codegen/postprocessing/mod.rs b/bindgen/codegen/postprocessing/mod.rs
index c6612f2b..1d5a4983 100644
--- a/bindgen/codegen/postprocessing/mod.rs
+++ b/bindgen/codegen/postprocessing/mod.rs
@@ -1,6 +1,6 @@
use proc_macro2::TokenStream;
use quote::ToTokens;
-use syn::Item;
+use syn::{parse2, ItemMod};
use crate::BindgenOptions;
@@ -12,7 +12,7 @@ use sort_semantically::sort_semantically;
struct PostProcessingPass {
should_run: fn(&BindgenOptions) -> bool,
- run: fn(&mut Vec<Item>),
+ run: fn(&mut ItemMod),
}
// TODO: This can be a const fn when mutable references are allowed in const
@@ -21,7 +21,7 @@ macro_rules! pass {
($pass:ident) => {
PostProcessingPass {
should_run: |options| options.$pass,
- run: |items| $pass(items),
+ run: |item_mod| $pass(item_mod),
}
};
}
@@ -38,29 +38,29 @@ pub(crate) fn postprocessing(
return items.into_iter().collect();
}
let module_wrapped_tokens =
- quote!(mod wrapper_for_sorting_hack { #( #items )* });
+ quote!(mod wrapper_for_postprocessing_hack { #( #items )* });
// This syn business is a hack, for now. This means that we are re-parsing already
// generated code using `syn` (as opposed to `quote`) because `syn` provides us more
// control over the elements.
// One caveat is that some of the items coming from `quote`d output might have
// multiple items within them. Hence, we have to wrap the incoming in a `mod`.
- // The two `unwrap`s here are deliberate because
- // The first one won't panic because we build the `mod` and know it is there
- // The second one won't panic because we know original output has something in
- // it already.
- let (_, mut items) = syn::parse2::<syn::ItemMod>(module_wrapped_tokens)
- .unwrap()
- .content
- .unwrap();
+ // The `unwrap` here is deliberate because bindgen should generate valid rust items at all
+ // times.
+ let mut item_mod = parse2::<ItemMod>(module_wrapped_tokens).unwrap();
for pass in PASSES {
if (pass.should_run)(options) {
- (pass.run)(&mut items);
+ (pass.run)(&mut item_mod);
}
}
- let synful_items = items.into_iter().map(|item| item.into_token_stream());
+ let synful_items = item_mod
+ .content
+ .map(|(_, items)| items)
+ .unwrap_or_default()
+ .into_iter()
+ .map(|item| item.into_token_stream());
quote! { #( #synful_items )* }
}