// CodeMirror, copyright (c) by Marijn Haverbeke and others // Distributed under an MIT license: https://codemirror.net/LICENSE import * as CodeMirror from 'codemirror'; import 'codemirror/addon/mode/simple'; // "use strict"; // from where select predicate in as order by asc desc module result this super // abstract cached external final library noopt private deprecated override query pragma language bindingset noinline nomagic monotonicAggregates transient // not and or implies exists forall forex any none // if then else // int float string boolean date // import // class extends instanceof // avg concat count max min rank strictconcat strictcount strictsum sum // false true var builtins_base = [ "from", "where", "select", "predicate", "in", "as", "order", "by", "asc", "desc", "module", "result", "this", "super", "abstract", "cached", "external", "final", "library", "noopt", "private", "deprecated", "override", "query", "pragma", "language", "bindingset", "noinline", "nomagic", "monotonicAggregates", "transient", "not", "and", "or", "implies", "exists", "forall", "forex", "any", "none", "if", "then", "else", "int", "float", "string", "boolean", "date", "import", "class", "extends", "instanceof", "avg", "concat", "count", "max", "min", "rank", "strictconcat", "strictcount", "strictsum", "sum", "false", "true" ]; var builtins_str = '(' + builtins_base.join('|') + ')\\b'; var builtins_functions = []; var builtins_fun_str = '(' + builtins_functions.join('|') + ')(?=\\()'; CodeMirror.defineSimpleMode("codeql", { // The start state contains the rules that are intially used start: [ // Comments { regex: /\/\/\/?.*$/, token: 'comment', sol: true }, { regex: /(\s)\/\/\/?.*$/, token: 'comment' }, { regex: /\s*\*.*$/, token: 'comment', sol: true }, { regex: /\/\*/, token: 'comment', push: 'comments_block' }, // Strings { regex: /"/, token: 'string', push: 'string_regular' }, { regex: /`"/, token: 'string', push: 'string_compound' }, // Macros { regex: /`/, token: 'variable-2', push: 'macro_local' }, { regex: /\$/, token: 'variable-2', push: 'macro_global' }, // Decimal Numbers { regex: /\b[+-]?(?:[0-9]+(?:\.[0-9]+)?|\.[0-9]+|\.)(?:[eE][+-]?[0-9]+)?[i]?\b/, token: 'number' }, // Keywords // There are two separate dictionaries because the `\b` at the beginning of the regex seemed not to work. So instead, I either match the preceding space before the keyword or require the keyword to be at beginning of the string. I think this necessitates two different strings. { regex: new RegExp('\\s' + builtins_str), token: 'keyword' }, { regex: new RegExp(builtins_str), token: 'keyword', sol: true }, { regex: new RegExp('\\s' + builtins_fun_str), token: 'def' }, { regex: /\s\w+(?=\()/, token: 'def' }, { regex: /[\{]/, indent: true }, { regex: /[\}]/, dedent: true }, { regex: /-|==|<=|>=|<|>|&|!=/, token: 'operator' }, { regex: /\*|\+|\^|\/|!|~|=|~=/, token: 'operator' }, ], comments_block: [ { regex: /\/\*/, token: 'comment', push: 'comments_block' }, // this ends and restarts a comment block. but need to catch this so // that it doesn\'t start _another_ level of comment blocks { regex: /\*\/\*/, token: 'comment' }, { regex: /(\*\/\s+\*(?!\/)[^\n]*)|(\*\/)/, token: 'comment', pop: true }, // Match anything else as a character inside the comment { regex: /./, token: 'comment' }, ], string_compound: [ { regex: /`"/, token: 'string', push: 'string_compound' }, { regex: /"'/, token: 'string', pop: true }, { regex: /`/, token: 'variable-2', push: 'macro_local' }, { regex: /\$/, token: 'variable-2', push: 'macro_global' }, { regex: /./, token: 'string' } ], string_regular: [ { regex: /"/, token: 'string', pop: true }, { regex: /`/, token: 'variable-2', push: 'macro_local' }, { regex: /\$/, token: 'variable-2', push: 'macro_global' }, { regex: /./, token: 'string' } ], macro_local: [ { regex: /`/, token: 'variable-2', push: 'macro_local' }, { regex: /'/, token: 'variable-2', pop: true }, { regex: /./, token: 'variable-2' }, ], macro_global: [ { regex: /\}/, token: 'variable-2', pop: true }, { regex: /.(?=[^\w\{\}])/, token: 'variable-2', pop: true }, { regex: /./, token: 'variable-2' }, ], meta: { closeBrackets: { pairs: "()[]{}`'\"\"" }, dontIndentStates: ['comment'], electricInput: /^\s*\}$/, blockCommentStart: '/*', blockCommentEnd: '*/', lineComment: '//', fold: 'brace' } }); CodeMirror.defineMIME('text/x-codeql', 'codeql'); CodeMirror.defineMIME('text/codeql', 'codeql'); // When I paste this file in Jupyter, it won't work unless I include the // following code, but when I leave this as a separate module, it won't work and // raises an error. CodeMirror.modeInfo.push({ ext: ['do', 'ado'], mime: "text/x-codeql", mode: 'codeql', name: 'CodeQL' });