{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-bp2019/src/components/widgets/tern-wrapper.js"],"names":["tern","t","loc","range","fileName","TernCodeMirrorWrapper","loadDefinition","fetch","then","res","json","initTernServer","Server","getFile","callback","text","catch","async","defs","plugins","es_modules","ternServer","_ternServerPromise","request","req","ts","Promise","resolve","reject","error","response","lively","showType","cmEditor","livelyCodeMirror","cursorPosition","getCursor","query","type","file","getTargetModule","end","start","undefined","lineCharPositions","files","name","value","showContextInfo","showError","updateArgHints","jumpStack","_jumpStack","inner","moveTo","data","targetCM","existingEditor","Array","from","document","querySelectorAll","find","editor","livelyEditor","openBrowser","container","getEditor","currentEditor","enclosingWindow","findWindow","getWrapperElement","tagName","gotoWindow","focus","setSelection","jumpToDefinition","atInterestingExpression","push","playgroundGetDefinition","location","r","_end","asCM","jumpBack","showReferences","me","success","refs","length","showHint","hint","list","map","ref","displayText","call","render","Element","self","appendChild","line","ch","anwser","to","alignWithWord","__temp__","cm","server","notify","tip","doc","createTextNode","url","tempTooltip","msg","String","content","state","ternTooltip","remove","right","bottom","cursorCoords","makeTooltip","mouseOnTip","old","maybeClear","clear","parentNode","off","fadeOut","CodeMirror","on","e","targetElement","relatedTarget","toElement","contains","setTimeout","x","y","node","style","left","top","tooltip","opacity","parent","removeChild","ternServerWrapper","target","pop","pos","tok","getTokenAt","test","getLine","slice","Math","max"],"mappings":";;;;;;;;;;;;;;;;AAAOA,U;AAAWC,O;;AAOTC,S,UAAAA,G;AAAKC,W,UAAAA,K;AAILC,c,UAAAA,Q;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAFTH;;;;;;;;;;;;;;;;;AAIA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEO,YAAMI,qBAAN,CAA4B;AACjC,eAAOC,cAAP,CAAsBF,QAAtB,EAAgC;AAC9B,iBAAOG,MAAO,2BAA0BH,QAAS,EAA1C,EAA6CI,IAA7C,CAAkDC,OAAOA,IAAIC,IAAJ,EAAzD,CAAP;AACD;AACD,qBAAaC,cAAb,GAA8B;AAC5B,iBAAO,IAAIX,KAAKY,MAAT,CAAgB;AACrBC,oBAAQT,QAAR,EAAkBU,QAAlB,EAA4B;AAC1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","file":"tern-wrapper.js","sourcesContent":["import tern, * as t from 'src/external/aexpr/tern/tern.js';\nimport 'src/external/aexpr/tern/def.js';\nimport 'src/external/aexpr/tern/comment.js';\nimport 'src/external/aexpr/tern/infer.js';\nimport 'src/external/aexpr/tern/modules.js';\nimport 'src/external/aexpr/tern/es_modules.js';\n\nimport { loc, range } from 'utils';\n\nt;\n\nimport { fileName } from 'utils';\n\n// // #######################\n// // Maintain Argument Hints\n// // #######################\n\n// async function updateArgHints(cm, lcm, serverWrapper) { // ts, cm\n//   closeArgHints(cm);\n\n//   if (cm.somethingSelected()) return lively.error(\"early out\");\n//   var state = cm.getTokenAt(cm.getCursor()).state;\n//   var inner = CodeMirror.innerMode(cm.getMode(), state);\n//   if (inner.mode.name != \"javascript\") return;\n//   var lex = inner.state.lexical;\n//   if (lex.info != \"call\") return;\n\n//   var ch, argPos = lex.pos || 0, tabSize = cm.getOption(\"tabSize\");\n//   for (var line = cm.getCursor().line, e = Math.max(0, line - 9), found = false; line >= e; --line) {\n//     var str = cm.getLine(line), extra = 0;\n//     for (var pos = 0;;) {\n//       var tab = str.indexOf(\"\\t\", pos);\n//       if (tab == -1) break;\n//       extra += tabSize - (tab + extra) % tabSize - 1;\n//       pos = tab + 1;\n//     }\n//     ch = lex.column - extra;\n//     if (str.charAt(ch) == \"(\") {found = true; break;}\n//   }\n//   if (!found) return;\n\n//   var start = CodeMirror.Pos(line, ch);\n//   var cache = cm.state.cachedArgHints;\n//   if (cache && cache.doc == cm.getDoc() && CodeMirror.cmpPos(start, cache.start) == 0) {\n//     return lively.notify(\"cached\", undefined, undefined, undefined, \"green\");\n//     return showArgHints(cm.state, cm, argPos);\n//   }\n//   // cm.state.cachedArgHints = {\n//   //   start: start,\n//   //   doc: cm.getDoc()\n//   // };\n//   lively.warn(\"calculate anew\");\n\n//   // cm.state.request(cm, {type: \"type\", preferFunction: true, end: start}, function(error, data) {\n//   //   cm.state.cachedArgHints = {\n//   //     start: start,\n//   //     type: parseFnType(data.type),\n//   //     name: data.exprName || data.name || \"fn\",\n//   //     guess: data.guess,\n//   //     doc: cm.getDoc()\n//   //   };\n//   //   showArgHints(cm.state, cm, argPos);\n//   // });\n\n//   let cmEditor = cm;\n//   let livelyCodeMirror = lcm;\n//   let cursorPosition = cmEditor.getCursor();\n\n//   try {\n//     let data = await serverWrapper.request({\n//       query: {\n//         type: \"type\",\n//         preferFunction: true,\n//         file: livelyCodeMirror.getTargetModule(),\n//         end: start\n//       },\n//       files: [{\n//         type: 'full',\n//         name: livelyCodeMirror.getTargetModule(),\n//         text: livelyCodeMirror.value\n//       }],\n//       //timeout: 10 * 1000\n//     });\n//     //if (!data.type || !(/^fn\\(/).test(data.type)) return;\n//     cm.state.cachedArgHints = {\n//       start: start,\n//       type: parseFnType(data.type),\n//       name: data.exprName || data.name || \"fn\",\n//       guess: data.guess,\n//       doc: cm.getDoc()\n//     };\n//     showArgHints({\n//       cachedArgHints: cm.state.cachedArgHints\n//     });\n//     //showContextInfo(cmEditor, response);\n//   } catch(error) {\n//     lively.error(\"ARG\", error.message)\n//     showError(cmEditor, error);\n//   }\n// }\n\n// function showArgHints(ts, cm, pos) {\n//   return;\n//   return lively.notify(ts.cachedArgHints.type, undefined, undefined, undefined, \"green\");\n//   closeArgHints(cm);\n\n//   var cache = ts.cachedArgHints, tp = cache.type;\n//   var tip = elt(\"span\", cache.guess ? cls + \"fhint-guess\" : null,\n//                 elt(\"span\", cls + \"fname\", cache.name), \"(\");\n//   for (var i = 0; i < tp.args.length; ++i) {\n//     if (i) tip.appendChild(document.createTextNode(\", \"));\n//     var arg = tp.args[i];\n//     tip.appendChild(elt(\"span\", cls + \"farg\" + (i == pos ? \" \" + cls + \"farg-current\" : \"\"), arg.name || \"?\"));\n//     if (arg.type != \"?\") {\n//       tip.appendChild(document.createTextNode(\":\\u00a0\"));\n//       tip.appendChild(elt(\"span\", cls + \"type\", arg.type));\n//     }\n//   }\n//   tip.appendChild(document.createTextNode(tp.rettype ? \") ->\\u00a0\" : \")\"));\n//   if (tp.rettype) tip.appendChild(elt(\"span\", cls + \"type\", tp.rettype));\n//   var place = cm.cursorCoords(null, \"page\");\n//   ts.activeArgHints = makeTooltip(place.right + 1, place.bottom, tip);\n// }\n\n// function parseFnType(text) {\n//   lively.notify(\"parse fn\")\n//   var args = [], pos = 3;\n\n//   function skipMatching(upto) {\n//     var depth = 0, start = pos;\n//     for (;;) {\n//       var next = text.charAt(pos);\n//       if (upto.test(next) && !depth) return text.slice(start, pos);\n//       if (/[{\\[\\(]/.test(next)) ++depth;\n//       else if (/[}\\]\\)]/.test(next)) --depth;\n//       ++pos;\n//     }\n//   }\n\n//   // Parse arguments\n//   if (text.charAt(pos) != \")\") for (;;) {\n//     var name = text.slice(pos).match(/^([^, \\(\\[\\{]+): /);\n//     if (name) {\n//       pos += name[0].length;\n//       name = name[1];\n//     }\n//     args.push({name: name, type: skipMatching(/[\\),]/)});\n//     if (text.charAt(pos) == \")\") break;\n//     pos += 2;\n//   }\n\n//   var rettype = text.slice(pos).match(/^\\) -> (.*)$/);\n\n//   return {args: args, rettype: rettype && rettype[1]};\n// }\n\n// function closeArgHints(ts) {\n//   if (ts.state.activeArgHints) {\n//     remove(ts.state.activeArgHints);\n//     ts.state.activeArgHints = null;\n//   }\n// }\n\nexport class TernCodeMirrorWrapper {\n  static loadDefinition(fileName) {\n    return fetch(`src/external/aexpr/tern/${fileName}`).then(res => res.json());\n  }\n  static async initTernServer() {\n    return new tern.Server({\n      getFile(fileName, callback) {\n        fetch(fileName)\n          .then(res => res.text())\n          .then(text => callback(null, text))\n          .catch(callback);\n      },\n      async: true,\n      // ecmaVersion: 6,\n      defs: [\n        await this.loadDefinition('browser.json'),\n        await this.loadDefinition('chai.json'),\n        await this.loadDefinition('ecmascript.json')\n      ],\n      plugins: {\n        es_modules: true\n      }\n    });\n  }\n  static async ternServer() {\n    return this._ternServerPromise = this._ternServerPromise || this.initTernServer();\n  }\n\n  static async request(req) {\n    let ts = await this.ternServer();\n    return new Promise((resolve, reject) => {\n      ts.request(req, (error, response) => {\n        if(error) {\n          lively.error(error);\n          reject(error);\n        } else {\n          resolve(response);\n        }\n      });\n    });\n  }\n\n  static async showType(cmEditor, livelyCodeMirror) {\n    let cursorPosition = cmEditor.getCursor();\n\n    try {\n      let response = await this.request({\n        query: {\n          type: \"type\",\n          file: livelyCodeMirror.getTargetModule(),\n          end: cursorPosition,\n          start: undefined, // #TODO: improve by checking for selections first\n          lineCharPositions: true\n        },\n        files: [{\n          type: 'full',\n          name: livelyCodeMirror.getTargetModule(),\n          text: livelyCodeMirror.value\n\n        }],\n        //timeout: 10 * 1000\n      });\n      showContextInfo(cmEditor, response);\n    } catch(error) {\n      showError(cmEditor, error);\n    }\n  }\n  static updateArgHints(cmEditor, livelyCodeMirror) {\n    // #TODO: implement efficiently\n    //updateArgHints(cmEditor, livelyCodeMirror, this)\n  }\n\n  static get jumpStack() {\n    return this._jumpStack || (this._jumpStack = []);\n  }\n  static async inner(cmEditor, livelyCodeMirror) {\n  }\n  static async moveTo(cmEditor, livelyCodeMirror, data) {\n    let targetCM = cmEditor;\n\n    // in same doc?\n    if(livelyCodeMirror.getTargetModule() !== data.file) {\n      let existingEditor = Array.from(document.querySelectorAll(\"body /deep/ lively-code-mirror\"))\n        .find(livelyCodeMirror => livelyCodeMirror.getTargetModule() === data.file);\n      // jump to data.file\n      if(existingEditor) {\n        targetCM = existingEditor.editor;\n      } else {\n        let livelyEditor = await lively.openBrowser(data.file, true)\n          .then(container => container.getEditor());\n        targetCM = livelyEditor.currentEditor() //.editor;\n      }\n    }\n\n    let enclosingWindow = lively.findWindow(targetCM.getWrapperElement());\n    if(enclosingWindow && enclosingWindow.tagName === 'LIVELY-WINDOW') {\n      lively.gotoWindow(enclosingWindow, true);\n    }\n    targetCM.focus();\n\n    // go to correct location\n    targetCM.setSelection(data.start, data.end);\n  }\n  static async jumpToDefinition(cmEditor, livelyCodeMirror) {\n    if(!atInterestingExpression(cmEditor)) {\n      showError(cmEditor, 'No interesting variable found');\n      return;\n    }\n\n    let cursorPosition = cmEditor.getCursor();\n\n    try {\n      let data = await this.request({\n        query: {\n          type: \"definition\",\n          file: livelyCodeMirror.getTargetModule(),\n          end: cursorPosition,\n          start: undefined, // #TODO: improve by checking for selections first\n          lineCharPositions: true\n        },\n        files: [{\n          type: 'full',\n          name: livelyCodeMirror.getTargetModule(),\n          text: livelyCodeMirror.value\n        }]\n      });\n\n      // properties of response data\n      // [start, end, file, context, contextOffset, doc, url, origin]\n\n      if (data.file) {\n        this.jumpStack.push({\n          file: livelyCodeMirror.getTargetModule(),\n          start: cmEditor.getCursor(\"from\"),\n          end: cmEditor.getCursor(\"to\")\n        });\n        // ### Stackpush, then moveTo\n        this.moveTo(cmEditor, livelyCodeMirror, data);\n      } else {\n        showError(cmEditor, `Could not find a definition.`);\n      }\n    } catch(error) {\n      showError(cmEditor, error);\n    }\n  }\n  static async playgroundGetDefinition(cmEditor, livelyCodeMirror, location, callback) {\n    const r = range(location)\n\n    try {\n      let data = await this.request({\n        query: {\n          type: \"definition\",\n          file: livelyCodeMirror.getTargetModule(),\n          end: r._end.asCM(),\n          start: undefined, // #TODO: improve by checking for selections first\n          lineCharPositions: true\n        },\n        files: [{\n          type: 'full',\n          name: livelyCodeMirror.getTargetModule(),\n          text: livelyCodeMirror.value\n        }]\n      });\n\n      // properties of response data\n      // [start, end, file, context, contextOffset, doc, url, origin]\n\n      if (data.file) {\n        return data;\n      } else {\n        return;\n      }\n    } catch(error) {\n      return;\n    }\n  }\n  static async jumpBack(cmEditor, livelyCodeMirror) {\n    jumpBack(cmEditor, livelyCodeMirror, this);\n  }\n  static async showReferences(cmEditor, livelyCodeMirror) {\n    let cursorPosition = cmEditor.getCursor();\n    let me = this;\n\n    try {\n      let response = await this.request({\n        query: {\n          type: \"refs\",\n          file: livelyCodeMirror.getTargetModule(),\n          end: cursorPosition,\n          start: undefined, // #TODO: improve by checking for selections first\n          lineCharPositions: true\n        },\n        files: [{\n          type: 'full',\n          name: livelyCodeMirror.getTargetModule(),\n          text: livelyCodeMirror.value\n        }],\n        //timeout: 10 * 1000\n      });\n      lively.success(response.name)\n      if(response.refs.length === 0) {\n        showError(cmEditor, 'No reference found.');\n        return;\n      }\n\n      if(response.type) {\n        lively.success(response.type, \"Variable Scope\");\n      }\n      cmEditor.showHint({\n        hint() {\n          return {\n            list: response.refs.map(ref => {\n              return {\n                text: '',\n                displayText: fileName.call(ref.file),\n                render(Element, self, data) {\n                  //console.warn(data, self);\n                  Element.appendChild(<span><strong>{ref.file}</strong>{\n                    response.type ? ' ('+response.type+') ' : ''}({\n                    ref.start.line}:{ref.start.ch}-{\n                    ref.end.line}:{ref.end.ch})</span>);\n                },\n                hint: () => me.moveTo(cmEditor, livelyCodeMirror, ref),\n                anwser: 42\n              };\n            }),\n            from: cursorPosition,\n            to: cursorPosition\n          };\n        },\n        alignWithWord: false\n      });\n    } catch(error) {\n      showError(cmEditor, error);\n    }\n\n  }\n\n\n  static async __temp__(cm) {\n    let ts = await this.ternServer();\n\n    //   server.addFile('https://lively-kernel.org/lively4/foo/foo.js', `\n    // import { a } from './x';\n    // var d = a();\n    // d;`);\n    //   server.addFile('src/client/reactive/tern-spike/a.js');\n    //   server.addFile('https://lively-kernel.org/lively4/foo/x', `\n    // export function a() {\n    //   return document.createElement('span');\n    // }`);\n\n    server.request({\n      query: {\n        type: \"definition\",\n        file: 'src/client/reactive/tern-spike/a.js',\n        end: {\n          line: 1,\n          ch: 11\n        },\n        lineCharPositions: true\n      },\n      //files: [],\n      //timeout: 10 * 1000\n    }, (error, response) => {\n      if(error) {\n        lively.error(error);\n        reject(error);\n      } else {\n        lively.notify(response, undefined, undefined, undefined, 'green');\n        resolve(response);\n      }\n    });\n  }\n}\n\n// ###############\n// Show Type Query\n// ###############\n\nfunction showContextInfo(cm, data) {\n  var tip = <span><strong>{data.type || 'not found'}</strong></span>;\n  if(data.doc) {\n    tip.appendChild(document.createTextNode(' - ' + data.doc));\n  }\n  if(data.url) {\n    tip.appendChild(document.createTextNode(' '));\n    tip.appendChild(<a href={data.url} target=\"_blank\">[docs]</a>);\n  }\n  tempTooltip(cm, tip);\n}\n\nfunction showError(cm, msg) {\n  tempTooltip(cm, String(msg));\n}\n\nfunction tempTooltip(cm, content) {\n  if (cm.state.ternTooltip) remove(cm.state.ternTooltip);\n  let { right, bottom } = cm.cursorCoords(undefined, 'local');\n  let tip = cm.state.ternTooltip = makeTooltip(right + 1, bottom, content);\n  cm.getWrapperElement().appendChild(tip);\n  let mouseOnTip = false;\n  let old = false;\n  function maybeClear() {\n    old = true;\n    if (!mouseOnTip) clear();\n  }\n  function clear() {\n    cm.state.ternTooltip = null;\n    if (!tip.parentNode) return;\n    cm.off(\"cursorActivity\", clear);\n    cm.off('blur', clear);\n    cm.off('scroll', clear);\n    fadeOut(tip);\n  }\n  CodeMirror.on(tip, 'mousemove', () => mouseOnTip = true);\n  CodeMirror.on(tip, 'mouseout', e => {\n    let targetElement = e.relatedTarget || e.toElement;\n    if (targetElement && !CodeMirror.contains(tip, targetElement)) {\n      if (old) {\n        clear();\n      } else {\n        mouseOnTip = false;\n      }\n    }\n  });\n  setTimeout(maybeClear, 1700);\n  cm.on(\"cursorActivity\", clear);\n  cm.on('blur', clear);\n  cm.on('scroll', clear);\n}\n\nfunction makeTooltip(x, y, content) {\n  var node = <div class=\"CodeMirror-Tern-tooltip\">{content}</div>;\n  node.style.left = x + 'px';\n  node.style.top = y + 'px';\n  return node;\n}\n\nfunction fadeOut(tooltip) {\n  tooltip.style.opacity = \"0\";\n  setTimeout(() => remove(tooltip), 1100);\n}\nfunction remove(node) {\n  var parent = node && node.parentNode;\n  if (parent) parent.removeChild(node);\n}\n\n// #####################################\n// Moving to the definition of something\n// #####################################\n\nfunction jumpBack(cmEditor, livelyCodeMirror, ternServerWrapper) {\n  let target = ternServerWrapper.jumpStack.pop();\n  if(target) {\n    ternServerWrapper.moveTo(cmEditor, livelyCodeMirror, target);\n  }\n}\n\nfunction atInterestingExpression(cm) {\n  var pos = cm.getCursor(\"end\"), tok = cm.getTokenAt(pos);\n  if (tok.start < pos.ch && tok.type == \"comment\") return false;\n  return /[\\w)\\]]/.test(cm.getLine(pos.line).slice(Math.max(pos.ch - 1, 0), pos.ch + 1));\n}\n"]}