khulnasoft's picture
Upload 5 files
e111422 verified
raw
history blame
5 kB
// 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'
});