{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-drawio/src/components/widgets/lively-code-mirror-hint.js"],"names":["scriptHint","editor","keywords","getToken","options","cur","getCursor","token","firstTokenInLine","line","string","list","start","end","ch","getLine","state","type","from","to","test","CodeMirror","innerMode","getMode","slice","tprop","context","push","javascriptHint","javascriptKeywords","e","getTokenAt","getCoffeeScriptToken","charAt","replace","coffeescriptHint","coffeescriptKeywords","forAllProps","obj","callback","Object","getOwnPropertyNames","getPrototypeOf","name","o","forEach","getCompletions","found","global","globalScope","window","maybeAdd","str","lastIndexOf","includes","gatherCompletions","Array","Function","completeUtilsFunctions","keys","utils","filter","ea","startsWith","utilFuncName","text","displayText","hint","cm","self","data","offset","replaceRange","lines","getValue","split","imports","match","find","funcs","map","sort","join","setValue","prefix","setCursor","length","pop","base","indexOf","additionalContext","undefined","result","codemirror","boundEval","value","useGlobalScope","jQuery","_","uniq","prevToken","prevPrevToken","v","localVars","next","globalVars","searchImports","importsCache","Date","now","importsCacheTime","fetch","lively4url","headers","then","r","Pos","registerHelper","stringProps","arrayProps","funcProps"],"mappings":"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","file":"lively-code-mirror-hint.js","sourcesContent":["/* JavaScript Hint */\n\nimport {uniq} from \"utils\"\n\nimport * as utils from \"utils\"\n\nvar Pos = CodeMirror.Pos;\n\nasync function scriptHint(editor, keywords, getToken, options) {\n  // Find the token at the cursor\n  var cur = editor.getCursor(), token = getToken(editor, cur);\n\n  // lively.notify('hint ' + cur.ch)\n  var firstTokenInLine = getToken(editor, Pos(cur.line, 1)) \n  if (firstTokenInLine.string == \"import\") {\n    return {list: await getCompletions(\n      {start: 9, end: cur.ch, string: editor.getLine(cur.line), state: token.state, type: null}, \n      null, keywords, options),\n          from: Pos(cur.line, 0),\n          to: Pos(cur.line, cur.ch)};\n  }\n  \n  if (/\\b(?:string|comment)\\b/.test(token.type)) return;\n  token.state = CodeMirror.innerMode(editor.getMode(), token.state).state;\n\n  // If it's not a 'word-style' token, ignore the token.\n  if (!/^[\\w$_]*$/.test(token.string)) {\n    token = {start: cur.ch, end: cur.ch, string: \"\", state: token.state,\n             type: token.string == \".\" ? \"property\" : null};\n  } else if (token.end > cur.ch) {\n    token.end = cur.ch;\n    token.string = token.string.slice(0, cur.ch - token.start);\n  }\n\n  var tprop = token;\n  // If it is a property, find out what it is a property of.\n  while (tprop.type == \"property\") {\n    tprop = getToken(editor, Pos(cur.line, tprop.start));\n    if (tprop.string != \".\") return;\n    tprop = getToken(editor, Pos(cur.line, tprop.start));\n    if (!context) var context = [];\n    context.push(tprop);\n  }\n  return {list: await getCompletions(token, context, keywords, options),\n          from: Pos(cur.line, token.start),\n          to: Pos(cur.line, token.end)};\n}\n\nfunction javascriptHint(editor, options) {\n  return scriptHint(editor, javascriptKeywords,\n                    function (e, cur) {return e.getTokenAt(cur);},\n                    options);\n};\nCodeMirror.registerHelper(\"hint\", \"javascript\", javascriptHint);\n\nfunction getCoffeeScriptToken(editor, cur) {\n// This getToken, it is for coffeescript, imitates the behavior of\n// getTokenAt method in javascript.js, that is, returning \"property\"\n// type and treat \".\" as indepenent token.\n  var token = editor.getTokenAt(cur);\n  if (cur.ch == token.start + 1 && token.string.charAt(0) == '.') {\n    token.end = token.start;\n    token.string = '.';\n    token.type = \"property\";\n  }\n  else if (/^\\.[\\w$_]*$/.test(token.string)) {\n    token.type = \"property\";\n    token.start++;\n    token.string = token.string.replace(/\\./, '');\n  }\n  return token;\n}\n\nfunction coffeescriptHint(editor, options) {\n  return scriptHint(editor, coffeescriptKeywords, getCoffeeScriptToken, options);\n}\nCodeMirror.registerHelper(\"hint\", \"coffeescript\", coffeescriptHint);\n\nvar stringProps = (\"charAt charCodeAt indexOf lastIndexOf substring substr slice trim trimLeft trimRight \" +\n                   \"toUpperCase toLowerCase split concat match replace search\").split(\" \");\nvar arrayProps = (\"length concat join splice push pop shift unshift slice reverse sort indexOf \" +\n                  \"lastIndexOf every some filter forEach map reduce reduceRight \").split(\" \");\nvar funcProps = \"prototype apply call bind\".split(\" \");\nvar javascriptKeywords = (\"async await break case catch continue debugger default delete do else false finally for function \" +\n                \"if in instanceof new null return switch throw true try typeof var void while with\").split(\" \");\nvar coffeescriptKeywords = (\"and break catch class continue delete do else extends false finally for \" +\n                \"if in instanceof isnt new no not null of off on or return switch then throw true try typeof until void while with yes\").split(\" \");\n\nfunction forAllProps(obj, callback) {\n  if (!Object.getOwnPropertyNames || !Object.getPrototypeOf) {\n    for (var name in obj) callback(name)\n  } else {\n    for (var o = obj; o; o = Object.getPrototypeOf(o))\n      Object.getOwnPropertyNames(o).forEach(callback)\n  }\n}\n\nasync function getCompletions(token, context, keywords, options) {\n  var found = [], start = token.string, global = options && options.globalScope || window;\n  \n  // options.additionalContext = {\n  //   that: that,\n  //   \"this\": that\n  // }\n  \n  keywords.push(\"import\") //  #TODO move to right place  \n  \n  function maybeAdd(str) {\n    if (str.lastIndexOf(start, 0) == 0 && !found.includes(str)) found.push(str);\n  }\n  \n  function gatherCompletions(obj) {\n    if (typeof obj == \"string\") stringProps.forEach(maybeAdd);\n    else if (obj instanceof Array) arrayProps.forEach(maybeAdd);\n    else if (obj instanceof Function) funcProps.forEach(maybeAdd);\n    forAllProps(obj, maybeAdd)\n  }\n\n  function completeUtilsFunctions() {\n    Object.keys(utils).filter(ea => ea.startsWith(token.string)).forEach(utilFuncName => {\n      found.push({\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\n            .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 ?  \n                  `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  }\n  \n  if (context && context.length) {\n    \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(), base;\n    \n    if (obj.type && obj.type.indexOf(\"variable\") === 0) {\n      if (options && options.additionalContext)\n        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 result =  (await options.codemirror.boundEval(obj.string))\n        base = result.value\n      }\n      \n      if (!options || options.useGlobalScope !== false)\n        base = base || global[obj.string];\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 funciton calls such as pt(10,10), too.... \n      \n      if (global.jQuery != null && (obj.string == '$' || obj.string == 'jQuery') &&\n          (typeof global.jQuery == 'function'))\n        base = global.jQuery();\n      else if (global._ != null && (obj.string == '_') && (typeof global._ == 'function'))\n        base = global._();\n    }\n    while (base != null && context.length)\n      base = base[context.pop().string];\n    if (base != null) gatherCompletions(base);\n  } else {       \n    if (token.string && (token.string == \"import\" || token.string.startsWith(\"import \"))) {\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\")\n        .map(ea => ea.replace(/.*:/,\"\").replace(/;$/,\"\").replace(/\"/g,\"'\"))\n          .filter(ea => !ea.match('\\'\\.\\.?/'))\n        .filter(ea => ea.startsWith(\"import \")).sort()::uniq();\n      imports.forEach(maybeAdd)\n    } else {\n      let editor = options.codemirror.editor,\n        cur = editor.getCursor(),\n        prevToken = editor.getTokenAt({line: cur.line, ch: token.start - 0  }),\n        prevPrevToken = editor.getTokenAt({line: cur.line, ch: token.start - 1});\n      if ( prevToken.string == \":\" && prevPrevToken.string == \":\") {\n        completeUtilsFunctions()\n      } else {\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        for (var v = token.state.localVars; v; v = v.next) maybeAdd(v.name);\n        for (var v = token.state.globalVars; v; v = v.next) maybeAdd(v.name);\n        if (!options || options.useGlobalScope !== false)\n          gatherCompletions(global);\n        keywords.forEach(maybeAdd);              \n      }\n    }\n    \n  }\n  return found;\n}\n\n\n\nvar importsCache\nvar importsCacheTime\n\nasync function searchImports() {\n\n  if (!importsCache || (Date.now() - importsCacheTime) > 5 * 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}\n\n// lively.bench(() => searchImports())\n\n"]}