{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/src/client/reactive/components/basic/aexpr-graph.js"],"names":["Morph","AExprRegistry","DebuggingCache","debounce","ContextMenu","AexprGraph","initialize","windowTitle","setWindowSize","width","window","innerWidth","height","innerHeight","graphViz","graph","append","engine","config","onclick","data","evt","element","callback","onClickMap","get","key","rerenderGraph","containerElement","shadowRoot","querySelector","debouncedChange","addEventListener","ae","event","groupAEs","livelyPreMigrate","removeEventListener","detachedCallback","setDotData","graphData","edges","nodes","aes","allAsArray","slice","allScopes","Map","allDeps","allAEs","allHooks","aeCount","depCount","hookCount","aeData","extractData","sameLocation","find","aeAndIndex","aeID","checked","set","aeClicked","push","join","dep","dependencies","all","context","identifier","value","contextIdentifierValue","has","meta","parentAE","dependency","type","dependencyKey","getDependency","id","depAndId","_","isEqual","undefined","escapeTextForDOTRecordLabel","i","deps","subgraphNodes","subgraphEdges","dependencyClicked","hook","getHooks","getLocations","length","hookClicked","informationString","toString","constructContextMenu","locations","Promise","map","flat","object","menuItems","lively","openInspector","forEach","location","index","fileNameString","file","start","line","openLocationInBrowser","menu","openIn","document","body","focus","locationText","substring","lastIndexOf","text","replaceAll","ch","column","end","files","exists","then","openBrowser","notify","livelyMigrate","other","livelyExample"],"mappings":"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","file":"aexpr-graph.js","sourcesContent":["\"enable aexpr\";\n\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport { AExprRegistry } from 'src/client/reactive/active-expression/active-expression.js';\nimport { DebuggingCache } from 'src/client/reactive/active-expression-rewriting/active-expression-rewriting.js';\nimport { debounce } from \"utils\";\nimport ContextMenu from 'src/client/contextmenu.js';\n//import d3 from \"src/external/d3-graphviz.js\"\n\nexport default class AexprGraph extends Morph {\n  async initialize() {\n    this.windowTitle = \"Active Expression Graph\";\n    this.setWindowSize(1200, 800);\n    let width = window.innerWidth;\n    let height = window.innerHeight;\n    this.graphViz = await (<d3-graphviz style=\"background:gray\"></d3-graphviz>);\n    this.graph.append(this.graphViz);\n    //\"dot\", \"neato\", \"fdp\", \"twopi\", \"circo\"\n    this.graphViz.engine = \"dot\";\n    const graph = this;\n    this.graphViz.config({\n      onclick(data, evt, element) {\n        // lively.showElement(element)\n        //if(evt.ctrlKey) {} \n        const callback = graph.onClickMap.get(data.key);\n        if (callback) {\n          callback(evt);\n        }\n      }\n    });\n\n    await this.rerenderGraph();\n    const containerElement = this.graphViz.shadowRoot.querySelector(\"#container\");\n    /*containerElement.setAttribute(\"display\", \"flex\");\n    containerElement.children[0].setAttribute(\"display\", \"flex\");\n    setTimeout(() => {\n      debugger;\n      const svgElement = this.graphViz.shadowRoot.querySelector(\"svg\");\n      svgElement.setAttribute(\"height\", \"100%\");\n      svgElement.setAttribute(\"width\", \"100%\");\n    }, 10000);*/\n\n    this.debouncedChange = this.rerenderGraph.debounce(50, 300);\n    AExprRegistry.addEventListener(this, (ae, event) => {\n      this.debouncedChange();\n    });\n    this.groupAEs.addEventListener('change', () => {\n      this.debouncedChange();\n    });\n  }\n\n  livelyPreMigrate() {\n    AExprRegistry.removeEventListener(this);\n  }\n\n  detachedCallback() {\n    AExprRegistry.removeEventListener(this);\n  }\n\n  async rerenderGraph() {\n    await this.graphViz.setDotData((await this.graphData()));\n  }\n\n  async graphData() {\n\n    const edges = [];\n    const nodes = [];\n\n    const aes = AExprRegistry.allAsArray().slice(0, 50);\n\n    const allScopes = new Map();\n    const allDeps = new Map();\n    const allAEs = new Map();\n    const allHooks = new Map();\n    this.onClickMap = new Map();\n\n    let aeCount = 0;\n    let depCount = 0;\n    let hookCount = 0;\n    for (const ae of aes) {\n      const aeData = this.extractData(ae);\n      const sameLocation = [...allAEs].find(aeAndIndex => this.extractData(aeAndIndex[0])[2] === aeData[2]);\n      let aeID = aeCount;\n      if (!sameLocation || !this.groupAEs.checked) {\n        this.onClickMap.set(`AE${aeID}`, evt => {\n          this.aeClicked(ae, evt);\n        });\n        nodes.push(`AE${aeID} [shape=\"record\" label=\"{${aeData.join(\"|\")}}\"]`);\n        aeCount++;\n      } else {\n        aeID = sameLocation[1];\n      }\n      allAEs.set(ae, aeID);\n      for (const dep of ae.dependencies().all()) {\n        const [context, identifier, value] = dep.contextIdentifierValue();\n        if (!allScopes.has(context)) {\n          allScopes.set(context, []);\n        }\n        allScopes.get(context).push(dep);\n        if (!allDeps.has(dep)) {\n          allDeps.set(dep, depCount);\n          depCount++;\n        }\n\n        edges.push(`AE${aeID} -> DEP${allDeps.get(dep)}`);\n      }\n    }\n    for (const ae of aes) {\n      for (const event of ae.meta().get(\"events\") || []) {\n        if (event.value && event.value.parentAE) {\n          edges.push(`AE${allAEs.get(ae)} -> AE${allAEs.get(event.value.parentAE)} [color=\"#ff0000\"]`);\n        }\n        if (event.value && event.value.dependency && event.type === \"changed value\") {\n          const dependencyKey = event.value.dependency;\n          const dependency = dependencyKey.getDependency();\n          if (!dependency) {\n            let id = [...allDeps].find(depAndId => _.isEqual(depAndId[0], dependencyKey));\n            if (id === undefined) {\n              allDeps.set(dependencyKey, depCount);\n              id = depCount;\n              depCount++;\n              nodes.push(`DEP${allDeps.get(dependencyKey)} [shape=\"record\" label=\"{${this.escapeTextForDOTRecordLabel(dependencyKey.context + \".\" + dependencyKey.identifier)}|No longer tracked}\"]`);\n            } else {\n              id = id[1];\n            }\n            edges.push(`AE${allAEs.get(ae)} -> DEP${id} [color=\"#00ff00\"]`);\n          } else {\n            edges.push(`AE${allAEs.get(ae)} -> DEP${allDeps.get(dependency)} [color=\"#00ff00\"]`);\n          }\n        }\n      }\n    }\n    let i = 0;\n    for (const [context, deps] of allScopes) {\n      const subgraphNodes = [];\n      const subgraphEdges = [];\n      for (const dep of deps) {\n        this.onClickMap.set(`DEP${allDeps.get(dep)}`, evt => {\n          this.dependencyClicked(dep, evt);\n        });\n        subgraphNodes.push(`DEP${allDeps.get(dep)} [shape=\"record\" label=\"{${this.escapeTextForDOTRecordLabel(dep.identifier)}|${dep.type()}}\"]`);\n        for (const hook of dep.getHooks()) {\n          if ((await hook.getLocations()).length === 0) continue;\n          if (!allHooks.has(hook)) {\n            allHooks.set(hook, hookCount);\n            this.onClickMap.set(`HOOK${hookCount}`, evt => {\n              this.hookClicked(hook, evt);\n            });\n            subgraphNodes.push(`HOOK${hookCount} [shape=\"record\" label=\"{${this.escapeTextForDOTRecordLabel(hook.informationString())}}\"]`);\n            hookCount++;\n          }\n          subgraphEdges.push(`DEP${allDeps.get(dep)} -> HOOK${allHooks.get(hook)}`);\n        }\n      }\n\n      nodes.push(`subgraph cluster${i} {\n        graph[color=\"#00ffff\"];\n        ${subgraphNodes.join(\";\\n\")}\n        ${subgraphEdges.join(\";\\n\")}\n        label = \"${this.escapeTextForDOTRecordLabel(context.toString())}\";\n      }`);\n      i++;\n    }\n\n    //edges.push(`lol1 -> lol2 [color=\"#00ff00\"]`);\n\n    return `digraph {\n      graph [  splines=\"true\"  overlap=\"false\" compound=\"true\" ];\n      node [ style=\"solid\"  shape=\"plain\"  fontname=\"Arial\"  fontsize=\"14\"  fontcolor=\"black\" ];\n      edge [  fontname=\"Arial\"  fontsize=\"8\" ];\n\n      ${nodes.join(\";\\n\")}\n\n      ${edges.join(\";\\n\")}\n    }`;\n  }\n\n  aeClicked(ae, evt) {\n    this.constructContextMenu(ae, [ae.meta().get(\"location\")], evt);\n  }\n\n  async dependencyClicked(dependency, evt) {\n    const locations = await Promise.all(dependency.getHooks().map(hook => hook.getLocations()));\n    this.constructContextMenu(dependency, locations.flat(), evt);\n  }\n\n  async hookClicked(hook, evt) {\n    this.constructContextMenu(hook, (await hook.getLocations()), evt);\n  }\n\n  async constructContextMenu(object, locations, evt) {\n    const menuItems = [];\n    menuItems.push([\"inspect\", () => {\n      lively.openInspector(object);\n    }, \"\", \"l\"]);\n\n    locations.forEach((location, index) => {\n      menuItems.push([this.fileNameString(location.file) + \":\" + location.start.line, () => {\n        this.openLocationInBrowser(location);\n      }, \"\", \"\"]);\n    });\n\n    const menu = await ContextMenu.openIn(document.body, evt, undefined, document.body, menuItems);\n    menu.addEventListener(\"DOMNodeRemoved\", () => {\n      this.focus();\n    });\n  }\n\n  extractData(ae) {\n    const data = [];\n\n    data.push(this.escapeTextForDOTRecordLabel(ae.meta().get(\"id\")));\n    data.push(this.escapeTextForDOTRecordLabel(ae.meta().get(\"sourceCode\")));\n    const location = ae.meta().get(\"location\");\n    if (location) {\n      const locationText = location.file.substring(location.file.lastIndexOf(\"/\") + 1) + \" line \" + location.start.line;\n      data.push(this.escapeTextForDOTRecordLabel(locationText));\n    }\n    return data;\n  }\n\n  escapeTextForDOTRecordLabel(text) {\n    if (!text) return \"\";\n    text = text.toString();\n    text = text.replaceAll(\"\\\\\", \"\\\\\\\\\");\n    text = text.replaceAll(\"<\", \"\\\\<\");\n    text = text.replaceAll(\">\", \"\\\\>\");\n    text = text.replaceAll(\"{\", \"\\\\{\");\n    text = text.replaceAll(\"}\", \"\\\\}\");\n    text = text.replaceAll(\"[\", \"\\\\[\");\n    text = text.replaceAll(\"]\", \"\\\\]\");\n    text = text.replaceAll(\"\\\"\", \"\\\\\\\"\");\n    text = text.replaceAll(\"|\", \"\\\\|\");\n    return text;\n  }\n\n  fileNameString(file) {\n    return file.substring(file.lastIndexOf('/') + 1);\n  }\n\n  openLocationInBrowser(location) {\n    const start = { line: location.start.line - 1, ch: location.start.column };\n    const end = { line: location.end.line - 1, ch: location.end.column };\n    lively.files.exists(location.file).then(exists => {\n      if (exists) {\n        lively.openBrowser(location.file, true, { start, end }, false, undefined, true);\n      } else {\n        lively.notify(\"Unable to find file:\" + location.file);\n      }\n    });\n  }\n\n  livelyMigrate(other) {}\n\n  async livelyExample() {}\n\n  get graph() {\n    return this.get(\"#graph\");\n  }\n\n  get groupAEs() {\n    return this.get(\"#groupAEs\");\n  }\n\n}"]}