Skip to content

Commit 8b0e326

Browse files
Abdussalam Abdurrahmanmarijnh
authored andcommitted
[clojure mode] Use a regular expression for matching number literals.
Clojure mode is now capable of syntax highlighting all kinds of number literals in Clojure.
1 parent 0f437b9 commit 8b0e326

File tree

2 files changed

+24
-57
lines changed

2 files changed

+24
-57
lines changed

mode/clojure/clojure.js

Lines changed: 5 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -127,11 +127,8 @@ CodeMirror.defineMode("clojure", function (options) {
127127
var coreSymbols = makeKeywords(commonCoreSymbols);
128128
var indentSymbols = makeKeywords(commonIndentSymbols);
129129

130+
var numberLiteral = /^[+\-]?\d+(?:(?:N|(?:[eE][+\-]?\d+))|(?:\.?\d*(?:M|(?:[eE][+\-]?\d+))?)|\/\d+|[xX][0-9a-fA-F]+|r[0-9a-zA-Z]+)?/;
130131
var tests = {
131-
digit: /\d/,
132-
hex: /[0-9a-f]/i,
133-
sign: /[+-]/,
134-
exponent: /e/i,
135132
keyword_char: /[^\s;()\[\]{}]/,
136133
symbol: /[\w*+!\-._?:<>\/'\xa1-\uffff]/,
137134
block_indent: /^(?:def|with)[^\/]+$|\/(?:def|with)/
@@ -151,42 +148,6 @@ CodeMirror.defineMode("clojure", function (options) {
151148
state.indentStack = state.indentStack.prev;
152149
}
153150

154-
function isNumber(ch, stream){
155-
// hex
156-
if ( ch === '0' && stream.eat(/x/i) ) {
157-
stream.eatWhile(tests.hex);
158-
return true;
159-
}
160-
161-
// leading sign
162-
if ( ( ch == '+' || ch == '-' ) && ( tests.digit.test(stream.peek()) ) ) {
163-
stream.eat(tests.sign);
164-
ch = stream.next();
165-
}
166-
167-
if ( tests.digit.test(ch) ) {
168-
stream.eat(ch);
169-
stream.eatWhile(tests.digit);
170-
171-
if ( '.' == stream.peek() ) {
172-
stream.eat('.');
173-
stream.eatWhile(tests.digit);
174-
} else if ('/' == stream.peek() ) {
175-
stream.eat('/');
176-
stream.eatWhile(tests.digit);
177-
}
178-
179-
if ( stream.eat(tests.exponent) ) {
180-
stream.eat(tests.sign);
181-
stream.eatWhile(tests.digit);
182-
}
183-
184-
return true;
185-
}
186-
187-
return false;
188-
}
189-
190151
// Eat character that starts after backslash \
191152
function eatCharacter(stream) {
192153
var first = stream.next();
@@ -236,6 +197,10 @@ CodeMirror.defineMode("clojure", function (options) {
236197
returnType = STRING; // continue on in string mode
237198
break;
238199
default: // default parsing mode
200+
if (stream.match(numberLiteral)) {
201+
return NUMBER;
202+
}
203+
239204
var ch = stream.next();
240205

241206
if (ch == "\"") {
@@ -249,8 +214,6 @@ CodeMirror.defineMode("clojure", function (options) {
249214
} else if (ch == ";") { // comment
250215
stream.skipToEnd(); // rest of the line is a comment
251216
returnType = COMMENT;
252-
} else if (isNumber(ch,stream)){
253-
returnType = NUMBER;
254217
} else if (ch == "(" || ch == "[" || ch == "{" ) {
255218
var keyWord = '', indentTemp = stream.column(), letter;
256219
/**

mode/clojure/test.js

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -23,23 +23,27 @@
2323

2424
MT("numbers",
2525
"[number 42] [number +42] [number -421]",
26-
// FIXME
27-
// "[number 42N] [number +42N] [number -42N]",
26+
"[number 42N] [number +42N] [number -42N]",
2827
"[number 0.42] [number +0.42] [number -0.42]",
29-
// FIXME
30-
// "[number 42M] [number +42M] [number -42M]",
31-
// "[number 42.42M] [number +42.42M] [number -42.42M]",
28+
"[number 42M] [number +42M] [number -42M]",
29+
"[number 42.42M] [number +42.42M] [number -42.42M]",
3230
"[number 1/42] [number +1/42] [number -1/42]",
33-
"[number 0x420f]",
34-
// FIXME
35-
// "[number +0x420f] [number -0x420f]",
31+
"[number 0x42af] [number +0x42af] [number -0x42af]",
32+
"[number 0x42AF] [number +0x42AF] [number -0x42AF]",
3633
"[number 1e2] [number 1e+2] [number 1e-2]",
3734
"[number +1e2] [number +1e+2] [number +1e-2]",
3835
"[number -1e2] [number -1e+2] [number -1e-2]",
39-
"[number -1.0e2] [number -0.1e+2] [number -1.01e-2]"
40-
// FIXME
41-
// "[number 2r101010] [number +2r101010] [number -2r101010]",
42-
// "[number 8r52] [number +8r52] [number -8r52]"
36+
"[number -1.0e2] [number -0.1e+2] [number -1.01e-2]",
37+
"[number 1E2] [number 1E+2] [number 1E-2]",
38+
"[number +1E2] [number +1E+2] [number +1E-2]",
39+
"[number -1E2] [number -1E+2] [number -1E-2]",
40+
"[number -1.0E2] [number -0.1E+2] [number -1.01E-2]",
41+
"[number 2r101010] [number +2r101010] [number -2r101010]",
42+
"[number 2r101010] [number +2r101010] [number -2r101010]",
43+
"[number 8r52] [number +8r52] [number -8r52]",
44+
"[number 36rhello] [number +36rhello] [number -36rhello]",
45+
"[number 36rz] [number +36rz] [number -36rz]",
46+
"[number 36rZ] [number +36rZ] [number -36rZ]"
4347
);
4448

4549
MT("characters",
@@ -522,15 +526,15 @@
522526
);
523527

524528
MT("should indent with-precision",
525-
"[bracket (][keyword with-precision] [number 10] [bracket (][keyword /] [number 1][variable M] [number 3][bracket ))]",
529+
"[bracket (][keyword with-precision] [number 10] [bracket (][keyword /] [number 1M] [number 3][bracket ))]",
526530
"",
527-
"[bracket (][keyword with-precision] [number 10] [atom :rounding] [variable HALF_DOWN] [bracket (][keyword /] [number 1][variable M] [number 3][bracket ))]",
531+
"[bracket (][keyword with-precision] [number 10] [atom :rounding] [variable HALF_DOWN] [bracket (][keyword /] [number 1M] [number 3][bracket ))]",
528532
"",
529533
"[bracket (][keyword with-precision]",
530534
" [number 10]",
531535
" [atom :rounding]",
532536
" [variable HALF_DOWN]",
533-
" [bracket (][keyword /] [number 1][variable M] [number 3][bracket ))]"
537+
" [bracket (][keyword /] [number 1M] [number 3][bracket ))]"
534538
);
535539

536540
MT("should indent when",

0 commit comments

Comments
 (0)