{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-livelyenergy/src/components/demo/lively-whyline.js"],"names":["Morph","babelDefault","SyntaxChecker","boundEval","debounce","ShowPerformance","equalIdentifiers","babel","Whyline","initialize","windowTitle","get","setURL","lively4url","loadFile","sourceCodeChangedDelay","checkForSyntaxErrorsCodeMirror","editor","registerButtons","editorComp","addEventListener","evt","onSourceChange","dispatchEvent","CustomEvent","highlightColor","onControlFlowQuestion","node","selectedNode","newNode","whyWasThisStatementExecuted","selectCallTraceNode","onPreviousOccurrence","previousOccurrence","onPredecessor","predecessor","onPreviousControlFlow","previousControlFlow","onSuccessor","successor","onNextOccurrence","nextOccurrence","onGenerateTrace","runCode","markCallTree","traceNode","astNode","markId","lastMarkCounter","children","forEach","ea","markSource","loc","markText","line","start","ch","column","end","isTraceMark","className","css","title","type","highlightNodeSource","clearCodeMarkings","getAllMarks","filter","clear","hideMarker","marker","shadowRoot","querySelector","style","backgroundColor","classList","remove","showMarker","lastMarkId","add","console","log","updateQuestions","disabled","parent","questionPane","innerHTML","variablesOfInterest","variable","appendChild","variableQuestionsDiv","questions","dataFlowQuestions","referencedVars","sort","a","b","name","localeCompare","id","i","arr","pred","map","previousAssignmentTo","varDiv","document","createElement","label","createTextNode","variableQuestions","question","row","Math","floor","questionDiv","toString","elem","elemDiv","isIcon","icon","content","button","result","onclick","setAttribute","selected","readBefore","readAfter","writeBefore","writeAfter","readOrWriteBefore","readOrWriteAfter","ast","src","getValue","traceBabelPlugin","System","import","default","transform","babelrc","plugins","presets","filename","undefined","sourceFileName","moduleIds","sourceMaps","sourceType","compact","comments","code","resolveModuleSource","m","err","error","ctx","getContext","fillStyle","fillRect","value","window","__tr_last_ast__","traceRoot","calltrace","updateTraceView","updateCodeAnnotations","tree","printTraceNode","maxCallId","parentElement","nodeElement","labelString","stopPropagation","addCodeAnnotation","text","info","lineInfo","gutterMarkers","markerLine","rightgutter","fontSize","whiteSpace","setGutterMarker","resultNode","textContent","clearGutter","parentBounds","getBoundingClientRect","updateCodeAnnotation","ast_node","argument","left","property","livelyMigrate","other","getURL","setValue","measure"],"mappings":"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","file":"lively-whyline.js","sourcesContent":["import Morph from 'src/components/widgets/lively-morph.js';\nimport babelDefault from 'systemjs-babel-build';\nconst babel = babelDefault.babel;\nimport SyntaxChecker from 'src/client/syntax.js'\nimport boundEval from 'src/client/bound-eval.js';\nimport { debounce } from \"utils\";\n\nimport ShowPerformance from \"demos/contextjs/showperformancelayer.js\";\nimport { equalIdentifiers } from 'src/components/demo/lively-whyline-tracing.js'\n\n// import localsBabelPlugin from 'babel-plugin-locals'\n\n//import lively from './../src/client/lively.js';\n\nexport default class Whyline extends Morph {\n\n  initialize() {\n    this.windowTitle = \"Whyline\";  \n    this.get(\"#source\").setURL(lively4url + \"/src/components/demo/lively-whyline-example.js\")\n    this.get(\"#source\").loadFile()\n\n    this.sourceCodeChangedDelay = (() => {\n      SyntaxChecker.checkForSyntaxErrorsCodeMirror(this.editor());\n    })::debounce(500);\n\n    this.registerButtons();\n    \n    this.editorComp().addEventListener(\"change\", evt => \n      this.onSourceChange(evt));\n\n    this.editorComp().addEventListener(\"editor-loaded\", evt => \n      this.dispatchEvent(new CustomEvent(\"initialize\")));\n  }\n  \n  /*\n   * Private\n   */\n\n  editorComp() {\n    return this.get(\"#source\").get(\"lively-code-mirror\");\n  }\n  \n  editor() {\n    return this.editorComp().editor\n  }\n  \n  get highlightColor() {\n    return '#f9cb9c' //light orange\n  }\n  \n  /*\n   * Callbacks\n   */\n  \n  onSourceChange(evt) {\n    this.sourceCodeChangedDelay();\n  }\n  \n  onControlFlowQuestion(evt){\n    let node = this.selectedNode\n    let newNode = node.whyWasThisStatementExecuted()\n    this.selectCallTraceNode(newNode)\n  }\n  \n  onPreviousOccurrence(evt){\n    let node = this.selectedNode\n    this.selectCallTraceNode(node.previousOccurrence)\n  }\n  \n  onPredecessor(evt){\n    let node = this.selectedNode\n    this.selectCallTraceNode(node.predecessor)\n  }\n  \n  onPreviousControlFlow(evt){\n    let node = this.selectedNode\n    this.selectCallTraceNode(node.previousControlFlow())\n  }\n  \n    \n  onSuccessor(evt){\n    let node = this.selectedNode\n    this.selectCallTraceNode(node.successor)\n  }\n  \n  onNextOccurrence(evt){\n    let node = this.selectedNode\n    this.selectCallTraceNode(node.nextOccurrence)\n  }\n  \n  onGenerateTrace(evt) {\n    this.runCode()\n  }\n  \n  /*\n   * Highlighting Source Code\n   */\n  \n  markCallTree(traceNode) {\n    var astNode = traceNode.astNode\n    \n    if (!traceNode.markId) traceNode.markId = 'tracemark' + this.lastMarkCounter++;\n    //if (astNode) this.markSource(astNode, traceNode.markId);\n    \n    traceNode.children.forEach(ea => {\n      this.markCallTree(ea)\n    })\n  }\n  \n  markSource(astNode, markId) {\n    let loc = astNode.loc;\n    if (loc) {\n      this.editor().markText( \n        {line: loc.start.line - 1, ch: loc.start.column},\n        {line: loc.end.line - 1, ch: loc.end.column},\n        {\n          isTraceMark: true,\n          className: \"marked \" + markId,\n          css: \"background-color: rgba(0,255,0,0.3)\",\n          title: astNode.type\n        })\n    }\n  }\n  \n  highlightNodeSource(astNode) {\n    this.clearCodeMarkings();\n    let loc = astNode.loc;\n    if (loc) {\n      this.editor().markText( \n        {line: loc.start.line - 1, ch: loc.start.column},\n        {line: loc.end.line - 1, ch: loc.end.column},\n        {\n          isTraceMark: true,\n          css: `background-color: ${this.highlightColor}`\n        });\n    }\n  }\n\n  clearCodeMarkings() {\n    this.lastMarkCounter = 0\n    this.editor().getAllMarks()\n      .filter(ea => ea.isTraceMark)\n      .forEach(ea => ea.clear())\n  }\n  \n  hideMarker(markId) {\n    var marker = this.editorComp().shadowRoot.querySelector(\".\" + markId)\n    if (marker) marker.style.backgroundColor = ''\n    \n    var traceNode = this.get(\"#traceView\").querySelector(\"#\" + markId)\n    if (traceNode ) {\n       traceNode.classList.remove(\"selected\")\n    }\n  }\n  \n  showMarker(markId) {\n    if (this.lastMarkId) {\n      this.hideMarker(this.lastMarkId)\n    }\n    this.lastMarkId = markId\n    var marker = this.editorComp().shadowRoot.querySelector(\".\" + markId)\n    if (marker) marker.style.backgroundColor = this.highlightColor;\n\n    var traceNode = this.get(\"#traceView\").querySelector(\"#\" + markId)\n    if (traceNode ) {\n      traceNode.classList.add(\"selected\")\n    }\n  }\n  \n  /*\n   * Public\n   */\n  \n  selectCallTraceNode(traceNode) {\n    console.log(traceNode)\n    this.selectedNode = traceNode\n    \n    this.updateQuestions(traceNode);\n    \n    this.highlightNodeSource(traceNode.astNode);\n    if (this.selectedNode.markId) {\n      this.showMarker(this.selectedNode.markId)\n    }\n    \n  \n    this.get('#previousOccurrence').disabled = !this.selectedNode.previousOccurrence\n    \n    this.get('#predecessor').disabled = !this.selectedNode.predecessor\n    \n    this.get('#previousControlFlow').disabled = !this.selectedNode.parent\n    \n    this.get('#successor').disabled = !this.selectedNode.successor\n    \n    this.get('#nextOccurrence').disabled = !this.selectedNode.nextOccurrence\n      \n  }\n  \n  /*\n   * Asking Questions\n   */\n  \n  updateQuestions(traceNode) {\n    let questionPane = this.get(\"#questionPane\")\n    questionPane.innerHTML = '' //Clear previous buttons\n\n    traceNode.variablesOfInterest().forEach((variable) => {\n      questionPane.appendChild(this.variableQuestionsDiv(variable));\n    })\n  }\n  \n  questions(traceNode) {\n    return this.dataFlowQuestions(traceNode);\n  }\n  \n  dataFlowQuestions(traceNode) {\n    let referencedVars = traceNode.variablesOfInterest()\n                          .sort((a, b) => {\n                            return a.name.localeCompare(b.name)\n                          })\n                          .filter((id, i, arr) => {\n                            let pred = arr[i-1]\n                            return !(pred && equalIdentifiers(id, pred))\n                          })\n    return referencedVars.map((id) => {\n      return [`Previous assignment of '${id.name}'`, () => traceNode.previousAssignmentTo(id)];\n    });\n  }\n  \n  variableQuestionsDiv(variable) {\n    const varDiv = document.createElement(\"DIV\");\n    varDiv.style[\"display\"] = \"grid\";\n    varDiv.style[\"border-style\"] = \"outset\";\n    varDiv.style[\"margin\"] = \"1px\";\n    const label = document.createElement(\"DIV\");\n    label.appendChild(document.createTextNode(variable.name));\n    label.style[\"grid-column\"] = \"1 / 3\";\n    varDiv.appendChild(label);\n    \n    this.variableQuestions(variable).forEach((question, i) => {\n      const column = (i % 2) + 1;\n      const row = Math.floor(i / 2) + 2;\n      const questionDiv = document.createElement(\"DIV\");\n      questionDiv.style[\"grid-column\"] = column.toString();\n      questionDiv.style[\"grid-row\"] = row.toString();\n      questionDiv.style[\"display\"] = \"grid\";\n      question.forEach((elem, i) => {\n        let elemDiv;\n        if (elem.isIcon) {\n          //elemDiv = document.createElement(\"DIV\");\n          //elemDiv.appendChild(this.icon(elem.content));\n          elemDiv = this.icon(elem.content);\n          elemDiv.style[\"vertical-align\"] = \"middle\";\n        } else {\n          const button = elemDiv = document.createElement(\"BUTTON\");\n          button.disabled = !elem.result;\n          button.onclick = () => {\n            this.selectCallTraceNode(elem.result);\n          }\n          button.appendChild(this.icon(elem.content));\n          button.setAttribute(\"title\", elem.title);\n        }\n        elemDiv.style[\"grid-column\"] = i + 1;\n        elemDiv.style[\"grid-row\"] = 1;\n        questionDiv.appendChild(elemDiv);\n      })\n      \n      varDiv.appendChild(questionDiv);\n    })\n    return varDiv;\n  }\n  \n  variableQuestions(variable) {\n    const selected = this.selectedNode;\n    return [\n      [\n        {\n          \"content\": \"fa-book\",\n          \"isIcon\": true\n        },\n        {\n          \"title\": \"previous read operation\",\n          \"result\": variable.readBefore(selected),\n          \"content\": \"fa-angle-left\"\n        },\n        {\n          \"title\": \"next read operation\",\n          \"result\": variable.readAfter(selected),\n          \"content\": \"fa-angle-right\"\n        }\n      ],\n      [\n        {\n          \"content\": \"fa-pencil\",\n          \"isIcon\": true\n        },\n        {\n          \"title\": \"previous write operation\",\n          \"result\": variable.writeBefore(selected),\n          \"content\": \"fa-angle-left\"\n        },\n        {\n          \"title\": \"next write operation\",\n          \"result\": variable.writeAfter(selected),\n          \"content\": \"fa-angle-right\"\n        }\n      ],\n      [\n        {\n          \"content\": \"fa-pencil-square-o\",\n          \"isIcon\": true\n        },\n        {\n          \"title\": \"previous read or write operation\",\n          \"result\": variable.readOrWriteBefore(selected),\n          \"content\": \"fa-angle-left\"\n        },\n        {\n          \"title\": \"next read or write operation\",\n          \"result\": variable.readOrWriteAfter(selected),\n          \"content\": \"fa-angle-right\"\n        }\n      ]\n    ]\n  }\n  \n  icon(name) {\n    const i = document.createElement(\"i\");\n    i.className = `fa ${name}`;\n    i.setAttribute(\"aria-hidden\", \"true\");\n    return i;\n  }\n  \n  /*\n   * Trace Execution\n   */\n  \n  async runCode() {\n    this.ast = null; // clear\n    var src = this.editor().getValue();\n    \n    var traceBabelPlugin = (await System.import(lively4url + \"/src/components/demo/lively-whyline-plugin.js\")).default;\n    \n    try {\n      var src = this.editor().getValue();\n      this.result = babel.transform(src, {\n        babelrc: false,\n        plugins: [traceBabelPlugin],\n        presets: [],\n        filename: undefined,\n        sourceFileName: undefined,\n        moduleIds: false,\n        sourceMaps: false,\n        sourceType: 'module',\n        compact: false,\n        comments: true,\n        code: true,\n        ast: true,\n        resolveModuleSource: m=>m\n      })\n    } catch(err) {\n      console.error(err)\n    }\n    \n    try {\n      var ctx = this.get(\"#canvas\").getContext(\"2d\")\n      ctx.fillStyle = \"white\"\n      ctx.fillRect(0, 0, 300, 300);\n      console.log(this.result)\n      var result =  (await boundEval(\"\"+this.result.code, this.get(\"#canvas\"))).value\n    } catch(err) {\n    } finally {\n    \n    }\n    if (window.__tr_last_ast__)   {\n      this.ast = window.__tr_last_ast__\n      this.clearCodeMarkings()\n      this.traceRoot = this.ast.calltrace\n\n      this.markCallTree(this.traceRoot)\n      this.updateTraceView(this.traceRoot)\n      this.updateCodeAnnotations(this.traceRoot)\n    }\n  }\n  \n  /*\n   * Trace View\n   */\n\n  updateTraceView(tree) {\n    this.get(\"#traceView\").innerHTML = \"\"\n    this.printTraceNode(this.get(\"#traceView\"), tree)\n  }\n  \n  get maxCallId() {\n    return 200\n  }\n\n  printTraceNode(parentElement, traceNode) {\n    if (traceNode.id > this.maxCallId) return\n\n    var nodeElement = document.createElement(\"div\");\n    nodeElement.setAttribute(\"class\", \"traceNode\")\n\n    let label = traceNode.labelString();\n\n    nodeElement.innerHTML = \"<div class='traceLabel'> \" + label +\"</div>\"\n    nodeElement.setAttribute(\"title\", \"\" + traceNode.astNode.type)\n\n    nodeElement.id = traceNode.markId\n    nodeElement.addEventListener(\"click\", (evt) => {\n      this.selectCallTraceNode(traceNode)\n      evt.stopPropagation()\n    })\n\n    parentElement.appendChild(nodeElement)\n    traceNode.children.forEach( ea => {\n      this.printTraceNode(nodeElement, ea)\n    })\n  }\n  \n  /*\n   * Gutters\n   * (these things in the code pane on the right showing assignments)\n   */\n\n  addCodeAnnotation(line, text, node) {\n    var editor = this.editor()\n    var info = editor.lineInfo(line)\n    var gutterMarkers = info && info.gutterMarkers;\n    var markerLine = gutterMarkers && gutterMarkers.rightgutter\n    if (!markerLine) {\n        var markerLine = document.createElement(\"div\")\n        markerLine.style.fontSize = \"8pt\"\n        markerLine.style.whiteSpace = \"nowrap\"\n        markerLine.classList.add(\"markerLine\")  // markerLine    \n        editor.setGutterMarker(line, \"rightgutter\", markerLine)\n    }\n    var resultNode = document.createElement(\"span\");\n    resultNode.classList.add(\"markerResult\")\n    resultNode.classList.add(node.markId)\n    \n    resultNode.textContent =  text\n    \n    resultNode.id = node.markId\n    resultNode.addEventListener(\"click\", (evt) => {\n        this.selectCallTraceNode(node)\n        evt.stopPropagation()\n    })\n    markerLine.appendChild(resultNode)\n  }\n  \n  updateCodeAnnotations(node) {\n    this.editor().clearGutter(\"rightgutter\")\n    var parentBounds = this.getBoundingClientRect()\n    this.updateCodeAnnotation(node, parentBounds)\n  }\n  \n  updateCodeAnnotation(node, parentBounds) {\n    var ast_node = node.astNode\n    if (ast_node.type == \"UpdateExpression\") {\n      this.addCodeAnnotation(ast_node.loc.start.line - 1, \n        ast_node.argument.name + \"=\" + node.value + \";\", node)\n    }\n    if (ast_node.type == \"VariableDeclarator\") {\n      this.addCodeAnnotation(ast_node.loc.start.line - 1, \n        ast_node.id.name + \"=\" + node.value + \";\", node)\n    }\n    if (ast_node.type == \"AssignmentExpression\") {\n      var name = ast_node.left.name\n      if (!name && ast_node.left.property)  \n        name = ast_node.left.property.name;\n      this.addCodeAnnotation(ast_node.loc.start.line - 1, \n        name   + \"=\" + node.value + \";\", node)\n    }\n    node.children.forEach(ea => this.updateCodeAnnotation(ea, parentBounds))\n  }\n  \n  /*\n   * Lively\n   */\n\n  livelyMigrate(other) {\n    this.addEventListener(\"initialize\", () => {\n      this.get(\"#source\").setURL(other.get(\"#source\").getURL())\n      this.editor().setValue(other.editor().getValue())\n    })\n  }\n}\n\n\nShowPerformance.measure(Whyline, \"runCode\")\n"]}