Skip to main content

miden_assembly/linker/
debug.rs

1use core::fmt;
2
3use super::*;
4
5impl fmt::Debug for Linker {
6    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
7        f.debug_struct("Linker")
8            .field("nodes", &DisplayModuleGraphNodes(&self.modules))
9            .field("graph", &DisplayModuleGraph(self))
10            .finish()
11    }
12}
13
14#[doc(hidden)]
15struct DisplayModuleGraph<'a>(&'a Linker);
16
17impl fmt::Debug for DisplayModuleGraph<'_> {
18    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
19        f.debug_set()
20            .entries(self.0.modules.iter().enumerate().flat_map(|(module_index, m)| {
21                let module_index = ModuleIndex::new(module_index);
22                (0..m.num_symbols())
23                    .map(|i| {
24                        let gid = module_index + ItemIndex::new(i);
25                        let out_edges = self.0.callgraph.out_edges(gid);
26                        Some(DisplayModuleGraphNodeWithEdges { gid, out_edges })
27                    })
28                    .collect::<Vec<_>>()
29            }))
30            .finish()
31    }
32}
33
34#[doc(hidden)]
35struct DisplayModuleGraphNodes<'a>(&'a [LinkModule]);
36
37impl fmt::Debug for DisplayModuleGraphNodes<'_> {
38    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
39        f.debug_list()
40            .entries(self.0.iter().enumerate().flat_map(|(module_index, m)| {
41                let module_index = ModuleIndex::new(module_index);
42
43                m.symbols()
44                    .enumerate()
45                    .map(|(i, symbol)| DisplayModuleGraphNode {
46                        id: module_index + ItemIndex::new(i),
47                        path: m.path(),
48                        name: symbol.name(),
49                        source: m.source(),
50                    })
51                    .collect::<Vec<_>>()
52            }))
53            .finish()
54    }
55}
56
57#[doc(hidden)]
58struct DisplayModuleGraphNode<'a> {
59    id: GlobalItemIndex,
60    path: &'a Path,
61    name: &'a ast::Ident,
62    source: ModuleSource,
63}
64
65impl fmt::Debug for DisplayModuleGraphNode<'_> {
66    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
67        f.debug_struct("Node")
68            .field("id", &format_args!("{}", &self.id))
69            .field("module", &self.path)
70            .field("name", &self.name)
71            .field("source", &self.source)
72            .finish()
73    }
74}
75
76#[doc(hidden)]
77struct DisplayModuleGraphNodeWithEdges<'a> {
78    gid: GlobalItemIndex,
79    out_edges: &'a [GlobalItemIndex],
80}
81
82impl fmt::Debug for DisplayModuleGraphNodeWithEdges<'_> {
83    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
84        f.debug_struct("Edge")
85            .field(
86                "caller",
87                &format_args!("{}:{}", self.gid.module.as_usize(), self.gid.index.as_usize()),
88            )
89            .field(
90                "callees",
91                &self
92                    .out_edges
93                    .iter()
94                    .map(|gid| format!("{}:{}", gid.module.as_usize(), gid.index.as_usize()))
95                    .collect::<Vec<_>>(),
96            )
97            .finish()
98    }
99}