1 //! Implementation of GraphWalk for DropRanges so we can visualize the control
2 //! flow graph when needed for debugging.
4 use rustc_graphviz
as dot
;
6 use super::{DropRangesBuilder, PostOrderId}
;
8 /// Writes the CFG for DropRangesBuilder to a .dot file for visualization.
10 /// It is not normally called, but is kept around to easily add debugging
13 pub(super) fn write_graph_to_file(drop_ranges
: &DropRangesBuilder
, filename
: &str) {
14 dot
::render(drop_ranges
, &mut std
::fs
::File
::create(filename
).unwrap()).unwrap();
17 impl<'a
> dot
::GraphWalk
<'a
> for DropRangesBuilder
{
18 type Node
= PostOrderId
;
20 type Edge
= (PostOrderId
, PostOrderId
);
22 fn nodes(&'a
self) -> dot
::Nodes
<'a
, Self::Node
> {
23 self.nodes
.iter_enumerated().map(|(i
, _
)| i
).collect()
26 fn edges(&'a
self) -> dot
::Edges
<'a
, Self::Edge
> {
29 .flat_map(|(i
, node
)| {
30 if node
.successors
.len() == 0 {
33 node
.successors
.iter().map(move |&s
| (i
, s
)).collect()
39 fn source(&'a
self, edge
: &Self::Edge
) -> Self::Node
{
43 fn target(&'a
self, edge
: &Self::Edge
) -> Self::Node
{
48 impl<'a
> dot
::Labeller
<'a
> for DropRangesBuilder
{
49 type Node
= PostOrderId
;
51 type Edge
= (PostOrderId
, PostOrderId
);
53 fn graph_id(&'a
self) -> dot
::Id
<'a
> {
54 dot
::Id
::new("drop_ranges").unwrap()
57 fn node_id(&'a
self, n
: &Self::Node
) -> dot
::Id
<'a
> {
58 dot
::Id
::new(format
!("id{}", n
.index())).unwrap()
61 fn node_label(&'a
self, n
: &Self::Node
) -> dot
::LabelText
<'a
> {
62 dot
::LabelText
::LabelStr(
68 .find(|(_hir_id
, &post_order_id
)| post_order_id
== *n
)
69 .map_or("<unknown>".into(), |(hir_id
, _
)| format
!(
71 hir_id
.local_id
.index()