summaryrefslogtreecommitdiff
path: root/graph/web/groups.js
diff options
context:
space:
mode:
Diffstat (limited to 'graph/web/groups.js')
-rw-r--r--graph/web/groups.js22
1 files changed, 19 insertions, 3 deletions
diff --git a/graph/web/groups.js b/graph/web/groups.js
index 6ee4e091..da14405f 100644
--- a/graph/web/groups.js
+++ b/graph/web/groups.js
@@ -19,20 +19,36 @@ class GraphGroups {
for (const n of snap.nodes) {
if (cover.get(n.id) !== n.id) continue;
const fold = groups.has(n.id) && folded.has(n.id);
- const v = {...n, edges: [], fold: fold ? groups.get(n.id) : null};
+ const v = {...n, slots: n.edges.length, edges: [], fold: fold ? groups.get(n.id) : null};
if (fold) {
v.proj = null;
v.type = `${v.fold.members.size} nodes folded`;
}
nodes.push(v); byId.set(n.id, v);
}
+ const bundles = new Map(), rank = {ASSOC: 0, DATA: 1, MEM: 2, CTRL: 3};
for (const n of snap.nodes) for (const e of n.edges) {
const use = byId.get(cover.get(n.id)), def = cover.get(e.def) || 0;
if (use.fold && (!def || def === use.id)) continue;
- use.edges.push({...e, idx: use.fold ? use.edges.length : e.idx, def,
- orig: {use: n.id, def: e.def, idx: e.idx}});
+ const orig = {use: n.id, def: e.def, idx: e.idx, role: e.role, label: e.label};
+ // During inlining the old function may disappear. Keep ordinary edges
+ // then; a shortcut needs a real, selectable function in this snapshot.
+ const jump = raw.get(e.jump)?.kind === "FUN" ? e.jump : 0;
+ const key = jump ? `j${use.id}:${jump}` : def && (use.fold || byId.get(def).fold) ? `${use.id}:${def}` : null;
+ const old = bundles.get(key);
+ if (old) {
+ old.refs.push(orig);
+ if (rank[e.role] > rank[old.role]) old.role = e.role;
+ old.label = null;
+ } else {
+ const edge = {...e, idx: use.fold ? use.edges.length : e.idx, def, jump, orig, refs: [orig]};
+ use.edges.push(edge);
+ if (key) bundles.set(key, edge);
+ }
}
// Expanded groups only; a folded group is represented by its header box.
+ for (const n of nodes) if (n.kind === "SCOPE") for (const e of n.edges)
+ e.label = e.refs.map(r => r.label || `[${r.idx}]`).join(", ");
const open = [...groups.values()].filter(g => !folded.has(g.id) && cover.get(g.id) === g.id);
const depth = g => {
let n = 0;