export const languageConfiguration = { // the default separators except `@$` wordPattern: /(-?\d*\.\d\w*)|([^`~!#%^&*()\-=+\[{\]}\\|;:'",.<>\/?\s]+)/g, brackets: [ ['{', '}'], ['(', ')'], ], autoClosingPairs: [ { open: '{', close: '}' }, { open: '(', close: ')' }, { open: '"', close: '"' }, { open: "'", close: "'" }, ], surroundingPairs: [ { open: '{', close: '}' }, { open: '(', close: ')' }, { open: '"', close: '"' }, { open: "'", close: "'" }, ], folding: {}, }; const operators = ['=', '!=', '>', '<', '>=', '<=', '=~', '!~']; const intrinsics = ['duration', 'name', 'status', 'parent']; const scopes: string[] = ['resource', 'span']; const booleans = ['false', 'true']; const keywords = intrinsics.concat(scopes).concat(booleans); export const language = { ignoreCase: false, defaultToken: '', tokenPostfix: '.traceql', keywords, operators, // we include these common regular expressions symbols: /[=>|<|>=|<=|=~|!~))/, 'tag'], // all keywords have the same color [ /[a-zA-Z_.]\w*/, { cases: { '@keywords': 'type', '@default': 'identifier', }, }, ], // strings [/"([^"\\]|\\.)*$/, 'string.invalid'], // non-teminated string [/'([^'\\]|\\.)*$/, 'string.invalid'], // non-teminated string [/"/, 'string', '@string_double'], [/'/, 'string', '@string_single'], // whitespace { include: '@whitespace' }, // delimiters and operators [/[{}()\[\]]/, '@brackets'], [/[<>](?!@symbols)/, '@brackets'], [ /@symbols/, { cases: { '@operators': 'delimiter', '@default': '', }, }, ], // numbers [/\d+/, 'number'], [/\d*\d+[eE]([\-+]?\d+)?(@floatsuffix)/, 'number.float'], [/\d*\.\d+([eE][\-+]?\d+)?(@floatsuffix)/, 'number.float'], [/0[xX][0-9a-fA-F']*[0-9a-fA-F](@integersuffix)/, 'number.hex'], [/0[0-7']*[0-7](@integersuffix)/, 'number.octal'], [/0[bB][0-1']*[0-1](@integersuffix)/, 'number.binary'], [/\d[\d']*\d(@integersuffix)/, 'number'], [/\d(@integersuffix)/, 'number'], ], string_double: [ [/[^\\"]+/, 'string'], [/@escapes/, 'string.escape'], [/\\./, 'string.escape.invalid'], [/"/, 'string', '@pop'], ], string_single: [ [/[^\\']+/, 'string'], [/@escapes/, 'string.escape'], [/\\./, 'string.escape.invalid'], [/'/, 'string', '@pop'], ], clauses: [ [/[^(,)]/, 'tag'], [/\)/, 'identifier', '@pop'], ], whitespace: [[/[ \t\r\n]+/, 'white']], }, }; export const languageDefinition = { id: 'traceql', extensions: ['.traceql'], aliases: ['tempo', 'traceql'], mimetypes: [], def: { language, languageConfiguration, }, };