{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-tabs/src/client/reactive/active-expression/ae-debugging-cache.js"],"names":["AExprRegistry","diff","getAEDataForFile","getHooksInFile","AEDebuggingCache","constructor","registeredDebuggingViews","debouncedUpdateDebuggingViews","_","debounce","updateDebggingViews","changedFiles","Set","registerFileForAEDebugging","url","context","aeDataCallback","callback","valid","push","updateFile","oldCode","newCode","fileSaved","lineMapping","calculateMapping","ae","getLocationCache","getAEsInFile","location","meta","get","remapLocation","hook","getLocations","then","locations","e","console","error","length","start","line","diffType","lineChanged","diffType2","lineChanged2","end","lively","notify","mapping","dmp","diff_match_patch","a","diff_linesToChars_","lineText1","chars1","lineText2","chars2","lineArray","diffs","diff_main","originalLine","newLine","recentDeletions","recentAdditions","type","data","i","matchingLines","Math","max","substring","diff_charsToLines_","updateFiles","files","forEach","file","add","some","includes","splice","DebuggingCache"],"mappings":"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","file":"ae-debugging-cache.js","sourcesContent":["import { AExprRegistry } from 'src/client/reactive/active-expression/ae-registry.js';\nimport diff from 'src/external/diff-match-patch.js';\nimport { getAEDataForFile, getHooksInFile } from 'src/client/reactive/active-expression-rewriting/active-expression-rewriting.js'\n\nexport default class AEDebuggingCache {\n\n  constructor() {\n    this.registeredDebuggingViews = [];\n    this.debouncedUpdateDebuggingViews = _.debounce(this.updateDebggingViews, 100);\n    this.changedFiles = new Set();\n  }\n  /*MD ## Registration MD*/\n  async registerFileForAEDebugging(url, context, aeDataCallback) {\n    const callback = async () => {\n      if (context && (!context.valid || context.valid())) {\n        aeDataCallback((await this.getAEDataForFile(url)));\n        return true;\n      }\n      return false;\n    };\n    this.registeredDebuggingViews.push({ callback, url });\n\n    aeDataCallback((await this.getAEDataForFile(url)));\n  }\n  \n  getAEDataForFile(url) {\n    //Currently only supports RewritingAEs\n    return getAEDataForFile(url);\n  }\n\n  /*MD ## Caching MD*/\n\n  /*MD ## Code Change API MD*/\n  async updateFile(url, oldCode, newCode) {\n    AExprRegistry.fileSaved(url)\n    try {\n      const lineMapping = this.calculateMapping(oldCode, newCode);\n      for (const ae of AExprRegistry.getLocationCache().getAEsInFile(url)) {\n        const location = ae.meta().get(\"location\");\n        this.remapLocation(lineMapping, location);\n      }\n      for (const hook of await getHooksInFile(url)) {\n        hook.getLocations().then(locations => {\n          for (const location of locations) {\n            this.remapLocation(lineMapping, location);\n          }\n        });\n      }\n    } catch (e) {\n      console.error(e);\n    }\n  }\n\n  remapLocation(lineMapping, location) {\n    if(!location) return;\n    if(lineMapping.length - 1 < location.start.line) return;\n    let [diffType, lineChanged] = lineMapping[location.start.line];\n\n    if (diffType === -1) {\n      location.start.line = 0;\n    } else {\n      location.start.line = diffType;\n    }\n\n    let [diffType2, lineChanged2] = lineMapping[location.end.line];\n\n    if (diffType2 === -1) {\n      location.end.line = 0;\n    } else {\n      location.end.line = diffType2;\n    }\n    if (lineChanged || lineChanged2) {\n      lively.notify(\"Changed AE code for existing AE. There are outdated expressions in the system\");\n      //ToDo: Check if the content is similar enough, mark AEs as outdated\n    }\n  }\n\n  calculateMapping(oldCode, newCode) {\n    const mapping = []; //For each line of oldCode: new Line in newCode if existing, changedContent if the line no longer exists but can be mapped to a newCode line\n    var dmp = new diff.diff_match_patch();\n    var a = dmp.diff_linesToChars_(oldCode, newCode);\n    var lineText1 = a.chars1;\n    var lineText2 = a.chars2;\n    var lineArray = a.lineArray;\n    var diffs = dmp.diff_main(lineText1, lineText2, false);\n\n    let originalLine = 0;\n    let newLine = 0;\n    let recentDeletions = 0;\n    let recentAdditions = 0;\n    for (let [type, data] of diffs) {\n      if (type === 0) {\n        recentDeletions = 0;\n        recentAdditions = 0;\n        for (let i = 0; i < data.length; i++) {\n          mapping[originalLine] = [newLine, false];\n          originalLine++;\n          newLine++;\n        }\n      } else if (type === 1) {\n        if (recentDeletions > 0) {\n          const matchingLines = Math.max(recentDeletions, data.length);\n          for (let i = 0; i < matchingLines; i++) {\n            mapping[originalLine - matchingLines + i] = [newLine, true];\n            newLine++;\n          }\n          data = data.substring(matchingLines);\n        }\n        if (data.length > 0) {\n          newLine += data.length;\n          recentAdditions += data.length;\n        }\n      } else {\n        if (recentAdditions > 0) {\n          const matchingLines = Math.max(recentAdditions, data.length);\n          for (let i = 0; i < matchingLines; i++) {\n            mapping[originalLine] = [newLine - matchingLines + i, true];\n            originalLine++;\n          }\n          data = data.substring(matchingLines);\n        }\n        recentDeletions += data.length;\n        for (let i = 0; i < data.length; i++) {\n          mapping[originalLine] = [-1, false];\n          originalLine++;\n        }\n      }\n    }\n\n    dmp.diff_charsToLines_(diffs, lineArray);\n\n    return mapping;\n  }\n  \n  updateFiles(files) {\n    if (!files) return;\n    files.forEach(file => {\n      if(file) {\n        this.changedFiles.add(file)\n      }\n    });\n    this.debouncedUpdateDebuggingViews();\n  }\n\n  async updateDebggingViews() {\n    for (let i = 0; i < this.registeredDebuggingViews.length; i++) {\n      if (![...this.changedFiles].some(file => file.includes(this.registeredDebuggingViews[i].url))) continue;\n      if (!(await this.registeredDebuggingViews[i].callback())) {\n        this.registeredDebuggingViews.splice(i, 1);\n        i--;\n      }\n    }\n    this.changedFiles = new Set();\n  }\n\n}\n\nexport const DebuggingCache = new AEDebuggingCache();"]}