{"version":3,"file":"oz-hv8iHpBf.cjs","sources":["../../../node_modules/@codemirror/legacy-modes/mode/oz.js"],"sourcesContent":["function wordRegexp(words) {\n  return new RegExp(\"^((\" + words.join(\")|(\") + \"))\\\\b\");\n}\n\nvar singleOperators = /[\\^@!\\|<>#~\\.\\*\\-\\+\\\\/,=]/;\nvar doubleOperators = /(<-)|(:=)|(=<)|(>=)|(<=)|(<:)|(>:)|(=:)|(\\\\=)|(\\\\=:)|(!!)|(==)|(::)/;\nvar tripleOperators = /(:::)|(\\.\\.\\.)|(=<:)|(>=:)/;\n\nvar middle = [\"in\", \"then\", \"else\", \"of\", \"elseof\", \"elsecase\", \"elseif\", \"catch\",\n              \"finally\", \"with\", \"require\", \"prepare\", \"import\", \"export\", \"define\", \"do\"];\nvar end = [\"end\"];\n\nvar atoms = wordRegexp([\"true\", \"false\", \"nil\", \"unit\"]);\nvar commonKeywords = wordRegexp([\"andthen\", \"at\", \"attr\", \"declare\", \"feat\", \"from\", \"lex\",\n                                 \"mod\", \"div\", \"mode\", \"orelse\", \"parser\", \"prod\", \"prop\", \"scanner\", \"self\", \"syn\", \"token\"]);\nvar openingKeywords = wordRegexp([\"local\", \"proc\", \"fun\", \"case\", \"class\", \"if\", \"cond\", \"or\", \"dis\",\n                                  \"choice\", \"not\", \"thread\", \"try\", \"raise\", \"lock\", \"for\", \"suchthat\", \"meth\", \"functor\"]);\nvar middleKeywords = wordRegexp(middle);\nvar endKeywords = wordRegexp(end);\n\n// Tokenizers\nfunction tokenBase(stream, state) {\n  if (stream.eatSpace()) {\n    return null;\n  }\n\n  // Brackets\n  if(stream.match(/[{}]/)) {\n    return \"bracket\";\n  }\n\n  // Special [] keyword\n  if (stream.match('[]')) {\n    return \"keyword\"\n  }\n\n  // Operators\n  if (stream.match(tripleOperators) || stream.match(doubleOperators)) {\n    return \"operator\";\n  }\n\n  // Atoms\n  if(stream.match(atoms)) {\n    return 'atom';\n  }\n\n  // Opening keywords\n  var matched = stream.match(openingKeywords);\n  if (matched) {\n    if (!state.doInCurrentLine)\n      state.currentIndent++;\n    else\n      state.doInCurrentLine = false;\n\n    // Special matching for signatures\n    if(matched[0] == \"proc\" || matched[0] == \"fun\")\n      state.tokenize = tokenFunProc;\n    else if(matched[0] == \"class\")\n      state.tokenize = tokenClass;\n    else if(matched[0] == \"meth\")\n      state.tokenize = tokenMeth;\n\n    return 'keyword';\n  }\n\n  // Middle and other keywords\n  if (stream.match(middleKeywords) || stream.match(commonKeywords)) {\n    return \"keyword\"\n  }\n\n  // End keywords\n  if (stream.match(endKeywords)) {\n    state.currentIndent--;\n    return 'keyword';\n  }\n\n  // Eat the next char for next comparisons\n  var ch = stream.next();\n\n  // Strings\n  if (ch == '\"' || ch == \"'\") {\n    state.tokenize = tokenString(ch);\n    return state.tokenize(stream, state);\n  }\n\n  // Numbers\n  if (/[~\\d]/.test(ch)) {\n    if (ch == \"~\") {\n      if(! /^[0-9]/.test(stream.peek()))\n        return null;\n      else if (( stream.next() == \"0\" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\\.[0-9]+)?([eE][~+]?[0-9]+)?/))\n        return \"number\";\n    }\n\n    if ((ch == \"0\" && stream.match(/^[xX][0-9a-fA-F]+/)) || stream.match(/^[0-9]*(\\.[0-9]+)?([eE][~+]?[0-9]+)?/))\n      return \"number\";\n\n    return null;\n  }\n\n  // Comments\n  if (ch == \"%\") {\n    stream.skipToEnd();\n    return 'comment';\n  }\n  else if (ch == \"/\") {\n    if (stream.eat(\"*\")) {\n      state.tokenize = tokenComment;\n      return tokenComment(stream, state);\n    }\n  }\n\n  // Single operators\n  if(singleOperators.test(ch)) {\n    return \"operator\";\n  }\n\n  // If nothing match, we skip the entire alphanumerical block\n  stream.eatWhile(/\\w/);\n\n  return \"variable\";\n}\n\nfunction tokenClass(stream, state) {\n  if (stream.eatSpace()) {\n    return null;\n  }\n  stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)/);\n  state.tokenize = tokenBase;\n  return \"type\"\n}\n\nfunction tokenMeth(stream, state) {\n  if (stream.eatSpace()) {\n    return null;\n  }\n  stream.match(/([a-zA-Z][A-Za-z0-9_]*)|(`.+`)/);\n  state.tokenize = tokenBase;\n  return \"def\"\n}\n\nfunction tokenFunProc(stream, state) {\n  if (stream.eatSpace()) {\n    return null;\n  }\n\n  if(!state.hasPassedFirstStage && stream.eat(\"{\")) {\n    state.hasPassedFirstStage = true;\n    return \"bracket\";\n  }\n  else if(state.hasPassedFirstStage) {\n    stream.match(/([A-Z][A-Za-z0-9_]*)|(`.+`)|\\$/);\n    state.hasPassedFirstStage = false;\n    state.tokenize = tokenBase;\n    return \"def\"\n  }\n  else {\n    state.tokenize = tokenBase;\n    return null;\n  }\n}\n\nfunction tokenComment(stream, state) {\n  var maybeEnd = false, ch;\n  while (ch = stream.next()) {\n    if (ch == \"/\" && maybeEnd) {\n      state.tokenize = tokenBase;\n      break;\n    }\n    maybeEnd = (ch == \"*\");\n  }\n  return \"comment\";\n}\n\nfunction tokenString(quote) {\n  return function (stream, state) {\n    var escaped = false, next, end = false;\n    while ((next = stream.next()) != null) {\n      if (next == quote && !escaped) {\n        end = true;\n        break;\n      }\n      escaped = !escaped && next == \"\\\\\";\n    }\n    if (end || !escaped)\n      state.tokenize = tokenBase;\n    return \"string\";\n  };\n}\n\nfunction buildElectricInputRegEx() {\n  // Reindentation should occur on [] or on a match of any of\n  // the block closing keywords, at the end of a line.\n  var allClosings = middle.concat(end);\n  return new RegExp(\"[\\\\[\\\\]]|(\" + allClosings.join(\"|\") + \")$\");\n}\n\nexport const oz = {\n  name: \"oz\",\n\n  startState: function () {\n    return {\n      tokenize: tokenBase,\n      currentIndent: 0,\n      doInCurrentLine: false,\n      hasPassedFirstStage: false\n    };\n  },\n\n  token: function (stream, state) {\n    if (stream.sol())\n      state.doInCurrentLine = 0;\n\n    return state.tokenize(stream, state);\n  },\n\n  indent: function (state, textAfter, cx) {\n    var trueText = textAfter.replace(/^\\s+|\\s+$/g, '');\n\n    if (trueText.match(endKeywords) || trueText.match(middleKeywords) || trueText.match(/(\\[])/))\n      return cx.unit * (state.currentIndent - 1);\n\n    if (state.currentIndent < 0)\n      return 0;\n\n    return state.currentIndent * cx.unit\n  },\n\n  languageData: {\n    indentOnInut: buildElectricInputRegEx(),\n    commentTokens: {line: \"%\", block: {open: \"/*\", close: \"*/\"}}\n  }\n};\n"],"names":["wordRegexp","words","RegExp","join","singleOperators","doubleOperators","tripleOperators","middle","end","atoms","commonKeywords","openingKeywords","middleKeywords","endKeywords","tokenBase","stream","state","eatSpace","match","matched","doInCurrentLine","currentIndent","tokenize","tokenFunProc","tokenClass","tokenMeth","quote","ch","next","escaped","test","peek","skipToEnd","eat","tokenComment","eatWhile","hasPassedFirstStage","maybeEnd","oz","name","startState","token","sol","indent","textAfter","cx","trueText","replace","unit","languageData","indentOnInut","allClosings","concat","commentTokens","line","block","open","close"],"mappings":"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","x_google_ignoreList":[0]}