v.depgraph: fix ci/misc-tooling `./v -autofree -o v2 cmd/v` task

pull/10147/head
Delyan Angelov 2021-05-20 07:19:46 +03:00
parent f09a5135e9
commit b0de1f76e8
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED
1 changed files with 17 additions and 12 deletions

View File

@ -148,6 +148,7 @@ mut:
} }
pub fn (graph &DepGraph) display_cycles() string { pub fn (graph &DepGraph) display_cycles() string {
mut seen := false
mut out := []string{} mut out := []string{}
mut nn := NodeNames{} mut nn := NodeNames{}
for node in graph.nodes { for node in graph.nodes {
@ -158,7 +159,8 @@ pub fn (graph &DepGraph) display_cycles() string {
if k in nn.is_cycle { if k in nn.is_cycle {
continue continue
} }
if nn.is_part_of_cycle(k, mut cycle_names) { seen, cycle_names = nn.is_part_of_cycle(k, cycle_names)
if seen {
out << ' * ' + cycle_names.join(' -> ') out << ' * ' + cycle_names.join(' -> ')
nn.is_cycle = map[string]bool{} nn.is_cycle = map[string]bool{}
} }
@ -166,29 +168,32 @@ pub fn (graph &DepGraph) display_cycles() string {
return out.join('\n') return out.join('\n')
} }
fn (mut nn NodeNames) is_part_of_cycle(name string, mut already_seen []string) bool { fn (mut nn NodeNames) is_part_of_cycle(name string, already_seen []string) (bool, []string) {
mut seen := false
mut new_already_seen := already_seen.clone()
if name in nn.is_cycle { if name in nn.is_cycle {
return nn.is_cycle[name] return nn.is_cycle[name], new_already_seen
} }
if name in already_seen { if name in already_seen {
already_seen << name new_already_seen << name
nn.is_cycle[name] = true nn.is_cycle[name] = true
return true return true, new_already_seen
} }
already_seen << name new_already_seen << name
deps := nn.names[name] deps := nn.names[name]
if deps.len == 0 { if deps.len == 0 {
nn.is_cycle[name] = false nn.is_cycle[name] = false
return false return false, new_already_seen
} }
for d in deps { for d in deps {
mut d_already_seen := already_seen.clone() mut d_already_seen := new_already_seen.clone()
if nn.is_part_of_cycle(d, mut d_already_seen) { seen, d_already_seen = nn.is_part_of_cycle(d, d_already_seen)
already_seen = d_already_seen.clone() if seen {
new_already_seen = d_already_seen.clone()
nn.is_cycle[name] = true nn.is_cycle[name] = true
return true return true, new_already_seen
} }
} }
nn.is_cycle[name] = false nn.is_cycle[name] = false
return false return false, new_already_seen
} }