1 //! Module that constructs a control-flow graph representing an item.
2 //! Uses `Graph` as the underlying representation.
4 use rustc_data_structures::graph::implementation as graph;
7 use crate::hir::def_id::DefId;
13 pub owner_def_id: DefId,
19 #[derive(Copy, Clone, Debug, PartialEq)]
20 pub enum CFGNodeData {
21 AST(hir::ItemLocalId),
29 pub fn id(&self) -> hir::ItemLocalId {
30 if let CFGNodeData::AST(id) = *self {
33 hir::DUMMY_ITEM_LOCAL_ID
39 pub struct CFGEdgeData {
40 pub exiting_scopes: Vec<hir::ItemLocalId>
43 pub type CFGIndex = graph::NodeIndex;
45 pub type CFGGraph = graph::Graph<CFGNodeData, CFGEdgeData>;
47 pub type CFGNode = graph::Node<CFGNodeData>;
49 pub type CFGEdge = graph::Edge<CFGEdgeData>;
52 pub fn new<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>,
53 body: &hir::Body) -> CFG {
54 construct::construct(tcx, body)
57 pub fn node_is_reachable(&self, id: hir::ItemLocalId) -> bool {
58 self.graph.depth_traverse(self.entry, graph::OUTGOING)
59 .any(|idx| self.graph.node_data(idx).id() == id)