{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-markus/src/components/widgets/lively-code-mirror-hint.js"],"names":["uniq","utils","javaScriptKeywords","cssProperties","domEvents","indentSelections","ColorHash","javascriptHint","forOrigin","colorForString","searchImports","lcmFromCM","stringProps","Object","getOwnPropertyNames","__proto__","arrayProps","funcProps","Pos","CodeMirror","cm","lively","allParents","getWrapperElement","undefined","find","e","tagName","importsCache","importsCacheTime","Date","now","fetch","lively4url","headers","searchpattern","rootdirs","replace","excludes","then","r","text","Completions","constructor","list","seenCompletions","Set","prepareToken","cursor","getCursor","token","getTokenAt","state","innerMode","getMode","type","start","end","ch","string","substring","test","slice","maybeAdd","completion","simple","has","startsWith","add","push","asCompletionsObject","length","line","completionsObject","from","to","on","element","parentElement","querySelector","classList","hints","querySelectorAll","forEach","hint","i","prepend","colorHash","saturation","lightness","str","hex","origin","assign","render","self","data","innerRender","append","displayText","CompletionsBuilder","completions","buildHint","options","collectCompletions","getLine","completeFromImport","map","property","completeLively","completeDoItCommand","completeFromTern","variables","startExpr","lineNumber","firstLine","whileLoop","tokens","getLineTokens","filter","t","reverse","parensBalance","includes","code","getRange","console","warn","decls","uniqueVariables","codeMirrorDecls","some","vari","babelDecls","split","finalCode","join","value","isError","codemirror","boundEval","gatherCompletionsForObject","tprop","getToken","context","completeMembersOfThis","global","globalScope","window","obj","pop","base","indexOf","additionalContext","useGlobalScope","jQuery","_","c","prevToken","prevPrevToken","completeUtilsFunctions","v","localVars","next","name","w","globalVars","keyword","hintPrefix","allProps","forPropList","Array","Function","propList","o","getPrototypeOf","prop","addObjectProp","descriptor","getOwnPropertyDescriptor","toString","first","args","parseArgsFrom","completeFunction","commands","indentAuto","n","nodeType","traverseAsAST","path","params","get","param","isIdentifier","node","arg","traverse","Identifier","currentClass","eachLine","lineHandle","classMatch","match","modifiers","argsAndBodyStart","myClass","grayish","content","style","replaceRange","getCompletionsFromImports","imports","ea","sort","keys","utilFuncName","offset","lines","getValue","funcs","setValue","prefix","setCursor","autocomplete","setSelection","replaceSelection","startLine","Infinity","lcm","tw","ternWrapper","fileName","getTargetModule","request","query","types","file","depths","docs","urls","origins","caseInsensitive","guess","expandWordForward","omitObjectPrototype","includeKeywords","inLiteral","lineCharPositions","files","parseArgsFromTernType","findMatchingParen","matches","matchAll","char","index","openParens","error","argsString","argWithType","funcName","firstArg","rest","registerHelper"],"mappings":"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","file":"lively-code-mirror-hint.js","sourcesContent":["import { uniq } from \"utils\";\n\nvar stringProps = Object.getOwnPropertyNames(''.__proto__);\nvar arrayProps = Object.getOwnPropertyNames([].__proto__);\nvar funcProps = Object.getOwnPropertyNames(function () {}.__proto__);\nimport { javaScriptKeywords, cssProperties, domEvents } from 'src/client/constants.js';\n\nimport * as utils from \"utils\";\nimport { indentSelections } from \"./code-mirror-utils.js\";\n\nvar Pos = CodeMirror.Pos;\n\nfunction lcmFromCM(cm) {\n  return lively.allParents(cm.getWrapperElement(), undefined, true).find(e => e.tagName === 'LIVELY-CODE-MIRROR');\n}\n\n/*MD # Import MD*/\nvar importsCache;\nvar importsCacheTime;\nasync function searchImports() {\n  if (!importsCache || Date.now() - importsCacheTime > 60 * 60 * 1000) {\n    importsCacheTime = Date.now();\n    importsCache = await fetch(lively4url + \"/../_search/files\", {\n      headers: {\n        searchpattern: \"^import\",\n        rootdirs: lively4url.replace(/.*\\//, \"\"),\n        excludes: \"node_modules,src/external,vendor/,lodash-bound.js\"\n      } }).then(r => r.text());\n  }\n  return importsCache;\n}\nsearchImports();\n\n/*MD # Completions MD*/\nclass Completions {\n\n  constructor(cm) {\n    this.cm = cm;\n    this.list = [];\n    this.seenCompletions = new Set();\n    this.prepareToken();\n  }\n\n  prepareToken() {\n    const cm = this.cm;\n\n    // Find the token at the cursor\n    var cursor = cm.getCursor();\n    var token = cm.getTokenAt(cursor);\n\n    token.state = CodeMirror.innerMode(cm.getMode(), token.state).state;\n\n    // lively.notify(token.string, token.type);\n    if (token.type === 'string') {\n      token = {\n        start: token.start + 1,\n        end: cursor.ch,\n        string: token.string.substring(1, cursor.ch - token.start),\n        state: token.state,\n        type: 'string'\n      };\n    } else if (!/^[\\w$_]*$/.test(token.string)) {\n      // If it's not a 'word-style' token, ignore the token.\n      token = {\n        start: cursor.ch,\n        end: cursor.ch,\n        string: \"\",\n        state: token.state,\n        type: token.string == \".\" ? \"property\" : null\n      };\n    } else if (token.end > cursor.ch) {\n      token.end = cursor.ch;\n      token.string = token.string.slice(0, cursor.ch - token.start);\n    }\n\n    this.token = token;\n  }\n\n  maybeAdd(completion) {\n    const simple = typeof completion === 'string';\n    const text = simple ? completion : completion.text;\n\n    if (this.seenCompletions.has(text)) {\n      return;\n    }\n\n    // #TODO: getTextAt(from, to) or string iff no from/to in completion\n    if (!text.startsWith(this.token.string)) {\n      return;\n    }\n\n    this.seenCompletions.add(text);\n    this.list.push(completion);\n  }\n\n  asCompletionsObject() {\n    if (this.list.length === 0) {\n      return;\n    }\n\n    const line = this.cm.getCursor().line;\n    const completionsObject = {\n      list: this.list,\n      from: Pos(line, this.token.start),\n      to: Pos(line, this.token.end)\n    };\n\n    CodeMirror.on(completionsObject, \"shown\", () => {\n      // lively.warn(\"shown\");\n    });\n    CodeMirror.on(completionsObject, \"select\", (completion, element) => {\n      if (!element.parentElement.querySelector('li.shortcut-present')) {\n        element.classList.add('shortcut-present');\n        const hints = element.parentElement.querySelectorAll('li.CodeMirror-hint');\n        hints.forEach((hint, i) => {\n          if (i > 9) {\n            return;\n          }\n          hint.prepend(<span style=\"position: absolute; transform: translate(-6px, 0); font-size: xx-small; color: darkgray; background: white;\">{i}</span>);\n        });\n      }\n    });\n    CodeMirror.on(completionsObject, \"pick\", completion => {\n      // lively.warn(\"pick\");\n    });\n    CodeMirror.on(completionsObject, \"close\", () => {\n      // lively.warn(\"close\");\n    });\n\n    return completionsObject;\n  }\n}\nimport ColorHash from 'src/external/color-hash.js';\nconst colorHash = new ColorHash({ saturation: 0.8, lightness: 0.8 });\n\nfunction colorForString(str) {\n  return colorHash.hex(str);\n}\n\nfunction forOrigin(completion, origin) {\n  if (typeof completion === 'string') {\n    completion = {\n      text: completion\n    };\n  }\n\n  return Object.assign({\n    render(element, self, data) {\n      if (completion.innerRender) {\n        completion.innerRender(element, self, data);\n      } else {\n        element.append(<span>{completion.displayText || completion.text}</span>);\n      }\n      element.append(<span style=\"display: inline-block; width: 50px;\"></span>);\n      element.append(<span style={`background: ${colorForString(origin)}; color: black; position: absolute; right: 2px; font-size: x-small;`}>{origin}</span>);\n    }\n  }, completion);\n}\n\n/*MD # CompletionsBuilder MD*/\nclass CompletionsBuilder {\n\n  constructor(cm) {\n    this.cm = cm;\n    this.completions = new Completions(cm);\n  }\n\n  maybeAdd(str) {\n    this.completions.maybeAdd(str);\n  }\n\n  async buildHint(options) {\n    await this.collectCompletions(options\n\n    // lively.notify(this.completions.list.length, 'num completions');\n    );return this.completions.asCompletionsObject();\n  }\n\n  async collectCompletions(options) {\n    const cm = this.cm;\n    const completions = this.completions;\n\n    var cursor = cm.getCursor();\n\n    const line = cm.getLine(cursor.line);\n    if (line.startsWith(\"import\")) {\n      await this.completeFromImport(cm);\n      return;\n    }\n\n    var token = completions.token;\n    // lively.notify('type: ' + token.type, 'string: ' + token.string);\n\n    if (token.type === 'string') {\n      cssProperties.map(property => forOrigin(property, 'cssProperties')).forEach(::this.maybeAdd);\n      domEvents.map(property => forOrigin(property, 'domEvents')).forEach(::this.maybeAdd);\n      return;\n    }\n\n    if (token.type === 'comment') {\n      return;\n    }\n\n    this.completeLively();\n    this.completeDoItCommand();\n\n    await this.completeFromTern();\n\n    if (token.type === 'property') {\n      const variables = [];\n      const startExpr = {};\n\n      let lineNumber = cursor.line;\n      let firstLine = true;\n      whileLoop: while (lineNumber >= 0) {\n        let tokens;\n        tokens = cm.getLineTokens(lineNumber, true);\n        if (firstLine) {\n          firstLine = false;\n          tokens = tokens.filter(t => t.start < token.start);\n        }\n        tokens = tokens.reverse();\n\n        let parensBalance = 0;\n\n        for (let { string, type, start } of tokens) {\n          // console.log( string, type, start )\n          if (type === null && string === '(') {\n            parensBalance--;\n          } else if (type === null && string === ')') {\n            parensBalance++;\n          } else if (typeof type === 'string' && type.includes('variable')) {\n            variables.push(string);\n            if (parensBalance <= 0) {\n              startExpr.ch = start;\n              startExpr.line = lineNumber;\n              break whileLoop;\n            }\n          }\n        }\n        lineNumber--;\n      }\n\n      let code;\n      // lively.notify(variables, 'variables')\n      try {\n        code = cm.getRange(startExpr, { line: cursor.line, ch: token.start - 1 });\n      } catch (e) {\n        console.warn(\"Error in code-mirror-hint, could not comlete, because: \", e);\n        return;\n      }\n\n      const decls = [];\n\n      // lively.getGlobalBounds(document.body)\n      //   .topLeft().subPt(pt(-10, 0)).x.rFOOOOOO\n\n      const uniqueVariables = new Set(variables);\n\n      decls.push(`var decls = await System.import('src/components/widgets/lively-code-mirror-hint-decls.js');`);\n      const codeMirrorDecls = 'cm, lcm';\n      if (['cm', 'lcm'].some(vari => uniqueVariables.has(vari))) {\n        decls.push(`var { cm, lcm } = await decls.codeMirror();`);\n      }\n      const babelDecls = 'babel, t, template, path, parentPath, node, parentNode, identifier, scope, binding';\n      if (babelDecls.split(', ').some(vari => uniqueVariables.has(vari))) {\n        decls.push(`var { ${babelDecls} } = await decls.babel();`);\n      }\n      const finalCode = `(async () => {\ntry {\n${decls.join(`;\n`)}\nreturn ${code}\n} catch(e) {}\n})()`;\n\n      var { value, isError } = await options.codemirror.boundEval(finalCode);\n      if (isError) {\n        lively.warn(value);\n      } else {\n        value = await value;\n        this.gatherCompletionsForObject(value, 'x');\n      }\n    }\n\n    var tprop = token;\n    const getToken = ::cm.getTokenAt;\n    // If it is a property, find out what it is a property of.\n    while (tprop.type == \"property\") {\n      tprop = getToken(Pos(cursor.line, tprop.start));\n      if (tprop.string != \".\") {\n        break;\n      }\n      tprop = getToken(Pos(cursor.line, tprop.start));\n      if (!context) {\n        var context = [];\n      }\n      context.push(tprop);\n    }\n\n    if (context && context.length === 1 && context[0].string === 'this') {\n      this.completeMembersOfThis();\n    }\n\n    var global = options && options.globalScope || window;\n\n    if (context && context.length) {\n      // If this is a property, see if it belongs to some object we can\n      // find in the current environment.\n      var obj = context.pop(),\n          base;\n\n      if (obj.type && obj.type.indexOf(\"variable\") === 0 || obj.string == \"this\") {\n        if (options && options.additionalContext) base = options.additionalContext[obj.string];\n\n        if (base === undefined && obj && obj.string) {\n          // #TODO instead of doing a blackbox evaluation of a string, we could look into the various scopes... \n          // in the module or live prgoramming data structures... e.g. from AST with trace data such as #ContinuousEditor\n          // documentation: getDoitContext() and getTargetModule()\n          var { value, isError } = await options.codemirror.boundEval(obj.string);\n          if (!isError) {\n            base = value;\n          }\n        }\n        if (!options || options.useGlobalScope !== false) {\n          base = base || global[obj.string];\n        }\n      } else if (obj.type == \"string\") {\n        base = \"\";\n      } else if (obj.type == \"atom\") {\n        base = 1;\n      } else if (obj.type == \"function\") {\n\n        // #TODO make it work for function calls such as pt(10,10), too.... \n        if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') && typeof global.jQuery == 'function') {\n          base = global.jQuery();\n        } else if (global._ != null && obj.string == '_' && typeof global._ == 'function') {\n          base = global._();\n        };\n      }\n      while (base != null && context.length) base = base[context.pop().string];\n      if (base != null) this.gatherCompletionsForObject(base);\n      return;\n    }\n\n    const c = cm.getCursor();\n    const prevToken = cm.getTokenAt({ line: c.line, ch: token.start - 0 });\n    const prevPrevToken = cm.getTokenAt({ line: c.line, ch: token.start - 1 });\n    if (prevToken.string == \":\" && prevPrevToken.string == \":\") {\n      this.completeUtilsFunctions(token);\n      return;\n    }\n\n    // If not, just look in the global object and any local scope\n    // (reading into JS mode internals to get at the local and global variables)\n\n    for (var v = token.state.localVars; v; v = v.next) {\n      this.maybeAdd(forOrigin(v.name, 'local'));\n    }\n    for (var w = token.state.globalVars; w; w = w.next) {\n      this.maybeAdd(forOrigin(w.name, 'global'));\n    }\n    if (!options || options.useGlobalScope !== false) {\n      this.gatherCompletionsForObject(global);\n    }\n\n    javaScriptKeywords.map(keyword => forOrigin(keyword + ' ', 'keyword')).forEach(::this.maybeAdd);\n  }\n\n  /*MD ## Completions for an Object MD*/\n  gatherCompletionsForObject(obj, hintPrefix = '') {\n    this.allProps(obj, hintPrefix);\n\n    if (typeof obj == \"string\") {\n      this.forPropList(stringProps, hintPrefix + 'str');\n    } else if (obj instanceof Array) {\n      this.forPropList(arrayProps, hintPrefix + 'arr');\n    } else if (obj instanceof Function) {\n      this.forPropList(funcProps, hintPrefix + 'fun');\n    }\n  }\n\n  forPropList(propList, origin) {\n    propList.map(name => forOrigin(name, origin)).forEach(::this.maybeAdd);\n  }\n\n  allProps(obj, hintPrefix) {\n    for (var o = obj; o; o = Object.getPrototypeOf(o)) {\n      Object.getOwnPropertyNames(o).forEach(prop => this.addObjectProp(o, prop, hintPrefix));\n    }\n  }\n\n  addObjectProp(obj, prop, hintPrefix) {\n    let completion = prop;\n    const descriptor = Object.getOwnPropertyDescriptor(obj, prop);\n    let value = descriptor.value;\n\n    if (value) {\n      if (typeof value === 'function') {\n        let str = value.toString().split('\\n').first.substring(0, 50);\n        completion = {\n          text: prop,\n          innerRender(element, self, data) {\n            element.append(<span>{prop} <span style=\"color: rgba(200, 200, 200, 0.9)\">{str}</span></span>);\n          },\n          hint: (cm, self, data) => {\n            const args = this.parseArgsFrom(`const fn = ${value}`, 'FunctionExpression') || this.parseArgsFrom(`class C {${value}}`, 'ClassMethod') || [];\n\n            this.completeFunction(cm, self, data, prop, args);\n            CodeMirror.commands.indentAuto(cm);\n          }\n        };\n        this.maybeAdd(forOrigin(completion, hintPrefix + 'prop'));\n        return;\n      } else if (value.toString) {\n        value = value.toString().substring(0, 50);\n      }\n      lively.n;\n      completion = {\n        text: prop,\n        innerRender(element, self, data) {\n          element.append(<span>{prop} <span style=\"color: rgba(200, 200, 200, 0.9)\">{value}</span></span>);\n        }\n      };\n    } else {}\n\n    this.maybeAdd(forOrigin(completion, hintPrefix + 'prop'));\n  }\n\n  parseArgsFrom(code, nodeType) {\n    const args = [];\n    try {\n      code.traverseAsAST({\n        [nodeType](path) {\n          const params = path.get('params');\n          params.forEach(param => {\n            if (param.isIdentifier()) {\n              args.push(param.node.name);\n            } else {\n              // RestElement, Patterns\n              let arg = '';\n              param.traverse({\n                Identifier(path) {\n                  arg += path.node.name;\n                }\n              });\n              args.push(arg);\n            }\n          });\n        }\n      });\n      return args;\n    } catch (e) {}\n  }\n\n  /*MD ## Specific Completions MD*/\n  completeMembersOfThis() {\n    let currentClass;\n    this.cm.eachLine(lineHandle => {\n      const classMatch = lineHandle.text.match(/^(?:\\s|export\\s|default\\s)*class\\s+([_$a-zA-z][_$a-zA-Z0-9]*).*\\{$/);\n      if (classMatch) {\n        currentClass = classMatch[1];\n        // lively.notify(Object.getOwnPropertyNames(lineHandle));\n        return;\n      }\n\n      const firstLine = lineHandle.text;\n      const match = firstLine.match(/^\\s*((?:async\\s|get\\s|set\\s|static\\s)*)([_$a-zA-z][_$a-zA-Z0-9]*)(\\*?\\s*\\(.*\\)\\s*\\{)$/);\n      if (match) {\n        const [, modifiers, name, argsAndBodyStart] = match;\n        if (javaScriptKeywords.includes(name) || name === 'constructor') {\n          return;\n        }\n\n        const myClass = currentClass;\n        const completion = {\n          text: name,\n          innerRender(element, self, data) {\n            function grayish(content) {\n              const style = \"color: rgba(200, 200, 200, 0.9); display:inline-block; max-width: 50ch;\";\n              return <span style={style}>{content}</span>;\n            }\n            element.append(<span>{grayish(modifiers + (myClass ? myClass + '::' : ''))}{name}{grayish(argsAndBodyStart)}</span>);\n          },\n          hint: (cm, self, data) => {\n            if (modifiers.includes('get') || modifiers.includes('set')) {\n              cm.replaceRange(data.text, self.from, self.to);\n            } else {\n              const args = this.parseArgsFrom(`class C {${firstLine}}}`, 'ClassMethod') || [];\n              this.completeFunction(cm, self, data, name, args);\n            }\n            CodeMirror.commands.indentAuto(cm);\n          }\n        };\n        // lively.notify(name);\n        this.maybeAdd(forOrigin(completion, 'member'));\n      }\n    });\n  }\n\n  async completeFromImport(cm) {\n    const getCompletionsFromImports = async () => {\n      // #TODO make faster with index and caching\n      // but: #TODO what is the workflox / programming XP, we aim for?\n      var text = await searchImports();\n      var imports = text.split(\"\\n\").map(ea => ea.replace(/.*:/, \"\").replace(/;$/, \"\").replace(/\"/g, \"'\")).filter(ea => !ea.match('\\'\\.\\.?/')).filter(ea => ea.startsWith(\"import \")).sort()::uniq();\n      imports.map(i => forOrigin(i, 'import')).forEach(::this.maybeAdd);\n    };\n\n    const getToken = ::cm.getTokenAt;\n\n    // Find the token at the cursor\n    var cursor = cm.getCursor();\n    var token = getToken(cursor);\n\n    // use a \"line\" token\n    this.completions.token = {\n      start: 0,\n      end: cursor.ch,\n      string: cm.getLine(cursor.line),\n      state: token.state,\n      type: null\n    };\n\n    await getCompletionsFromImports();\n  }\n\n  completeUtilsFunctions(token) {\n    Object.keys(utils).filter(ea => ea.startsWith(token.string)).forEach(utilFuncName => {\n      const completion = {\n        text: utilFuncName,\n        displayText: \"util.\" + utilFuncName,\n        hint: (cm, self, data) => {\n          var offset = 0;\n          cm.replaceRange(utilFuncName + \"()\", self.from, self.to);\n          var lines = cm.getValue().split(\"\\n\");\n          var imports = lines.filter(ea => ea.match(/^import .*from ['\"]utils['\"];?/));\n          if (!imports.find(ea => ea.match(utilFuncName))) {\n            var utils = imports.find(ea => ea.match(/import {.*} from 'utils';/));\n            if (utils) {\n              var funcs = utils.replace(/.*{ */, \"\").replace(/ *}.*/, \"\").split(/ *, */);\n              funcs.push(utilFuncName);\n              lines = lines.map(ea => ea == utils ? `import { ${funcs.sort().join(\", \")} } from 'utils';` : ea);\n              cm.setValue(lines.join(\"\\n\"));\n            } else {\n              var prefix = `import { ${utilFuncName} } from 'utils';\\n`;\n              cm.setValue(prefix + cm.getValue());\n              offset += 1;\n            }\n          }\n          cm.setCursor({ line: self.from.line + offset, ch: self.from.ch + utilFuncName.length + \"(\".length });\n        }\n      };\n\n      this.completions.maybeAdd(forOrigin(completion, 'utils'));\n    });\n  }\n\n  completeLively() {\n    if (['variable', null].includes(this.completions.token.type)) {\n      this.maybeAdd({\n        text: 'lively.',\n        hint: (cm, self, data) => {\n          cm.replaceRange(\"lively.\", self.from, self.to);\n          CodeMirror.commands.indentAuto(cm);\n          CodeMirror.commands.autocomplete(cm);\n        }\n      });\n    }\n  }\n\n  completeDoItCommand() {\n    const token = this.completions.token;\n    const str = token.string;\n    const cm = this.cm;\n    var cursor = cm.getCursor();\n\n    if (str.length >= 1 && 'DoItCommand'.startsWith(str)) {\n      var tprop = token;\n      const getToken = ::cm.getTokenAt;\n      if (token.type == \"variable\") {\n        const { type, string, start } = getToken(Pos(cursor.line, tprop.start));\n        if (type === null && string === ' ') {\n          const { type, string } = getToken(Pos(cursor.line, start));\n          if (type === 'keyword' && string === 'new') {\n\n            this.maybeAdd({\n              text: 'DoItCommand(args)',\n              hint: async (cm, self, data) => {\n                cm.setSelection(self.from, self.to);\n                cm.replaceSelection(`DoItCommand({\n  do: () => {\n    \n  },\n  undo: () => {\n    \n  },\n  redo: () => {\n    \n  }\n})`, 'around');\n                cm::indentSelections();\n                const startLine = cm.getCursor('start').line;\n                cm.setCursor(startLine + 2, Infinity);\n                CodeMirror.commands.autocomplete(cm);\n              }\n            });\n          }\n        }\n      }\n    }\n  }\n\n  /*MD ## Tern Integration MD*/\n  async completeFromTern() {\n    const lcm = lcmFromCM(this.cm);\n    const tw = await lcm.ternWrapper;\n    const fileName = lcm.getTargetModule();\n    const data = await tw.request({\n      query: {\n        type: \"completions\",\n        types: true,\n        file: fileName,\n        end: this.cm.getCursor(),\n        depths: true,\n        docs: true,\n        urls: true,\n        origins: true,\n        filter: false,\n        caseInsensitive: false,\n        guess: false,\n        sort: false,\n        expandWordForward: true,\n        omitObjectPrototype: true,\n        includeKeywords: false,\n        inLiteral: true,\n        start: undefined, // #TODO: improve by checking for selections first\n        lineCharPositions: true\n      },\n      files: [{\n        type: 'full',\n        name: fileName,\n        text: lcm.value\n      }]\n    });\n\n    data.completions.map(({ name, type }) => forOrigin(type && type !== '?' ? {\n      text: name,\n      innerRender(element, self, data) {\n        element.append(<span>{name} <span style=\"color: rgba(200, 200, 200, 0.9); display:inline-block; max-width: 50ch;\">{type}</span></span>);\n      },\n      hint: (cm, self, data) => {\n        if (type.startsWith('fn(') && !/^[A-Z]/.test(name)) {\n          const parseArgsFromTernType = str => {\n\n            const findMatchingParen = (str, start) => {\n              str = str.substring(start);\n\n              const matches = [...str.matchAll(/[()]/g)].map(match => ({ char: match[0], index: match.index }));\n\n              let openParens = 1;\n\n              for (let match of matches) {\n                const { char, index } = match;\n\n                if (char === '(') {\n                  openParens++;\n                } else if (char === ')') {\n                  openParens--;\n                  if (openParens === 0) {\n                    return index + start;\n                  }\n                } else {\n                  lively.error(`parseFnFromTern: match ${char} at position ${index} should never happen`);\n                }\n              }\n\n              return -1;\n            };\n\n            const start = str.indexOf('(') + 1;\n            const end = findMatchingParen(str, start);\n            const argsString = str.substring(start, end);\n            return argsString.split(', ').map(argWithType => argWithType.replace(/:.*/gm, ''));\n          };\n\n          this.completeFunction(cm, self, data, data.text, parseArgsFromTernType(type));\n        } else {\n          cm.replaceRange(data.text, self.from, self.to);\n        }\n        CodeMirror.commands.indentAuto(cm);\n      }\n\n    } : name, 'tern')).forEach(::this.maybeAdd);\n  }\n\n  /*MD ## Performing Completions MD*/\n  completeFunction(cm, self, data, funcName, args = []) {\n    cm.replaceRange(funcName + '(', self.from, self.to);\n    cm.replaceSelection(')', 'start');\n\n    const [firstArg, ...rest] = args;\n    if (rest.length > 0) {\n      cm.replaceSelection(', ' + rest.join(', '), 'start');\n    }\n    if (firstArg) {\n      cm.replaceSelection(firstArg, 'around');\n    }\n  }\n\n}\n\nfunction javascriptHint(cm, options) {\n  return new CompletionsBuilder(cm).buildHint(options);\n}\n\nCodeMirror.registerHelper(\"hint\", \"javascript\", javascriptHint);"]}