diff --git a/src/clojure/clojure.ts b/src/clojure/clojure.ts index 03beb5b9..59855ed4 100644 --- a/src/clojure/clojure.ts +++ b/src/clojure/clojure.ts @@ -13,20 +13,24 @@ export const conf: IRichLanguageConfiguration = { lineComment: ';;', }, - brackets: [['(', ')'], ['[', ']'], ['{', '}']], + brackets: [ + ['[', ']'], + ['(', ')'], + ['{', '}'] + ], autoClosingPairs: [ - {open: '(', close: ')'}, {open: '[', close: ']'}, - {open: '{', close: '}'}, {open: '"', close: '"'}, + {open: '(', close: ')'}, + {open: '{', close: '}'}, ], surroundingPairs: [ - {open: '(', close: ')'}, {open: '[', close: ']'}, - {open: '{', close: '}'}, {open: '"', close: '"'}, + {open: '(', close: ')'}, + {open: '{', close: '}'}, ], }; @@ -36,11 +40,26 @@ export const language = { tokenPostfix: '.clj', brackets: [ + {open: '[', close: ']', token: 'delimiter.square'}, {open: '(', close: ')', token: 'delimiter.parenthesis'}, {open: '{', close: '}', token: 'delimiter.curly'}, - {open: '[', close: ']', token: 'delimiter.square'}, ], + constants: ['true', 'false', 'nil'], + + // delimiters: /[\\\[\]\s"#'(),;@^`{}~]|$/, + + numbers: /^(?:[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?(?=[\\\[\]\s"#'(),;@^`{}~]|$))/, + + characters: /^(?:\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?(?=[\\\[\]\s"(),;@^`{}~]|$))/, + + escapes: /^\\(?:backspace|formfeed|newline|return|space|tab|o[0-7]{3}|u[0-9A-Fa-f]{4}|x[0-9A-Fa-f]{4}|.)?/, + + // simple-namespace := /^[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*/ + // simple-symbol := /^(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)/ + // qualified-symbol := ((<.>)*)? + qualifiedSymbols: /^(?:(?:[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*(?:\.[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*\/)?(?:\/|[^\\\/\[\]\d\s"#'(),;@^`{}~][^\\\[\]\s"(),;@^`{}~]*)*(?=[\\\[\]\s"(),;@^`{}~]|$))/, + specialForms: [ '.', 'catch', @@ -712,14 +731,6 @@ export const language = { 'zipmap', ], - constants: ['true', 'false', 'nil'], - - symbolCharacter: /[!#'*+\-.\/:<=>?_\w\xa1-\uffff]/, - - numbers: /[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?/, - - characters: /\\(?:backspace|formfeed|newline|return|space|tab|x[0-9A-Fa-f]{4}|u[0-9A-Fa-f]{4}|o[0-7]{3}|@symbolCharacter|[\\"()\[\]{}])/, - tokenizer: { root: [ // whitespaces and comments @@ -743,12 +754,10 @@ export const language = { // reader macro characters [/[#'@^`~]/, 'meta'], - // keywords - [/:@symbolCharacter+/, 'constant'], - // symbols - [/@symbolCharacter+/, { + [/@qualifiedSymbols/, { cases: { + '^:.+$': 'constant', // Clojure keywords (e.g., `:foo/bar`) '@specialForms': 'keyword', '@coreSymbols': 'keyword', '@constants': 'constant', @@ -777,7 +786,7 @@ export const language = { multiLineString: [ [/[^\\"]+/, 'string'], - [/@characters/, 'string'], + [/@escapes/, 'string'], [/"/, 'string', '@pop'] ], },