summaryrefslogtreecommitdiff
path: root/src/ir/traversal.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ir/traversal.rs')
-rw-r--r--src/ir/traversal.rs130
1 files changed, 75 insertions, 55 deletions
diff --git a/src/ir/traversal.rs b/src/ir/traversal.rs
index 762a3e2d..e4ce946d 100644
--- a/src/ir/traversal.rs
+++ b/src/ir/traversal.rs
@@ -214,7 +214,9 @@ pub fn no_edges(_: &BindgenContext, _: Edge) -> bool {
pub fn codegen_edges(ctx: &BindgenContext, edge: Edge) -> bool {
let cc = &ctx.options().codegen_config;
match edge.kind {
- EdgeKind::Generic => ctx.resolve_item(edge.to).is_enabled_for_codegen(ctx),
+ EdgeKind::Generic => {
+ ctx.resolve_item(edge.to).is_enabled_for_codegen(ctx)
+ }
// We statically know the kind of item that non-generic edges can point
// to, so we don't need to actually resolve the item and check
@@ -265,12 +267,16 @@ impl<'ctx, 'gen> TraversalStorage<'ctx, 'gen> for ItemSet {
/// each item. This is useful for providing debug assertions with meaningful
/// diagnostic messages about dangling items.
#[derive(Debug)]
-pub struct Paths<'ctx, 'gen>(BTreeMap<ItemId, ItemId>,
- &'ctx BindgenContext<'gen>)
- where 'gen: 'ctx;
+pub struct Paths<'ctx, 'gen>(
+ BTreeMap<ItemId, ItemId>,
+ &'ctx BindgenContext<'gen>
+)
+where
+ 'gen: 'ctx;
impl<'ctx, 'gen> TraversalStorage<'ctx, 'gen> for Paths<'ctx, 'gen>
- where 'gen: 'ctx,
+where
+ 'gen: 'ctx,
{
fn new(ctx: &'ctx BindgenContext<'gen>) -> Self {
Paths(BTreeMap::new(), ctx)
@@ -284,10 +290,10 @@ impl<'ctx, 'gen> TraversalStorage<'ctx, 'gen> for Paths<'ctx, 'gen>
let mut path = vec![];
let mut current = item;
loop {
- let predecessor = *self.0
- .get(&current)
- .expect("We know we found this item id, so it must have a \
- predecessor");
+ let predecessor = *self.0.get(&current).expect(
+ "We know we found this item id, so it must have a \
+ predecessor",
+ );
if predecessor == current {
break;
}
@@ -295,9 +301,11 @@ impl<'ctx, 'gen> TraversalStorage<'ctx, 'gen> for Paths<'ctx, 'gen>
current = predecessor;
}
path.reverse();
- panic!("Found reference to dangling id = {:?}\nvia path = {:?}",
- item,
- path);
+ panic!(
+ "Found reference to dangling id = {:?}\nvia path = {:?}",
+ item,
+ path
+ );
}
newly_discovered
@@ -349,7 +357,8 @@ pub trait Tracer {
}
impl<F> Tracer for F
- where F: FnMut(ItemId, EdgeKind),
+where
+ F: FnMut(ItemId, EdgeKind),
{
fn visit_kind(&mut self, item: ItemId, kind: EdgeKind) {
(*self)(item, kind)
@@ -367,21 +376,24 @@ pub trait Trace {
type Extra;
/// Trace all of this item's outgoing edges to other items.
- fn trace<T>(&self,
- context: &BindgenContext,
- tracer: &mut T,
- extra: &Self::Extra)
- where T: Tracer;
+ fn trace<T>(
+ &self,
+ context: &BindgenContext,
+ tracer: &mut T,
+ extra: &Self::Extra,
+ ) where
+ T: Tracer;
}
/// An graph traversal of the transitive closure of references between items.
///
/// See `BindgenContext::whitelisted_items` for more information.
pub struct ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate>
- where 'gen: 'ctx,
- Storage: TraversalStorage<'ctx, 'gen>,
- Queue: TraversalQueue,
- Predicate: TraversalPredicate,
+where
+ 'gen: 'ctx,
+ Storage: TraversalStorage<'ctx, 'gen>,
+ Queue: TraversalQueue,
+ Predicate: TraversalPredicate,
{
ctx: &'ctx BindgenContext<'gen>,
@@ -398,22 +410,22 @@ pub struct ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate>
currently_traversing: Option<ItemId>,
}
-impl<'ctx, 'gen, Storage, Queue, Predicate> ItemTraversal<'ctx,
- 'gen,
- Storage,
- Queue,
- Predicate>
- where 'gen: 'ctx,
- Storage: TraversalStorage<'ctx, 'gen>,
- Queue: TraversalQueue,
- Predicate: TraversalPredicate,
+impl<'ctx, 'gen, Storage, Queue, Predicate>
+ ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate>
+where
+ 'gen: 'ctx,
+ Storage: TraversalStorage<'ctx, 'gen>,
+ Queue: TraversalQueue,
+ Predicate: TraversalPredicate,
{
/// Begin a new traversal, starting from the given roots.
- pub fn new<R>(ctx: &'ctx BindgenContext<'gen>,
- roots: R,
- predicate: Predicate)
- -> ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate>
- where R: IntoIterator<Item = ItemId>,
+ pub fn new<R>(
+ ctx: &'ctx BindgenContext<'gen>,
+ roots: R,
+ predicate: Predicate,
+ ) -> ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate>
+ where
+ R: IntoIterator<Item = ItemId>,
{
let mut seen = Storage::new(ctx);
let mut queue = Queue::default();
@@ -435,10 +447,11 @@ impl<'ctx, 'gen, Storage, Queue, Predicate> ItemTraversal<'ctx,
impl<'ctx, 'gen, Storage, Queue, Predicate> Tracer
for ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate>
- where 'gen: 'ctx,
- Storage: TraversalStorage<'ctx, 'gen>,
- Queue: TraversalQueue,
- Predicate: TraversalPredicate,
+where
+ 'gen: 'ctx,
+ Storage: TraversalStorage<'ctx, 'gen>,
+ Queue: TraversalQueue,
+ Predicate: TraversalPredicate,
{
fn visit_kind(&mut self, item: ItemId, kind: EdgeKind) {
let edge = Edge::new(item, kind);
@@ -446,8 +459,8 @@ impl<'ctx, 'gen, Storage, Queue, Predicate> Tracer
return;
}
- let is_newly_discovered = self.seen
- .add(self.currently_traversing, item);
+ let is_newly_discovered =
+ self.seen.add(self.currently_traversing, item);
if is_newly_discovered {
self.queue.push(item)
}
@@ -456,10 +469,11 @@ impl<'ctx, 'gen, Storage, Queue, Predicate> Tracer
impl<'ctx, 'gen, Storage, Queue, Predicate> Iterator
for ItemTraversal<'ctx, 'gen, Storage, Queue, Predicate>
- where 'gen: 'ctx,
- Storage: TraversalStorage<'ctx, 'gen>,
- Queue: TraversalQueue,
- Predicate: TraversalPredicate,
+where
+ 'gen: 'ctx,
+ Storage: TraversalStorage<'ctx, 'gen>,
+ Queue: TraversalQueue,
+ Predicate: TraversalPredicate,
{
type Item = ItemId;
@@ -470,10 +484,14 @@ impl<'ctx, 'gen, Storage, Queue, Predicate> Iterator
};
let newly_discovered = self.seen.add(None, id);
- debug_assert!(!newly_discovered,
- "should have already seen anything we get out of our queue");
- debug_assert!(self.ctx.resolve_item_fallible(id).is_some(),
- "should only get IDs of actual items in our context during traversal");
+ debug_assert!(
+ !newly_discovered,
+ "should have already seen anything we get out of our queue"
+ );
+ debug_assert!(
+ self.ctx.resolve_item_fallible(id).is_some(),
+ "should only get IDs of actual items in our context during traversal"
+ );
self.currently_traversing = Some(id);
id.trace(self.ctx, self, &());
@@ -488,11 +506,13 @@ impl<'ctx, 'gen, Storage, Queue, Predicate> Iterator
/// See `BindgenContext::assert_no_dangling_item_traversal` for more
/// information.
pub type AssertNoDanglingItemsTraversal<'ctx, 'gen> =
- ItemTraversal<'ctx,
- 'gen,
- Paths<'ctx, 'gen>,
- VecDeque<ItemId>,
- for<'a> fn(&'a BindgenContext, Edge) -> bool>;
+ ItemTraversal<
+ 'ctx,
+ 'gen,
+ Paths<'ctx, 'gen>,
+ VecDeque<ItemId>,
+ for<'a> fn(&'a BindgenContext, Edge) -> bool,
+ >;
#[cfg(test)]
mod tests {