Skip to content

Commit 40114cd

Browse files
mszabo-wikiaClaude
andauthored
fix: highlight type parameters in constant declarations (#218)
Type parameters like `vec<int>` in top-level and class constant declarations were incorrectly highlighted as comparison operators. Fix by adding a dedicated `const` declaration grammar rule that includes `#type-annotation`, and reordering `type-annotation` patterns so generics (`Name<...>`) are matched before primitive type keywords. Fixes #91, fixes #74. Co-authored-by: Claude <svc-devxp-claude@slack-corp.com>
1 parent f4b544f commit 40114cd

4 files changed

Lines changed: 157 additions & 6 deletions

File tree

syntaxes/hack.json

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -366,10 +366,6 @@
366366
"type-annotation": {
367367
"name": "support.type.php",
368368
"patterns": [
369-
{
370-
"match": "\\b(?:bool|int|float|string|resource|mixed|arraykey|nonnull|dict|vec|keyset)\\b",
371-
"name": "support.type.php"
372-
},
373369
{
374370
"begin": "([A-Za-z_][A-Za-z0-9_]*)<",
375371
"beginCaptures": {
@@ -384,6 +380,10 @@
384380
}
385381
]
386382
},
383+
{
384+
"match": "\\b(?:bool|int|float|string|resource|mixed|arraykey|nonnull|dict|vec|keyset)\\b",
385+
"name": "support.type.php"
386+
},
387387
{
388388
"begin": "(shape\\()",
389389
"end": "((,|\\.\\.\\.)?\\s*\\))",
@@ -1049,6 +1049,44 @@
10491049
"match": "\\b(catch|try|throw|exception|finally)\\b",
10501050
"name": "keyword.control.exception.php"
10511051
},
1052+
{
1053+
"begin": "(?i)\\b(const)\\s+(?=[\\\\a-z_])",
1054+
"beginCaptures": {
1055+
"1": {
1056+
"name": "storage.modifier.php"
1057+
}
1058+
},
1059+
"end": "(;)",
1060+
"endCaptures": {
1061+
"1": {
1062+
"name": "punctuation.terminator.expression.php"
1063+
}
1064+
},
1065+
"name": "meta.const.php",
1066+
"patterns": [
1067+
{
1068+
"include": "#comments"
1069+
},
1070+
{
1071+
"match": "(?i)([a-z_][a-z_0-9]*)\\s*(?==(?!=))",
1072+
"captures": {
1073+
"1": {
1074+
"name": "constant.other.php"
1075+
}
1076+
}
1077+
},
1078+
{
1079+
"include": "#type-annotation"
1080+
},
1081+
{
1082+
"match": "=",
1083+
"name": "keyword.operator.assignment.php"
1084+
},
1085+
{
1086+
"include": "#language"
1087+
}
1088+
]
1089+
},
10521090
{
10531091
"begin": "(?i)\\s*(?:(public|internal)\\s+)?(function)\\s*(?=\\()",
10541092
"beginCaptures": {

test/grammar/constants.hack

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
const vec<int> v = vec[0];
2+
3+
class Test {
4+
const vec<int> CLASS_CONST = vec[0];
5+
}
6+
7+
function foo(vec<int> $v = vec[0]): void {}
8+
9+
const dict<string, (function(Webserver\RequestURL): Awaitable<void>)> CONSTANT_NAME = dict[];

test/grammar/constants.hack.snap

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,103 @@
1+
>const vec<int> v = vec[0];
2+
#^^^^^ source.hack meta.const.php storage.modifier.php
3+
# ^ source.hack meta.const.php
4+
# ^^^ source.hack meta.const.php support.class.php
5+
# ^ source.hack meta.const.php
6+
# ^^^ source.hack meta.const.php support.type.php
7+
# ^ source.hack meta.const.php
8+
# ^ source.hack meta.const.php
9+
# ^ source.hack meta.const.php constant.other.php
10+
# ^ source.hack meta.const.php
11+
# ^ source.hack meta.const.php keyword.operator.assignment.php
12+
# ^ source.hack meta.const.php
13+
# ^^^ source.hack meta.const.php support.type.php
14+
# ^ source.hack meta.const.php punctuation.section.array.begin.php
15+
# ^ source.hack meta.const.php constant.numeric.php
16+
# ^ source.hack meta.const.php punctuation.section.array.end.php
17+
# ^ source.hack meta.const.php punctuation.terminator.expression.php
18+
>
19+
>class Test {
20+
#^^^^^ source.hack meta.class.php storage.type.class.php
21+
# ^ source.hack meta.class.php
22+
# ^^^^ source.hack meta.class.php entity.name.type.class.php
23+
# ^ source.hack meta.class.php
24+
# ^ source.hack punctuation.section.scope.begin.php
25+
> const vec<int> CLASS_CONST = vec[0];
26+
#^^^^ source.hack
27+
# ^^^^^ source.hack meta.const.php storage.modifier.php
28+
# ^ source.hack meta.const.php
29+
# ^^^ source.hack meta.const.php support.class.php
30+
# ^ source.hack meta.const.php
31+
# ^^^ source.hack meta.const.php support.type.php
32+
# ^ source.hack meta.const.php
33+
# ^ source.hack meta.const.php
34+
# ^^^^^^^^^^^ source.hack meta.const.php constant.other.php
35+
# ^ source.hack meta.const.php
36+
# ^ source.hack meta.const.php keyword.operator.assignment.php
37+
# ^ source.hack meta.const.php
38+
# ^^^ source.hack meta.const.php support.type.php
39+
# ^ source.hack meta.const.php punctuation.section.array.begin.php
40+
# ^ source.hack meta.const.php constant.numeric.php
41+
# ^ source.hack meta.const.php punctuation.section.array.end.php
42+
# ^ source.hack meta.const.php punctuation.terminator.expression.php
43+
>}
44+
#^ source.hack punctuation.section.scope.end.php
45+
>
46+
>function foo(vec<int> $v = vec[0]): void {}
47+
#^^^^^^^^ source.hack meta.function.php storage.type.function.php
48+
# ^ source.hack meta.function.php
49+
# ^^^ source.hack meta.function.php entity.name.function.php
50+
# ^ source.hack meta.function.php punctuation.definition.parameters.begin.php
51+
# ^^^ source.hack meta.function.php meta.function.arguments.php support.class.php
52+
# ^ source.hack meta.function.php meta.function.arguments.php
53+
# ^^^ source.hack meta.function.php meta.function.arguments.php support.type.php
54+
# ^ source.hack meta.function.php meta.function.arguments.php
55+
# ^ source.hack meta.function.php meta.function.arguments.php
56+
# ^ source.hack meta.function.php meta.function.arguments.php variable.other.php punctuation.definition.variable.php
57+
# ^ source.hack meta.function.php meta.function.arguments.php variable.other.php
58+
# ^ source.hack meta.function.php meta.function.arguments.php
59+
# ^ source.hack meta.function.php meta.function.arguments.php keyword.operator.assignment.php
60+
# ^ source.hack meta.function.php meta.function.arguments.php
61+
# ^^^ source.hack meta.function.php meta.function.arguments.php support.type.php
62+
# ^ source.hack meta.function.php meta.function.arguments.php punctuation.section.array.begin.php
63+
# ^ source.hack meta.function.php meta.function.arguments.php constant.numeric.php
64+
# ^ source.hack meta.function.php meta.function.arguments.php punctuation.section.array.end.php
65+
# ^ source.hack meta.function.php punctuation.definition.parameters.end.php
66+
# ^ source.hack meta.function.php punctuation.definition.type.php
67+
# ^ source.hack meta.function.php
68+
# ^^^^ source.hack meta.function.php support.class.php
69+
# ^ source.hack meta.function.php
70+
# ^ source.hack punctuation.section.scope.begin.php
71+
# ^ source.hack punctuation.section.scope.end.php
72+
>
73+
>const dict<string, (function(Webserver\RequestURL): Awaitable<void>)> CONSTANT_NAME = dict[];
74+
#^^^^^ source.hack meta.const.php storage.modifier.php
75+
# ^ source.hack meta.const.php
76+
# ^^^^ source.hack meta.const.php support.class.php
77+
# ^ source.hack meta.const.php
78+
# ^^^^^^ source.hack meta.const.php support.type.php
79+
# ^^ source.hack meta.const.php
80+
# ^ source.hack meta.const.php
81+
# ^^^^^^^^ source.hack meta.const.php support.class.php
82+
# ^ source.hack meta.const.php
83+
# ^^^^^^^^^ source.hack meta.const.php support.other.namespace.php entity.name.type.namespace.php
84+
# ^ source.hack meta.const.php support.other.namespace.php punctuation.separator.inheritance.php
85+
# ^^^^^^^^^^ source.hack meta.const.php support.class.php
86+
# ^ source.hack meta.const.php
87+
# ^^ source.hack meta.const.php
88+
# ^^^^^^^^^ source.hack meta.const.php support.class.php
89+
# ^ source.hack meta.const.php
90+
# ^^^^ source.hack meta.const.php support.class.php
91+
# ^ source.hack meta.const.php
92+
# ^ source.hack meta.const.php
93+
# ^ source.hack meta.const.php
94+
# ^ source.hack meta.const.php
95+
# ^^^^^^^^^^^^^ source.hack meta.const.php constant.other.php
96+
# ^ source.hack meta.const.php
97+
# ^ source.hack meta.const.php keyword.operator.assignment.php
98+
# ^ source.hack meta.const.php
99+
# ^^^^ source.hack meta.const.php support.type.php
100+
# ^ source.hack meta.const.php punctuation.section.array.begin.php
101+
# ^ source.hack meta.const.php punctuation.section.array.end.php
102+
# ^ source.hack meta.const.php punctuation.terminator.expression.php
103+
>

test/grammar/double_greater_than.hack.snap

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,15 @@
2121
#^ source.hack meta.function.php punctuation.definition.parameters.end.php
2222
# ^ source.hack meta.function.php punctuation.definition.type.php
2323
# ^ source.hack meta.function.php
24-
# ^^^ source.hack meta.function.php support.type.php
24+
# ^^^ source.hack meta.function.php support.class.php
2525
# ^ source.hack meta.function.php
2626
# ^^^^^^^^^^^^^^^^^ source.hack meta.function.php support.class.php
2727
# ^ source.hack meta.function.php
2828
# ^^^^^^ source.hack meta.function.php storage.type.shape.php
2929
# ^^^^ source.hack meta.function.php storage.type.shape.php keyword.operator.key.php
3030
# ^ source.hack meta.function.php
31-
# ^^ source.hack meta.function.php
31+
# ^ source.hack meta.function.php
32+
# ^ source.hack meta.function.php
3233
# ^ source.hack punctuation.section.scope.begin.php
3334
> return vec[];
3435
#^^^^ source.hack

0 commit comments

Comments
 (0)