diff --git a/src/clojure/clojure.test.ts b/src/clojure/clojure.test.ts index 0113d56e..e4098fa1 100644 --- a/src/clojure/clojure.test.ts +++ b/src/clojure/clojure.test.ts @@ -768,6 +768,44 @@ testTokenization('clojure', [ ';; this is a line comment.', ], 'comment'), + // `comment` + [ + { + line: '(comment)', + tokens: [ + {startIndex: 0, type: 'comment.clj'}, + ], + }, + { + line: 'foo :bar 42', + tokens: [ + {startIndex: 0, type: 'identifier.clj'}, + {startIndex: 3, type: 'white.clj'}, + {startIndex: 4, type: 'constant.clj'}, + {startIndex: 8, type: 'white.clj'}, + {startIndex: 9, type: 'number.clj'}, + ], + }, + { + line: '(comment (foo [bar :baz 1 "qux"]))', + tokens: [ + {startIndex: 0, type: 'comment.clj'}, + ], + }, + { + line: '(comment foo', + tokens: [ + {startIndex: 0, type: 'comment.clj'}, + ], + }, + { + line: 'foo', + tokens: [ + {startIndex: 0, type: 'comment.clj'}, + ], + }, + ], + // reader macro characters createTestCases([ '#', diff --git a/src/clojure/clojure.ts b/src/clojure/clojure.ts index 4b6825df..df779450 100644 --- a/src/clojure/clojure.ts +++ b/src/clojure/clojure.ts @@ -716,18 +716,24 @@ export const language = { symbolCharacter: /[!#'*+\-.\/:<=>?_\w\xa1-\uffff]/, - numbers: /^[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?/, + 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 + {include: '@whitespace'}, + // numbers [/@numbers/, 'number'], // characters [/@characters/, 'string'], + // strings + {include: '@string'}, + // brackets [/[()\[\]{}]/, '@brackets'], @@ -751,20 +757,26 @@ export const language = { }, ], - {include: '@whitespace'}, - {include: '@string'}, ], whitespace: [ - [/[ \t\r\n]+/, 'white'], - [/;.*$/, 'comment']], + [/\s+/, 'white'], + [/;.*$/, 'comment'], + [/\(comment/, 'comment', '@comment'], + ], + + comment: [ + [/\(/, 'comment', '@push'], + [/\)/, 'comment', '@pop'], + [/[^)]/, 'comment'], + ], string: [ [/"/, 'string', '@multiLineString'], ], multiLineString: [ - [/[^\\"$]+/, 'string'], + [/[^\\"]+/, 'string'], [/@characters/, 'string'], [/"/, 'string', '@pop'] ],