import cg, os, re, collections
AMBIG = {"run","register","fetch","dispatch","main","new","send","poll","list","start","stop","status","open","read","write","get","set","remove","parse","ensure_daemon","spawn","join","create","show"}
seeds = [("spt-daemon\src\daemon.rs","ensure_running"),("spt-daemon\src\daemon.rs","ensure_running_outcome")]
seen = {}
q = collections.deque(seeds)
edges = collections.defaultdict(set)
defs = {}
for fd in cg.funcs: defs.setdefault((fd["file"],fd["name"]),fd)
while q:
    f,n = q.popleft()
    if (f,n) in seen: continue
    seen[(f,n)] = 1
    stem = os.path.splitext(os.path.basename(f))[0]
    if stem == "mod": stem = os.path.basename(os.path.dirname(f))
    hits = []
    if n in AMBIG:
        hits = cg.callers(n, f) + [h for h in cg.callers(n, None, stem) if h[0] != f]
    else:
        hits = cg.callers(n)
    for rel, ln, enc in hits:
        if enc is None or enc["test"]: continue
        if enc["name"] == n and rel == f: continue
        key = (rel, enc["name"])
        edges[key].add((f, n, ln))
        if key not in seen: q.append(key)
for k in sorted(seen):
    print(k[0], k[1], "<-calls->", sorted({(x[1], x[2]) for x in edges.get(k, [])}))
