miden_assembly/linker/
debug.rs1use 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}