Skip to content

Commit 1f1908d

Browse files
authored
fix(go) more accurate number highlighting (#3981)
Go number literals are considerably more complex than previously expressed. Most notable, `_` is allowed in several contexts to allow digit grouping, hex numbers can take `p` exponents, and a number with a radix (`.`) requires digits before or after but not both. The additional test cases were pulled from https://go.dev/ref/spec.
1 parent 8e61102 commit 1f1908d

File tree

4 files changed

+142
-3
lines changed

4 files changed

+142
-3
lines changed

CHANGES.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Core Grammars:
2828
- fix(types) fix interface LanguageDetail > keywords [Patrick Chiu]
2929
- enh(java) add `goto` to be recognized as a keyword in Java [Alvin Joy][]
3030
- enh(bash) add keyword `sudo` [Alvin Joy][]
31+
- fix(go) fix go number literals to accept `_` separators, add hex p exponents [Lisa Ugray][]
3132
- enh(markdown) add entity support [David Schach][] [TaraLei][]
3233

3334
New Grammars:
@@ -64,6 +65,7 @@ Themes:
6465
[Vitaly Barilko]: https://github.com/Diversus23
6566
[Patrick Chiu]: https://github.com/patrick-kw-chiu
6667
[Alvin Joy]: https://github.com/alvinsjoy
68+
[Lisa Ugray]: https://github.com/lugray
6769
[TaraLei]: https://github.com/TaraLei
6870

6971

src/languages/go.js

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,10 +109,25 @@ export default function(hljs) {
109109
className: 'number',
110110
variants: [
111111
{
112-
begin: hljs.C_NUMBER_RE + '[i]',
113-
relevance: 1
112+
match: /-?\b0[xX]\.[a-fA-F0-9](_?[a-fA-F0-9])*[pP][+-]?\d(_?\d)*i?/, // hex without a present digit before . (making a digit afterwards required)
113+
relevance: 0
114114
},
115-
hljs.C_NUMBER_MODE
115+
{
116+
match: /-?\b0[xX](_?[a-fA-F0-9])+((\.([a-fA-F0-9](_?[a-fA-F0-9])*)?)?[pP][+-]?\d(_?\d)*)?i?/, // hex with a present digit before . (making a digit afterwards optional)
117+
relevance: 0
118+
},
119+
{
120+
match: /-?\b0[oO](_?[0-7])*i?/, // leading 0o octal
121+
relevance: 0
122+
},
123+
{
124+
match: /-?\.\d(_?\d)*([eE][+-]?\d(_?\d)*)?i?/, // decimal without a present digit before . (making a digit afterwards required)
125+
relevance: 0
126+
},
127+
{
128+
match: /-?\b\d(_?\d)*(\.(\d(_?\d)*)?)?([eE][+-]?\d(_?\d)*)?i?/, // decimal with a present digit before . (making a digit afterwards optional)
129+
relevance: 0
130+
}
116131
]
117132
},
118133
{ begin: /:=/ // relevance booster

test/markup/go/numbers.expect.txt

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,64 @@
1+
-- Numbers
2+
13
float_var := <span class="hljs-number">1.0e10</span>
24
complex_var := <span class="hljs-number">1.2e5</span>+<span class="hljs-number">2.3i</span>
35
hex_int := <span class="hljs-number">0xcf3e4028ac084aea</span>
6+
7+
int_simple := <span class="hljs-number">42</span>
8+
int_underscore := <span class="hljs-number">4_2</span>
9+
octal := <span class="hljs-number">0600</span>
10+
octal_underscore := <span class="hljs-number">0_600</span>
11+
octal_o := <span class="hljs-number">0o600</span>
12+
octal_upper_o := <span class="hljs-number">0O600</span>
13+
hex_mixed_case := <span class="hljs-number">0xBadFace</span>
14+
hex_underscore := <span class="hljs-number">0xBad_Face</span>
15+
hex_many_underscore := <span class="hljs-number">0x_67_7a_2f_cc_40_c6</span>
16+
long_int := <span class="hljs-number">170141183460469231731687303715884105727</span>
17+
long_int_underscore := <span class="hljs-number">170_141183_460469_231731_687303_715884_105727</span>
18+
19+
float_no_post := <span class="hljs-number">0.</span>
20+
float_simple := <span class="hljs-number">72.40</span>
21+
float_leading_zero := <span class="hljs-number">072.40</span>
22+
float_e := <span class="hljs-number">1.e+0</span>
23+
float_e_neg := <span class="hljs-number">6.67428e-11</span>
24+
float_e_no_decimal := <span class="hljs-number">1E6</span>
25+
float_no_pre := <span class="hljs-number">.25</span>
26+
float_e_no_pre := <span class="hljs-number">.12345E+5</span>
27+
float_underscore := <span class="hljs-number">1_5.</span>
28+
float_underscore_in_e := <span class="hljs-number">0.15e+0_2</span>
29+
30+
float_hex_p := <span class="hljs-number">0x1p-2</span>
31+
float_hex_p_no_post := <span class="hljs-number">0x2.p10</span>
32+
float_hex_p_sign := <span class="hljs-number">0x1.Fp+0</span>
33+
float_hex_p_neg := <span class="hljs-number">0X.8p-0</span>
34+
float_hex_underscore := <span class="hljs-number">0X_1FFFP-16</span>
35+
36+
complex_zero := <span class="hljs-number">0i</span>
37+
complex_leading_zero := <span class="hljs-number">0123i</span>
38+
complex_octal := <span class="hljs-number">0o123i</span>
39+
complex_hex := <span class="hljs-number">0xabci</span>
40+
complex_float_zero := <span class="hljs-number">0.i</span>
41+
complex_float_simple := <span class="hljs-number">2.71828i</span>
42+
complex_float_e := <span class="hljs-number">1.e+0i</span>
43+
complex_float_e_neg := <span class="hljs-number">6.67428e-11i</span>
44+
complex_float_e_no_decimal := <span class="hljs-number">1E6i</span>
45+
complex_float_no_pre := <span class="hljs-number">.25i</span>
46+
complex_float_e_no_pre := <span class="hljs-number">.12345E+5i</span>
47+
complex_float_hex_p := <span class="hljs-number">0x1p-2i</span>
48+
49+
-- Non-numbers
50+
51+
identifier := _42
52+
trailing_underscore := <span class="hljs-number">42</span>_
53+
multiple_underscore := <span class="hljs-number">4</span>__2
54+
underscore_in_hex_prefix := <span class="hljs-number">0</span>_xBadFace
55+
56+
float_minus_int := <span class="hljs-number">0x15e</span><span class="hljs-number">-2</span>
57+
no_mantissa_digits := <span class="hljs-number">0</span>x.p1
58+
p_exponent_on_decimal := <span class="hljs-number">1</span>p<span class="hljs-number">-2</span>
59+
missing_p_exponent := <span class="hljs-number">0x1</span><span class="hljs-number">.5e-2</span>
60+
underscore_before_decimal := <span class="hljs-number">1</span>_<span class="hljs-number">.5</span>
61+
underscore_after_decimal := <span class="hljs-number">1.</span>_5
62+
underscore_before_e := <span class="hljs-number">1.5</span>_e1
63+
underscore_after_e := <span class="hljs-number">1.5</span>e_1
64+
trailing_underscore_in_exponent := <span class="hljs-number">1.5e1</span>_

test/markup/go/numbers.txt

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,64 @@
1+
-- Numbers
2+
13
float_var := 1.0e10
24
complex_var := 1.2e5+2.3i
35
hex_int := 0xcf3e4028ac084aea
6+
7+
int_simple := 42
8+
int_underscore := 4_2
9+
octal := 0600
10+
octal_underscore := 0_600
11+
octal_o := 0o600
12+
octal_upper_o := 0O600
13+
hex_mixed_case := 0xBadFace
14+
hex_underscore := 0xBad_Face
15+
hex_many_underscore := 0x_67_7a_2f_cc_40_c6
16+
long_int := 170141183460469231731687303715884105727
17+
long_int_underscore := 170_141183_460469_231731_687303_715884_105727
18+
19+
float_no_post := 0.
20+
float_simple := 72.40
21+
float_leading_zero := 072.40
22+
float_e := 1.e+0
23+
float_e_neg := 6.67428e-11
24+
float_e_no_decimal := 1E6
25+
float_no_pre := .25
26+
float_e_no_pre := .12345E+5
27+
float_underscore := 1_5.
28+
float_underscore_in_e := 0.15e+0_2
29+
30+
float_hex_p := 0x1p-2
31+
float_hex_p_no_post := 0x2.p10
32+
float_hex_p_sign := 0x1.Fp+0
33+
float_hex_p_neg := 0X.8p-0
34+
float_hex_underscore := 0X_1FFFP-16
35+
36+
complex_zero := 0i
37+
complex_leading_zero := 0123i
38+
complex_octal := 0o123i
39+
complex_hex := 0xabci
40+
complex_float_zero := 0.i
41+
complex_float_simple := 2.71828i
42+
complex_float_e := 1.e+0i
43+
complex_float_e_neg := 6.67428e-11i
44+
complex_float_e_no_decimal := 1E6i
45+
complex_float_no_pre := .25i
46+
complex_float_e_no_pre := .12345E+5i
47+
complex_float_hex_p := 0x1p-2i
48+
49+
-- Non-numbers
50+
51+
identifier := _42
52+
trailing_underscore := 42_
53+
multiple_underscore := 4__2
54+
underscore_in_hex_prefix := 0_xBadFace
55+
56+
float_minus_int := 0x15e-2
57+
no_mantissa_digits := 0x.p1
58+
p_exponent_on_decimal := 1p-2
59+
missing_p_exponent := 0x1.5e-2
60+
underscore_before_decimal := 1_.5
61+
underscore_after_decimal := 1._5
62+
underscore_before_e := 1.5_e1
63+
underscore_after_e := 1.5e_1
64+
trailing_underscore_in_exponent := 1.5e1_

0 commit comments

Comments
 (0)