{"version":3,"sources":["https://lively-kernel.org/lively4/lively4-constraints/src/components/widgets/lively-code-mirror-hint.js"],"names":["uniq","utils","Pos","CodeMirror","scriptHint","editor","keywords","getToken","options","cur","getCursor","token","firstTokenInLine","line","string","list","getCompletions","start","end","ch","getLine","state","type","from","to","test","innerMode","getMode","slice","tprop","context","push","javascriptHint","javascriptKeywords","e","getTokenAt","registerHelper","getCoffeeScriptToken","charAt","replace","coffeescriptHint","coffeescriptKeywords","stringProps","split","arrayProps","funcProps","forAllProps","obj","callback","Object","getOwnPropertyNames","getPrototypeOf","name","o","forEach","found","global","globalScope","window","maybeAdd","str","lastIndexOf","includes","gatherCompletions","Array","Function","completeUtilsFunctions","keys","filter","ea","startsWith","utilFuncName","text","displayText","hint","cm","self","data","offset","replaceRange","lines","getValue","imports","match","find","funcs","map","sort","join","setValue","prefix","setCursor","length","pop","base","indexOf","additionalContext","undefined","result","codemirror","boundEval","value","useGlobalScope","jQuery","_","searchImports","prevToken","prevPrevToken","v","localVars","next","globalVars","importsCache","importsCacheTime","Date","now","fetch","lively4url","headers","then","r"],"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"]}