{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-function-completion/src/babylonian-programming-editor/babylonian-programming-editor.js"],"names":["Morph","systemBabel","BabylonianWorker","Timer","LocationConverter","astForCode","canBeProbe","canBeExample","canBeReplacement","canBeInstance","canBeSlider","parameterNamesForFunctionIdentifier","constructorParameterNamesForClassIdentifier","bodyForPath","defaultContext","defaultAnnotations","Probe","Slider","Example","Replacement","Instance","InstanceWidget","StatusBar","TextButton","CustomInstance","compareKeyLocations","keyLocationsAreEqual","stringInsert","stringRemove","Performance","traverse","babel","COMPONENT_URL","lively4url","DEFAULT_FILE_URL","BabylonianProgrammingEditor","initialize","windowTitle","_evaluationLocked","registerEditor","_ast","_selectedLocation","_selectedPath","_selectedPathActions","_deadMarkers","_annotations","_customInstances","_context","_activeExamples","_changeTimer","evaluate","bind","_statusBar","get","updateButtons","livelyEditor","postLoadFile","text","loadFileBabylonian","preSaveFile","saveFileBabylonian","addEventListener","evt","setAttribute","getURL","editorComp","console","log","editor","on","syncIndentations","start","onSelectionChanged","livelyCodeMirror","registerExtraKeys","addAnnotationAtSelection","cm","replaceSelection","livelyEditorStyle","codeMirrorStyle","shadowRoot","appendChild","url","getAttribute","setURL","loadFile","detachedCallback","unregisterEditor","removeAnnotations","length","comments","e","status","setText","getAnnotationKind","string","key","getAnnotationValue","value","JSON","parse","lines","split","annotationsQueue","annotations","removedChars","lineIndex","comment","loc","astToKey","removeComment","pos","kind","push","annotationMeta","shift","location","join","lastComment","matches","match","replace","data","context","customInstances","forEach","i","load","evaluateEditor","annotation","obj","addProbeAtPath","pathForKey","addSliderAtPath","addInstanceAtPath","addExampleAtPath","addReplacementAtPath","setTimeout","textFromEditor","serializedAnnotations","serializeForSave","sort","a","b","makeTags","beginTag","endObj","Object","assign","endTag","stringify","currentAnnotation","currentEditor","getValue","map","line","insertedRanges","insert","index","originalIndex","originalRange","range","tags","charsAddedOnLine","appendString","path","Error","probe","astToMarker","node","removeAnnotation","probes","enforceAllSliders","slider","onSliderChanged","sliders","isOn","example","onEvaluationNeeded","onExampleStateChanged","instances","examples","replacement","replacements","instance","hasWorkingAst","syncIndentation","updateAnnotations","pathForAnnotation","tracker","iterations","has","_id","maxValues","empty","nodeForAnnotation","ids","iterationParentId","idIterationParents","values","updateInstances","updateExamples","errors","id","error","keys","cleanupAnnotations","updateDeadMarkers","m","clear","activeExamples","size","that","BlockStatement","executedBlocks","markerLocation","markText","from","to","className","fire","fromContainer","splice","indexOf","includes","activeIndex","_widget","callback","annotationType","ignoreLock","step","onTrackerChanged","hadParseError","hadEvalError","lastEvalError","stop","selectionToKey","ranges","_locationMap","selectedPath","isProgram","updateSelectedPathActions","onEditPrePostScript","comp","lively","openComponentInWindow","setup","prescript","postscript","onEditInstances","exampleId","includedIds","visitor","Identifier","ReturnStatement","MemberExpression","Function","skip","Loop","loopPath","parentPath","scope","setActiveRunForExampleId","newIsOn","checkFunctions","_buttons","innerHTML","concat","markerToKey","normalizeButtonName","__proto__","constructor","name","onBenchmark","counter","numTests","doBenchmark","reset","locationAsKey","message","setStatus","slice","charAt","toUpperCase","toLowerCase","ast","toString","babylonianProgrammingEditor","livelyCodeMirrorEditor","hideToolbar","setScrollInfo","info","getScrollInfo","getCursor","setCursor","cur","preserveView","getText","saveFile","awaitEditor","sleep","livelyExample"],"mappings":"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","file":"babylonian-programming-editor.js","sourcesContent":["// System imports\nimport Morph from 'src/components/widgets/lively-morph.js';\nimport systemBabel from 'systemjs-babel-build';\nconst { traverse } = systemBabel.babel;\n\n// Custom imports\nimport BabylonianWorker from \"./worker/babylonian-worker.js\";\nimport Timer from \"./utils/timer.js\";\nimport LocationConverter from \"./utils/location-converter.js\";\nimport {\n  astForCode,\n  canBeProbe,\n  canBeExample,\n  canBeReplacement,\n  canBeInstance,\n  canBeSlider,\n  parameterNamesForFunctionIdentifier,\n  constructorParameterNamesForClassIdentifier,\n  bodyForPath\n} from \"./utils/ast.js\";\nimport {\n  defaultContext,\n  defaultAnnotations\n} from \"./utils/defaults.js\";\nimport Probe from \"./annotations/probe.js\";\nimport Slider from \"./annotations/slider.js\";\nimport Example from \"./annotations/example.js\";\nimport Replacement from \"./annotations/replacement.js\";\nimport Instance from \"./annotations/instance.js\";\nimport InstanceWidget from \"./ui/instance-widget.js\";\nimport StatusBar from \"./ui/status-bar.js\";\nimport { TextButton } from \"./ui/buttons.js\";\nimport CustomInstance from \"./utils/custom-instance.js\";\nimport {\n  compareKeyLocations,\n  keyLocationsAreEqual,\n  stringInsert,\n  stringRemove\n} from \"./utils/utils.js\";\nimport Performance from \"./utils/performance.js\";\n\n\n// Constants\nconst COMPONENT_URL = `${lively4url}/src/babylonian-programming-editor`;\nconst DEFAULT_FILE_URL = `${COMPONENT_URL}/demos/tree-improved.js`;\n\n\n/**\n * An editor for Babylonian (Example-Based) Programming\n */\nexport default class BabylonianProgrammingEditor extends Morph {\n\n  /**\n   * Loading the editor\n   */\n\n  async initialize() {\n    this.windowTitle = \"Babylonian Programming Editor\";\n\n    // Lock evaluation until we are fully loaded\n    this._evaluationLocked = true;\n\n    // Register editor\n    BabylonianWorker.registerEditor(this);\n\n    // AST\n    this._ast = null; // Node\n\n    // Selection\n    this._selectedLocation = null;\n    this._selectedPath = null; // NodePath\n    this._selectedPathActions = []; // [String]\n\n    // Pure text markers\n    this._deadMarkers = []; // [TextMarker]\n\n    // All Annotations\n    this._annotations = defaultAnnotations();\n    this._customInstances = [];\n\n    // Module context\n    this._context = defaultContext();\n\n    // Currently activated examples\n    this._activeExamples = []; // [Example]\n\n    // Timer to evaluate when user stops writing\n    this._changeTimer = new Timer(500, this.evaluate.bind(this));\n\n    // Status Bar\n    this._statusBar = new StatusBar(this.get(\"#status\"));\n    this.updateButtons();\n\n    // CodeMirror\n\n    this.livelyEditor().postLoadFile = (text) => {\n      return this.loadFileBabylonian(text)\n    }\n    \n    this.livelyEditor().preSaveFile = (text) => {\n      return this.saveFileBabylonian(text)\n    }\n    \n    this.livelyEditor().addEventListener(\"url-changed\", (evt) => {\n      this.setAttribute(\"url\", this.livelyEditor().getURL())\n    })\n     \n     \n    \n    var editorComp = this.editorComp()\n      \n    console.log(\"Babylonian: load editor\" + editorComp)\n    editorComp.addEventListener(\"editor-loaded\", () => {\n      \n      console.log(\"Babylonian: editor loaded \", this.livelyEditor())\n      // Patch editor to load/save comments\n\n      // Test file\n      // this.livelyEditor().setURL(DEFAULT_FILE_URL);\n\n      // Event listeners\n      this.editor().on(\"change\", () => {\n        this.syncIndentations() ;\n        this._changeTimer.start();\n      });\n      this.editor().on(\"beforeSelectionChange\", this.onSelectionChanged.bind(this));\n      this.livelyCodeMirror().registerExtraKeys({\n        \"Ctrl-1\": () => this.addAnnotationAtSelection(\"probe\"),\n        \"Ctrl-2\": () => this.addAnnotationAtSelection(\"slider\"),\n        \"Ctrl-3\": () => this.addAnnotationAtSelection(\"example\"),\n        \"Ctrl-4\": () => this.addAnnotationAtSelection(\"instance\"),\n        \"Ctrl-5\": () => this.addAnnotationAtSelection(\"replacement\"),\n        \"Tab\": (cm) => { cm.replaceSelection(\"  \") },\n      });\n\n      // Inject styling into CodeMirror\n      const livelyEditorStyle = <link rel=\"stylesheet\" href={`${COMPONENT_URL}/lively-code-editor-inject-styles.css`}></link>;\n      const codeMirrorStyle = <link rel=\"stylesheet\" href={`${COMPONENT_URL}/codemirror-inject-styles.css`}></link>;\n      this.livelyEditor().shadowRoot.appendChild(livelyEditorStyle);\n      this.editorComp().shadowRoot.appendChild(codeMirrorStyle);\n      \n      var url = this.getAttribute(\"url\")\n      if (url) {\n        this.setURL(url)\n        this.loadFile()\n      }\n      \n    });\n  }\n  \n  \n  detachedCallback() {\n     BabylonianWorker.unregisterEditor(this);\n  }\n\n  async loadFileBabylonian(text) {\n    \n    console.log(\"Babylonian  loadFileBabylonian\")\n    // Lock evaluation until we are fully loaded\n    this._evaluationLocked = true;\n    \n    // Remove all existing annotations\n    this.removeAnnotations();\n    this._annotations = defaultAnnotations();\n    this._activeExamples = [];\n    this._context = defaultContext();\n    this._customInstances.length = 0;\n\n    let comments = [];\n    \n    console.log(\"AST for code \", text)\n    try {\n      comments = astForCode(text).comments;\n    } catch(e) {\n      this.status(\"error\", \"Syntax error. Fix syntax and reload file.\");\n      this.livelyEditor().setText(text);\n      return;\n    }\n\n    // Find annotations\n    const getAnnotationKind = (string) => {\n      for(let key of [\"probe\", \"slider\", \"example\", \"instance\", \"replacement\"]) {\n        if(string == `${key}:`) {\n          return key;\n        }\n      }\n      return false;\n    }\n    const getAnnotationValue = (string) => {\n      try {\n        const value = JSON.parse(string);\n        if(typeof(value) === \"object\") {\n          return value;\n        }\n      } catch(e) {\n        return false;\n      }\n      return false\n    }\n\n    // Collect annotations and remove comments\n    const lines = text.split(\"\\n\");\n    const annotationsQueue = [];\n    const annotations = [];\n\n    let removedChars = 0;\n\n    let lineIndex = 0;\n    for(let comment of comments) {\n      const loc = LocationConverter.astToKey(comment.loc);\n      if(loc[0] - 1 !== lineIndex) {\n        lineIndex = loc[0] - 1;\n        removedChars = 0;\n      }\n\n      const removeComment = () => {\n        const pos = loc[1] - removedChars;\n        lines[lineIndex] = stringRemove(lines[lineIndex], pos, loc[3] - removedChars);\n        removedChars += loc[3] - loc[1];\n        return pos;\n      };\n\n      let kind = getAnnotationKind(comment.value);\n      let value = getAnnotationValue(comment.value);\n      if(kind) {\n        annotationsQueue.push([kind, removeComment()]);\n      } else if(value) {\n        let annotationMeta = annotationsQueue.shift();\n        if(annotationMeta) {\n          value.kind = annotationMeta[0];\n          value.location = [lineIndex+1, annotationMeta[1], lineIndex+1, removeComment()];\n          annotations.push(value);\n        }\n      }\n    }\n    text = lines.join(\"\\n\");\n\n    // Add context\n    if(comments.length) {\n      const lastComment = comments[comments.length-1].value;\n      const matches = lastComment.match(/^\\s*Context: (.*)\\s*/);\n      if(matches) {\n        text = text.replace(`/*${matches[0]}*/`, \"\");\n        const data = JSON.parse(matches[1]);\n        this._context = data.context ? data.context : defaultContext();\n        if(data.customInstances) {\n          data.customInstances.forEach(i => this._customInstances.push(new CustomInstance().load(i)));\n        }\n      }\n    }\n\n    // Add annotations\n    this.livelyEditor().setText(text);\n    await BabylonianWorker.evaluateEditor(this, false);\n\n    for(let annotation of annotations) {\n      let obj;\n      switch(annotation.kind) {\n        case \"probe\":\n          this.addProbeAtPath(this.pathForKey(annotation.location));\n          break;\n        case \"slider\":\n          this.addSliderAtPath(this.pathForKey(annotation.location));\n          break;\n        case \"instance\":\n          obj = this.addInstanceAtPath(this.pathForKey(annotation.location));\n          obj && obj.load(annotation);\n          break;\n        case \"example\":\n          obj = this.addExampleAtPath(this.pathForKey(annotation.location), false);\n          obj && obj.load(annotation);\n          break;\n        case \"replacement\":\n          obj = this.addReplacementAtPath(this.pathForKey(annotation.location));\n          obj && obj.load(annotation);\n      }\n    }\n\n    // Evaluate\n    await this.evaluate(true);\n    setTimeout(() => {\n      this._evaluationLocked = false;\n    }, 2000);\n    \n    return text\n  }\n\n  async saveFileBabylonian(textFromEditor) {\n    // Serialize annotations\n    const serializedAnnotations = [];\n    for(let key in this._annotations) {\n      for(let annotation of this._annotations[key]) {\n        serializedAnnotations.push(annotation.serializeForSave());\n      }\n    }\n    serializedAnnotations.sort((a,b) => compareKeyLocations(a.location, b.location));\n    const makeTags = (annotation) => {\n      const beginTag = `/*${annotation.kind}:*/`;\n      const endObj = Object.assign({}, annotation);\n      delete endObj.kind;\n      delete endObj.location;\n      const endTag = `/*${JSON.stringify(endObj)}*/`;\n      return [beginTag, endTag];\n    };\n\n    // Write annotations\n    let currentAnnotation = serializedAnnotations.shift();\n    const lines = this.livelyEditor().currentEditor().getValue().split(\"\\n\").map((line, i) => {\n      let insertedRanges = [];\n      const insert = (string, index) => {\n        const originalIndex = index;\n        const originalRange = [originalIndex, string.length];\n        // Apply existing ranges\n        for(let range of insertedRanges) {\n          if(range[0] <= originalIndex) {\n            index += range[1];\n          }\n        }\n        // Insert\n        line = stringInsert(line, string, index);\n        // Store range\n        insertedRanges.push(originalRange);\n      };\n\n      while(currentAnnotation && currentAnnotation.location[0]-1 === i) {\n        const tags = makeTags(currentAnnotation);\n        insert(tags[0], currentAnnotation.location[1]);\n        insert(tags[1], currentAnnotation.location[3]);\n        currentAnnotation = serializedAnnotations.shift();\n      }\n      return line;\n    });\n\n    for(let lineIndex in lines) {\n      let charsAddedOnLine = 0;\n    }\n\n    // Write file\n    let text = lines.join(\"\\n\");\n    const appendString = JSON.stringify({\n      context: this._context,\n      customInstances: this._customInstances.map(i => i.serializeForSave())\n    });\n    text = `${text}/* Context: ${appendString} */`;\n    // #BUG... Babylonian editor seems to violate the assumtion that the editor holds all the text...! #continue\n    this.value = text\n    return text\n  }\n\n\n  /**\n   * Adding annotations\n   */\n\n  addAnnotationAtSelection(kind) {\n    // Get selected path\n    const path = this._selectedPath;\n    if(!path) {\n      throw new Error(\"The selection is not valid\");\n    }\n\n    // Add annotation\n    switch(kind) {\n      case \"probe\":\n        this.addProbeAtPath(path);\n        break;\n      case \"slider\":\n        this.addSliderAtPath(path);\n        break;\n      case \"example\":\n        this.addExampleAtPath(path, false);\n        break;\n      case \"instance\":\n        this.addInstanceAtPath(path);\n        break;\n      case \"replacement\":\n        this.addReplacementAtPath(path);\n        break;\n      default:\n        throw new Error(\"Unknown annotation kind\");\n    }\n  }\n\n  addProbeAtPath(path) {\n    // Make sure we can probe this path\n    if(!canBeProbe(path)) {\n      return;\n    }\n\n    // Add the probe\n    const probe = new Probe(\n      this.editor(),\n      LocationConverter.astToMarker(path.node.loc),\n      this.removeAnnotation.bind(this)\n    );\n    this._annotations.probes.push(probe);\n\n    this.enforceAllSliders();\n    this.evaluate();\n    return probe;\n  }\n\n  addSliderAtPath(path) {\n    // Make sure we can probe this path\n    if(!canBeSlider(path)) {\n      return;\n    }\n\n    // Add the slider\n    const slider = new Slider(\n      this.editor(),\n      LocationConverter.astToMarker(path.node.loc),\n      this.onSliderChanged.bind(this),\n      this.removeAnnotation.bind(this)\n    );\n    this._annotations.sliders.push(slider);\n\n    this.evaluate();\n    return slider;\n  }\n\n  addExampleAtPath(path, isOn = true) {\n    // Make sure we can probe this path\n    if(!canBeExample(path)) {\n      return;\n    }\n\n    // Add the example\n    const example = new Example(\n      this.editor(),\n      LocationConverter.astToMarker(path.node.loc),\n      this.onEvaluationNeeded.bind(this),\n      this.removeAnnotation.bind(this),\n      this.onExampleStateChanged.bind(this),\n      isOn,\n      this._annotations.instances,\n      this._customInstances\n    );\n    this._annotations.examples.push(example);\n\n    if(isOn) {\n      this._activeExamples.push(example);\n    }\n\n    this.evaluate();\n    return example;\n  }\n\n  addReplacementAtPath(path) {\n    // Make sure we can replace this path\n    if(!canBeReplacement(path)) {\n      return;\n    }\n\n    // Add the replacement\n    const replacement = new Replacement(\n      this.editor(),\n      LocationConverter.astToMarker(path.node.loc),\n      this.onEvaluationNeeded.bind(this),\n      this.removeAnnotation.bind(this)\n    );\n    this._annotations.replacements.push(replacement);\n\n    this.evaluate();\n    return replacement;\n  }\n\n  addInstanceAtPath(path) {\n    // Make sure we can add an instance to this path\n    if(!canBeInstance(path)) {\n      return;\n    }\n\n    // Add the instance\n    const instance = new Instance(\n      this.editor(),\n      LocationConverter.astToMarker(path.node.loc),\n      this.onEvaluationNeeded.bind(this),\n      this.removeAnnotation.bind(this),\n      this._annotations.instances,\n      this._customInstances\n    );\n    this._annotations.instances.push(instance);\n\n    this.evaluate();\n    return instance;\n  }\n\n\n  /**\n   * Updating annotations\n   */\n\n  syncIndentations() {\n    if(!this.hasWorkingAst()) {\n      return;\n    }\n\n    for(let key in this._annotations) {\n      for(let annotation of this._annotations[key]) {\n        annotation.syncIndentation();\n      }\n    }\n  }\n\n  /*example:*/updateAnnotations/*{\"id\":\"8de8_4761_b269\",\"name\":{\"mode\":\"input\",\"value\":\"\"},\"color\":\"hsl(80, 30%, 70%)\",\"values\":{},\"instanceId\":{\"mode\":\"connect\",\"value\":\"8de8_4761_b269_this\"},\"prescript\":\"\",\"postscript\":\"\"}*/() {\n    // Update sliders\n    for(let /*probe:*/slider/*{}*/ of this._annotations.sliders) {\n      const node = bodyForPath(this.pathForAnnotation(slider)).node;\n      if(BabylonianWorker.tracker.iterations.has(node._id)) {\n        /*probe:*/slider.maxValues/*{}*/ = BabylonianWorker.tracker.iterations.get(node._id);\n      } else {\n        slider.empty();\n      }\n    }\n\n    // Update probes\n    for(let probe of this._annotations.probes) {\n      const node = this.nodeForAnnotation(probe);\n      if(BabylonianWorker.tracker.ids.has(node._id)) {\n        probe.iterationParentId = BabylonianWorker.tracker.idIterationParents.get(node._id);\n        probe.values = BabylonianWorker.tracker.ids.get(node._id);\n      } else {\n        probe.empty();\n      }\n    }\n\n    // Update instances\n    this.updateInstances();\n\n    // Update examples\n    this.updateExamples();\n  }\n\n  updateExamples() {\n    for(let example of this._annotations.examples) {\n      try {\n        const path = this.pathForAnnotation(example);\n        if (!path) {\n          console.log(\"BabylonianProgrammingEditor could not updateExamples \", example)\n          return \n        }\n        \n        if(BabylonianWorker.tracker.errors.has(example.id)) {\n          example.error = BabylonianWorker.tracker.errors.get(example.id);\n        } else {\n          example.error = null;\n        }\n        example.keys = parameterNamesForFunctionIdentifier(path);\n      } catch(e) {\n        debugger\n        console.error(\"updateExamples Error\" + e, example, this)\n      }\n    }\n  }\n\n  updateInstances() {\n    for(let instance of this._annotations.instances) {\n      const path = this.pathForAnnotation(instance);\n      instance.keys = constructorParameterNamesForClassIdentifier(path);\n    }\n  }\n\n  cleanupAnnotations() {\n    this.removeAnnotations(annotation => !annotation.location);\n  }\n\n  updateDeadMarkers() {\n    // Remove old dead markers\n    this._deadMarkers.map(m => m.clear());\n\n    // Don't show dead markers if we have no activated example (except the default example)\n    if(BabylonianWorker.activeExamples.size <= 1) {\n      return;\n    }\n\n    // Add new markers\n    const that = this;\n    traverse(this._ast, {\n      BlockStatement(path) {\n        if(!BabylonianWorker.tracker.executedBlocks.has(path.node._id)) {\n          const markerLocation = LocationConverter.astToMarker(path.node.loc);\n          that._deadMarkers.push(\n            that.editor().markText(\n              markerLocation.from,\n              markerLocation.to,\n              {\n                className: \"marker dead\"\n              }\n            )\n          );\n        }\n      }\n    });\n  }\n\n  enforceAllSliders() {\n    for(let slider of this._annotations.sliders) {\n      slider.fire();\n    }\n  }\n\n  removeAnnotation(annotation, fromContainer = null) {\n    if(fromContainer) {\n      fromContainer.splice(fromContainer.indexOf(annotation), 1);\n    } else {\n      for(let key in this._annotations) {\n        if(this._annotations[key].includes(annotation)) {\n          this._annotations[key].splice(this._annotations[key].indexOf(annotation), 1);\n        }\n      }\n    }\n\n    // If the annotation was an active example, we have to deactivate it\n    const activeIndex = this._activeExamples.indexOf(annotation);\n    if(activeIndex !== -1) {\n      this._activeExamples.splice(activeIndex, 1);\n    }\n    annotation.clear();\n\n    // If the annotation was an instance, we have to update the examples that might have used it\n    if(annotation._widget instanceof InstanceWidget) {\n      this.updateExamples();\n    }\n\n    this.evaluate();\n  }\n\n  removeAnnotations(callback = null) {\n    for(let annotationType in this._annotations) {\n      for(let annotation of this._annotations[annotationType]) {\n        if(!callback || callback(annotation)) {\n          this.removeAnnotation(annotation, this._annotations[annotationType]);\n        }\n      }\n    }\n  }\n\n\n  /**\n   * Evaluating code\n   */\n\n  async evaluate(ignoreLock = false) {\n    if(this._evaluationLocked && !ignoreLock) {\n      return;\n    }\n    \n    // Performance\n    Performance.step(\"prep\");\n    \n    // Make sure we have no zombie annotations\n    this.cleanupAnnotations()\n\n    this.status(\"evaluating\");\n    \n    await BabylonianWorker.evaluateEditor(this);\n  }\n\n\n  /**\n   * Event handlers\n   */\n\n  onTrackerChanged() {\n    // console.log(\"BAB onTrackerChanged\", this)\n    if(this.hadParseError) {\n      this.status(\"error\", \"Syntax Error\");\n    } else if(this.hadEvalError) {\n      this.status(\"error\", this.lastEvalError);\n      this.updateInstances();\n      this.updateExamples();\n    } else {\n      this.updateAnnotations();\n      this.updateDeadMarkers();\n      if(BabylonianWorker.tracker.errors.size) {\n        this.status(\"warning\", \"At least one example caused an Error\");\n      } else {\n        this.status();\n      }\n    }\n    \n    // Performance\n    Performance.stop();\n  }\n\n\n  onSelectionChanged(instance, data) {\n    // This needs an AST\n    if(!this.hasWorkingAst()) {\n      this._selectedPath = null;\n      return;\n    }\n\n    // Get selected path\n    this._selectedLocation = LocationConverter.selectionToKey(data.ranges[0]);\n\n    // Check if we selected a node\n    if(this._selectedLocation in this._ast._locationMap) {\n      const selectedPath = this._ast._locationMap[this._selectedLocation];\n      if(selectedPath && !selectedPath.isProgram()) {\n        this._selectedPath = selectedPath;\n      }\n    } else {\n      this._selectedPath = null;\n    }\n\n    this.updateSelectedPathActions();\n  }\n\n  async onEditPrePostScript() {\n    let comp = await lively.openComponentInWindow(\"pre-post-script-editor\");\n    comp.setup(\"Module\", [], this._context.prescript, this._context.postscript, (value) => {\n      this._context.prescript = value.prescript;\n      this._context.postscript = value.postscript;\n      this.onEvaluationNeeded();\n    }, \"Module\");\n  }\n\n  async onEditInstances() {\n    let comp = await lively.openComponentInWindow(\"custom-instance-template-editor\");\n    comp.setup(this._customInstances, this.onEvaluationNeeded.bind(this));\n  }\n\n  onSliderChanged(slider, exampleId, value) { \n    const includedIds = [];\n    const visitor = {\n      Identifier(path) {\n        includedIds.push(path.node._id);\n      },\n      ReturnStatement(path) {\n        includedIds.push(path.node._id);\n      },\n      MemberExpression(path) {\n        includedIds.push(path.node._id);\n      },\n      Function(path) {\n        path.skip();\n      },\n      Loop(path) {\n        path.skip();\n      }\n    };\n    \n    // Find in body\n    const loopPath = bodyForPath(this.pathForAnnotation(slider)).parentPath;\n    traverse(loopPath.node, visitor, loopPath.scope, loopPath);\n    \n    // Get all probes directly in the body\n    this._annotations.probes.forEach((probe) => {\n      if(includedIds.includes(this.nodeForAnnotation(probe)._id)) {\n        probe.setActiveRunForExampleId(exampleId, value);\n      }\n    });\n  }\n\n  onExampleStateChanged(example, newIsOn) {\n    if(newIsOn) {\n      this._activeExamples.push(example);\n    } else {\n      this._activeExamples.splice(this._activeExamples.indexOf(example), 1);\n    }\n    this.evaluate();\n  }\n\n  onEvaluationNeeded() {\n    this.evaluate();\n  }\n\n  updateSelectedPathActions() {\n    this._selectedPathActions = [];\n\n    if(this._selectedPath) {\n      const checkFunctions = {\n        \"probe\": canBeProbe,\n        \"slider\": canBeSlider,\n        \"replacement\": canBeReplacement,\n        \"example\": canBeExample,\n        \"instance\": canBeInstance,\n      }\n\n      Object.keys(checkFunctions).forEach(key => {\n        if(checkFunctions[key](this._selectedPath)) {\n          this._selectedPathActions.push(key);\n        }\n      });\n    }\n\n    this.updateButtons();\n  }\n\n  updateButtons() {\n    this._buttons = this.get(\"#buttons\");\n    this._buttons.innerHTML = \"\";\n\n    // Always visible\n    this._buttons.appendChild(TextButton(\"\", \"exchange\", this.onEditPrePostScript.bind(this)));\n    this._buttons.appendChild(TextButton(\"\", \"object-group\", this.onEditInstances.bind(this)));\n    //this._buttons.appendChild(TextButton(\"\", \"\", this.onBenchmark.bind(this)));\n    \n    if(!this._selectedPath) {\n      return;\n    }\n\n    // Remove annotations\n    for(let annotation of this._annotations.probes.concat(this._annotations.sliders)) {\n      if(keyLocationsAreEqual(LocationConverter.markerToKey(annotation.location), this._selectedLocation)) {\n        this._buttons.appendChild(\n          TextButton(\n            this.normalizeButtonName(annotation.__proto__.constructor.name), \"minus\", () => {\n              this.removeAnnotation(annotation);\n            }\n          )\n        );\n      }\n    }\n\n    // Add annotations\n    for(let key of this._selectedPathActions) {\n      this._buttons.appendChild(\n        TextButton(\n          this.normalizeButtonName(key), \"plus\", this.addAnnotationAtSelection.bind(this, key)\n        )\n      );\n    }\n  }\n  \n  onBenchmark() {\n    let counter = 0;\n    let numTests = 100;\n    const doBenchmark = () => {\n      console.log(`Benchmark ${counter} of ${numTests}`);\n      \n      // Benchmark actions\n      this.evaluate();\n      \n      // Repeat\n      counter++;\n      if(counter < numTests) {\n        setTimeout(doBenchmark, 5000);\n      }\n    }\n    \n    Performance.reset();\n    doBenchmark();\n  }\n\n\n  /**\n   * Shortcuts\n   */\n\n  hasWorkingAst() {\n    return (this._ast && this._ast._locationMap);\n  }\n\n  nodeForAnnotation(annotation) {\n    const path = this.pathForAnnotation(annotation);\n    if(path) {\n      return path.node;\n    }\n    return null;\n  }\n\n  pathForAnnotation(annotation) {\n    if(annotation.locationAsKey && this.hasWorkingAst()) {\n      return this.pathForKey(annotation.locationAsKey);\n    }\n    return null;\n  }\n\n  status(status = null, message = null) {\n    this._statusBar.setStatus(status, message);\n  }\n\n  pathForKey(key) {\n    return this._ast._locationMap[key];\n  }\n\n\n\n  editorComp() {\n    return this.livelyEditor().get(\"lively-code-mirror\");\n  }\n\n  editor() {\n    return this.editorComp().editor\n  }\n\n  /*example:*//*example:*/normalizeButtonName/*{\"id\":\"8943_87e4_9899\",\"name\":{\"mode\":\"input\",\"value\":\"Invalid\"},\"color\":\"hsl(350, 30%, 70%)\",\"values\":{\"name\":{\"mode\":\"input\",\"value\":\"\\\"Hello\\\"\"}},\"instanceId\":{\"mode\":\"input\",\"value\":\"\"},\"prescript\":\"\",\"postscript\":\"\"}*//*{\"id\":\"49e7_b2c7_0340\",\"name\":{\"mode\":\"input\",\"value\":\"Instance\"},\"color\":\"hsl(180, 30%, 70%)\",\"values\":{\"name\":{\"mode\":\"input\",\"value\":\"\\\"Instance\\\"\"}},\"instanceId\":{\"mode\":\"input\",\"value\":\"\"},\"prescript\":\"\",\"postscript\":\"\"}*/(name) {\n    if(name[name.length - 1] === \"s\") {\n      name = name.slice(0, -1);\n    }\n    name = name.charAt(0).toUpperCase() + name.slice(1);\n\n    switch(name.toLowerCase()) {\n      case \"instance\":\n        name = \"Instance template\";\n    }\n\n    /*probe:*/return/*{}*/ name;\n  }\n\n  /**\n   * Accessors\n   */\n\n  get activeExamples() { return this._activeExamples; }\n  get annotations() { return this._annotations; }\n  set ast(ast) { this._ast = ast; }\n  get context() { return this._context; }\n  get customInstances() { return this._customInstances; }\n  get url() { return this.livelyEditor().getURL().toString(); }\n  \n  get value() { return this.editor().getValue() }\n  set value(value) { return this.editor().value =  value }\n  \n\n  \n  /* EDITOR Levels / FACADEs */\n  \n  babylonianProgrammingEditor() {\n    return this\n  }\n  \n  livelyEditor() {\n    return this.get(\"#source\")\n  }\n\n  livelyCodeMirror() {\n    return this.editorComp()\n  }\n  \n  livelyCodeMirrorEditor() {\n    return this.editor() // the cm object\n  }\n  \n  \n  /*\n   * Editor API Facade\n   */\n  hideToolbar() {\n     return this.livelyEditor().hideToolbar()\n  }\n  \n  setScrollInfo(info) {\n    return this.livelyEditor().setScrollInfo(info)\n  }\n  \n  getScrollInfo() {\n    return this.livelyEditor().getScrollInfo()\n  }\n  \n  currentEditor() {\n    return this.editor()\n  }\n\n  getCursor() {\n    return this.livelyEditor().getCursor()\n  }\n  \n  setCursor(cur) {\n     return this.livelyEditor().setCursor(cur)\n  }\n\n  getURL(url) {\n    return this.livelyEditor().getURL()  // || this.getAttribute(\"url\")\n  }\n  \n  setURL(url) {\n    this.setAttribute(\"url\", url)\n    return this.livelyEditor().setURL(url)\n  }\n\n  async setText(text, preserveView) {\n    await this.loadFileBabylonian(text)\n  }\n\n  getText() {\n    return this.livelyEditor().getText()\n  }\n  \n  async saveFile() {\n    return this.livelyEditor().saveFile()\n    \n  }\n  \n  loadFile() {\n    return this.livelyEditor().loadFile()\n  }\n  \n  \n  async awaitEditor() {\n    while(!editor) {\n      var editor = this.currentEditor()\n      if (!editor) {\n        await lively.sleep(10) // busy wait\n      }\n    }\n    return editor\n  }\n  \n  livelyExample() {\n    this.setURL(DEFAULT_FILE_URL)\n    this.loadFile()\n  }\n  \n  \n  \n  \n}\n/* Context: {\"context\":{\"prescript\":\"\",\"postscript\":\"\"},\"customInstances\":[]} */"]}