xref: /aosp_15_r20/build/bazel/json_module_graph/distanceFromLeaves.jq (revision 7594170e27e0732bc44b93d1440d87a54b6ffe7c)
1*7594170eSAndroid Build Coastguard Worker# CMD: Prints the longest distance each module has from a leaf in the module graph within the transitive closure of given module
2*7594170eSAndroid Build Coastguard Worker
3*7594170eSAndroid Build Coastguard Workerinclude "library";
4*7594170eSAndroid Build Coastguard Worker
5*7594170eSAndroid Build Coastguard Workerdef onlyDeps:
6*7594170eSAndroid Build Coastguard Worker  { Name: .Name, Deps: .Deps | map(.Name) }
7*7594170eSAndroid Build Coastguard Worker;
8*7594170eSAndroid Build Coastguard Worker
9*7594170eSAndroid Build Coastguard Workerdef mergeDepsForSameModule:
10*7594170eSAndroid Build Coastguard Worker  group_by(.Name) | map({Name: .[0].Name, Deps: map(.Deps) | flatten | unique | sort})
11*7594170eSAndroid Build Coastguard Worker;
12*7594170eSAndroid Build Coastguard Worker
13*7594170eSAndroid Build Coastguard Workerdef toMergeMap:
14*7594170eSAndroid Build Coastguard Worker  map({key: .Name, value: .Deps}) | from_entries
15*7594170eSAndroid Build Coastguard Worker;
16*7594170eSAndroid Build Coastguard Worker
17*7594170eSAndroid Build Coastguard Workerdef moduleGraphNoVariants:
18*7594170eSAndroid Build Coastguard Worker  map(onlyDeps) | mergeDepsForSameModule | toMergeMap
19*7594170eSAndroid Build Coastguard Worker;
20*7594170eSAndroid Build Coastguard Worker
21*7594170eSAndroid Build Coastguard Workerdef removeSelfEdges:
22*7594170eSAndroid Build Coastguard Worker  to_entries |
23*7594170eSAndroid Build Coastguard Worker  map(.key as $key | {key: .key, value: .value | [.[] | select(. != $key)]}) |
24*7594170eSAndroid Build Coastguard Worker  from_entries
25*7594170eSAndroid Build Coastguard Worker;
26*7594170eSAndroid Build Coastguard Worker
27*7594170eSAndroid Build Coastguard Workerdef nextDepths($m):
28*7594170eSAndroid Build Coastguard Worker  . as $old |
29*7594170eSAndroid Build Coastguard Worker  to_entries |
30*7594170eSAndroid Build Coastguard Worker  map({
31*7594170eSAndroid Build Coastguard Worker      key: .key,
32*7594170eSAndroid Build Coastguard Worker      value: (
33*7594170eSAndroid Build Coastguard Worker          .key as $key |
34*7594170eSAndroid Build Coastguard Worker          $m[.key] // [] |
35*7594170eSAndroid Build Coastguard Worker          map($old[.]) |
36*7594170eSAndroid Build Coastguard Worker          if any(. == -1) then -1 else (max // -1) + 1 end
37*7594170eSAndroid Build Coastguard Worker      )
38*7594170eSAndroid Build Coastguard Worker  }) |
39*7594170eSAndroid Build Coastguard Worker  from_entries
40*7594170eSAndroid Build Coastguard Worker;
41*7594170eSAndroid Build Coastguard Worker
42*7594170eSAndroid Build Coastguard Workerdef maxDepths($m):
43*7594170eSAndroid Build Coastguard Worker  map({key: ., value: -1}) | from_entries |
44*7594170eSAndroid Build Coastguard Worker  {Prev: [], Next: .} |
45*7594170eSAndroid Build Coastguard Worker  until (.Prev == .Next; {Prev: .Next, Next: .Next | nextDepths($m)}) |
46*7594170eSAndroid Build Coastguard Worker  .Next
47*7594170eSAndroid Build Coastguard Worker;
48*7594170eSAndroid Build Coastguard Worker
49*7594170eSAndroid Build Coastguard Workerdef variantlessDistancesFromLeaves($root):
50*7594170eSAndroid Build Coastguard Worker  (moduleGraphNoVariants | removeSelfEdges) as $m |
51*7594170eSAndroid Build Coastguard Worker  [$root] |
52*7594170eSAndroid Build Coastguard Worker  transitiveDeps($m) |
53*7594170eSAndroid Build Coastguard Worker  maxDepths($m)
54*7594170eSAndroid Build Coastguard Worker;
55*7594170eSAndroid Build Coastguard Worker
56*7594170eSAndroid Build Coastguard WorkervariantlessDistancesFromLeaves($arg)
57