1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
|
use crate::*;
use ansi::*;
pub struct SourceHierarchy<'a> {
pub resolver: &'a Resolver,
}
impl<'a> SourceHierarchy<'a> {
pub fn report(&self) {
eprintln!(".");
let len = self.resolver.root_unit_ids.len();
for (i, id) in self.resolver.root_unit_ids.iter().enumerate() {
let end = i + 1 == len;
self.report_leaf(*id, Vec::new(), end);
}
}
fn report_leaf(&self, id: usize, mut levels: Vec<bool>, end: bool) {
// A level entry is true if all entries in that level have been printed.
for level in &levels {
match level {
false => eprint!("│ "),
true => eprint!(" "),
}
}
// The end value is true if all siblings of this entry have been printed.
match end {
false => eprint!("├── "),
true => eprint!("└── "),
}
if let Some(unit) = self.resolver.source_units.get(id) {
let path_str = &unit.source_unit.main.path.as_os_str().to_string_lossy();
if let Some(name_str) = unit.source_unit.name() {
eprint!("{name_str}{BLUE}");
if unit.source_unit.head.is_some() { eprint!(" +head") }
if unit.source_unit.tail.is_some() { eprint!(" +tail") }
let mut unresolved = 0;
for symbol in &self.resolver.unresolved {
if symbol.source_id == id { unresolved += 1; }
}
if unresolved > 0 { eprint!("{RED} ({unresolved})"); }
eprintln!("{NORMAL} {DIM}({path_str}){NORMAL}");
} else {
eprintln!("{path_str}");
}
levels.push(end);
let len = unit.child_ids.len();
for (i, id) in unit.child_ids.iter().enumerate() {
let end = i + 1 == len;
self.report_leaf(*id, levels.clone(), end);
}
} else {
eprintln!("<error loading source unit details>");
}
}
}
|