Struct rustc_data_structures::obligation_forest::ObligationForest [−][src]
pub struct ObligationForest<O: ForestObligation> {
nodes: Vec<Node<O>>,
done_cache: FxHashSet<O::CacheKey>,
active_cache: FxHashMap<O::CacheKey, usize>,
reused_node_vec: Vec<usize>,
obligation_tree_id_generator: Map<RangeFrom<usize>, fn(_: usize) -> ObligationTreeId>,
error_cache: FxHashMap<ObligationTreeId, FxHashSet<O::CacheKey>>,
}
Fields
nodes: Vec<Node<O>>
The list of obligations. In between calls to process_obligations
,
this list only contains nodes in the Pending
or Waiting
state.
usize
indices are used here and throughout this module, rather than
rustc_index::newtype_index!
indices, because this code is hot enough
that the u32
-to-usize
conversions that would be required are
significant, and space considerations are not important.
done_cache: FxHashSet<O::CacheKey>
A cache of predicates that have been successfully completed.
active_cache: FxHashMap<O::CacheKey, usize>
A cache of the nodes in nodes
, indexed by predicate. Unfortunately,
its contents are not guaranteed to match those of nodes
. See the
comments in process_obligation
for details.
reused_node_vec: Vec<usize>
A vector reused in compress() and find_cycles_from_node(), to avoid allocating new vectors.
obligation_tree_id_generator: Map<RangeFrom<usize>, fn(_: usize) -> ObligationTreeId>
error_cache: FxHashMap<ObligationTreeId, FxHashSet<O::CacheKey>>
Per tree error cache. This is used to deduplicate errors, which is necessary to avoid trait resolution overflow in some cases.
See this for details.
Implementations
Creates a graphviz representation of the obligation forest. Given a directory this will
create files with name of the format <counter>_<description>.gv
. The counter is
global and is maintained internally.
Calling this will do nothing unless the environment variable
DUMP_OBLIGATION_FOREST_GRAPHVIZ
is defined.
A few post-processing that you might want to do make the forest easier to visualize:
sed 's,std::[a-z]*::,,g'
— Deletes thestd::<package>::
prefix of paths.sed 's,"Binder(TraitPredicate(<\(.*\)>)) (\([^)]*\))","\1 (\2)",'
— TransformsBinder(TraitPredicate(<predicate>))
into just<predicate>
.
Returns the total number of nodes in the forest that have not yet been fully resolved.
Registers an obligation.
Converts all remaining obligations to the given error.
Returns the set of obligations that are in a pending state.
pub fn process_obligations<P, OUT>(&mut self, processor: &mut P) -> OUT where
P: ObligationProcessor<Obligation = O>,
OUT: OutcomeTrait<Obligation = O, Error = Error<O, P::Error>>,
pub fn process_obligations<P, OUT>(&mut self, processor: &mut P) -> OUT where
P: ObligationProcessor<Obligation = O>,
OUT: OutcomeTrait<Obligation = O, Error = Error<O, P::Error>>,
Performs a pass through the obligation list. This must
be called in a loop until outcome.stalled
is false.
This cannot be unrolled (presently, at least).
Returns a vector of obligations for p
and all of its
ancestors, putting them into the error state in the process.
Mark all Waiting
nodes as Success
, except those that depend on a
pending node.
fn process_cycles<P>(&mut self, processor: &mut P) where
P: ObligationProcessor<Obligation = O>,
fn process_cycles<P>(&mut self, processor: &mut P) where
P: ObligationProcessor<Obligation = O>,
Report cycles between all Success
nodes, and convert all Success
nodes to Done
. This must be called after mark_successes
.
fn find_cycles_from_node<P>(
&self,
stack: &mut Vec<usize>,
processor: &mut P,
index: usize
) where
P: ObligationProcessor<Obligation = O>,
Compresses the vector, removing all popped nodes. This adjusts the
indices and hence invalidates any outstanding indices. process_cycles
must be run beforehand to remove any cycles on Success
nodes.
Trait Implementations
Maps n
to a unique identifier with respect to self
. The
implementor is responsible for ensuring that the returned name
is a valid DOT identifier. Read more
Maps n
to a label that will be used in the rendered output.
The label need not be unique, and may be the empty string; the
default is just the output from node_id
. Read more
Maps e
to a label that will be used in the rendered output.
The label need not be unique, and may be the empty string; the
default is in fact the empty string. Read more
Maps n
to one of the graphviz shape
names. If None
is returned, no shape
attribute is specified. Read more
Maps n
to a style that will be used in the rendered output.
Maps e
to a style that will be used in the rendered output.
Auto Trait Implementations
impl<O> !RefUnwindSafe for ObligationForest<O>
impl<O> Send for ObligationForest<O> where
O: Send,
<O as ForestObligation>::CacheKey: Send,
impl<O> !Sync for ObligationForest<O>
impl<O> Unpin for ObligationForest<O> where
O: Unpin,
<O as ForestObligation>::CacheKey: Unpin,
impl<O> UnwindSafe for ObligationForest<O> where
O: UnwindSafe,
<O as ForestObligation>::CacheKey: UnwindSafe,
Blanket Implementations
Layout
Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...)
attributes. Please see the Rust Reference’s “Type Layout” chapter for details on type layout guarantees.
Size: 160 bytes