Skip to content

Commit 3890a41

Browse files
committed
add nullish coalescing support
1 parent 84238ef commit 3890a41

File tree

5 files changed

+328
-0
lines changed

5 files changed

+328
-0
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,7 @@ repository:
218218
- include: '#arrow-function'
219219
- include: '#paren-expression-possibly-arrow'
220220
- include: '#cast'
221+
- include: '#nullish-coalesce'
221222
- include: '#ternary-expression'
222223
- include: '#new-expr'
223224
- include: '#instanceof-expr'
@@ -1414,6 +1415,12 @@ repository:
14141415
- include: '#expression'
14151416
- include: '#punctuation-comma'
14161417

1418+
#nullish coalesce
1419+
nullish-coalesce:
1420+
patterns:
1421+
- name: keyword.operator.logical.ts
1422+
match: \?\?
1423+
14171424
#ternary expression
14181425
ternary-expression:
14191426
begin: (?!\?\.\s*[^[:digit:]])(\?)

TypeScript.tmLanguage

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,6 +323,10 @@
323323
<key>include</key>
324324
<string>#cast</string>
325325
</dict>
326+
<dict>
327+
<key>include</key>
328+
<string>#nullish-coalesce</string>
329+
</dict>
326330
<dict>
327331
<key>include</key>
328332
<string>#ternary-expression</string>
@@ -4587,6 +4591,18 @@
45874591
</dict>
45884592
</array>
45894593
</dict>
4594+
<key>nullish-coalesce</key>
4595+
<dict>
4596+
<key>patterns</key>
4597+
<array>
4598+
<dict>
4599+
<key>name</key>
4600+
<string>keyword.operator.logical.ts</string>
4601+
<key>match</key>
4602+
<string>\?\?</string>
4603+
</dict>
4604+
</array>
4605+
</dict>
45904606
<key>ternary-expression</key>
45914607
<dict>
45924608
<key>begin</key>

TypeScriptReact.tmLanguage

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -327,6 +327,10 @@
327327
<key>include</key>
328328
<string>#cast</string>
329329
</dict>
330+
<dict>
331+
<key>include</key>
332+
<string>#nullish-coalesce</string>
333+
</dict>
330334
<dict>
331335
<key>include</key>
332336
<string>#ternary-expression</string>
@@ -4611,6 +4615,18 @@
46114615
</dict>
46124616
</array>
46134617
</dict>
4618+
<key>nullish-coalesce</key>
4619+
<dict>
4620+
<key>patterns</key>
4621+
<array>
4622+
<dict>
4623+
<key>name</key>
4624+
<string>keyword.operator.logical.tsx</string>
4625+
<key>match</key>
4626+
<string>\?\?</string>
4627+
</dict>
4628+
</array>
4629+
</dict>
46144630
<key>ternary-expression</key>
46154631
<dict>
46164632
<key>begin</key>
Lines changed: 274 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,274 @@
1+
original file
2+
-----------------------------------
3+
const brokenSyntaxHighlighting = () => {
4+
const array = a ?? b ?? c ?? d ?? g;
5+
6+
/**
7+
* No TypeEror, but syntax highlighting is broken
8+
*/
9+
const test = a ?? b ?? c ?? d ?? g;
10+
11+
for (let i = 0; i < array.length; i++) {
12+
console.log(array[i]);
13+
}
14+
};
15+
16+
brokenSyntaxHighlighting();
17+
18+
-----------------------------------
19+
20+
Grammar: TypeScript.tmLanguage
21+
-----------------------------------
22+
>const brokenSyntaxHighlighting = () => {
23+
^^^^^
24+
source.ts meta.var.expr.ts storage.type.ts
25+
^
26+
source.ts meta.var.expr.ts
27+
^^^^^^^^^^^^^^^^^^^^^^^^
28+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.definition.variable.ts variable.other.constant.ts entity.name.function.ts
29+
^
30+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts
31+
^
32+
source.ts meta.var.expr.ts keyword.operator.assignment.ts
33+
^
34+
source.ts meta.var.expr.ts meta.arrow.ts
35+
^
36+
source.ts meta.var.expr.ts meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
37+
^
38+
source.ts meta.var.expr.ts meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.end.ts
39+
^
40+
source.ts meta.var.expr.ts meta.arrow.ts
41+
^^
42+
source.ts meta.var.expr.ts meta.arrow.ts storage.type.function.arrow.ts
43+
^
44+
source.ts meta.var.expr.ts meta.arrow.ts
45+
^
46+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts punctuation.definition.block.ts
47+
> const array = a ?? b ?? c ?? d ?? g;
48+
^^^^
49+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts
50+
^^^^^
51+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts storage.type.ts
52+
^
53+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
54+
^^^^^
55+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.definition.variable.ts variable.other.constant.ts
56+
^
57+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts meta.var-single-variable.expr.ts
58+
^
59+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts keyword.operator.assignment.ts
60+
^
61+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
62+
^
63+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts variable.other.readwrite.ts
64+
^
65+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
66+
^^
67+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts keyword.operator.logical.ts
68+
^
69+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
70+
^
71+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts variable.other.readwrite.ts
72+
^
73+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
74+
^^
75+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts keyword.operator.logical.ts
76+
^
77+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
78+
^
79+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts variable.other.readwrite.ts
80+
^
81+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
82+
^^
83+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts keyword.operator.logical.ts
84+
^
85+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
86+
^
87+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts variable.other.readwrite.ts
88+
^
89+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
90+
^^
91+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts keyword.operator.logical.ts
92+
^
93+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
94+
^
95+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts variable.other.readwrite.ts
96+
^
97+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts punctuation.terminator.statement.ts
98+
>
99+
^^^
100+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts
101+
> /**
102+
^^^^
103+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts
104+
^^^
105+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts comment.block.documentation.ts punctuation.definition.comment.ts
106+
> * No TypeEror, but syntax highlighting is broken
107+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
108+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts comment.block.documentation.ts
109+
> */
110+
^^^^^
111+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts comment.block.documentation.ts
112+
^^
113+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts comment.block.documentation.ts punctuation.definition.comment.ts
114+
> const test = a ?? b ?? c ?? d ?? g;
115+
^^^^
116+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts
117+
^^^^^
118+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts storage.type.ts
119+
^
120+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
121+
^^^^
122+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.definition.variable.ts variable.other.constant.ts
123+
^
124+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts meta.var-single-variable.expr.ts
125+
^
126+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts keyword.operator.assignment.ts
127+
^
128+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
129+
^
130+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts variable.other.readwrite.ts
131+
^
132+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
133+
^^
134+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts keyword.operator.logical.ts
135+
^
136+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
137+
^
138+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts variable.other.readwrite.ts
139+
^
140+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
141+
^^
142+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts keyword.operator.logical.ts
143+
^
144+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
145+
^
146+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts variable.other.readwrite.ts
147+
^
148+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
149+
^^
150+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts keyword.operator.logical.ts
151+
^
152+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
153+
^
154+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts variable.other.readwrite.ts
155+
^
156+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
157+
^^
158+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts keyword.operator.logical.ts
159+
^
160+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
161+
^
162+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts variable.other.readwrite.ts
163+
^
164+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts punctuation.terminator.statement.ts
165+
>
166+
^^^
167+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts
168+
> for (let i = 0; i < array.length; i++) {
169+
^^^^
170+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts
171+
^^^
172+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts keyword.control.loop.ts
173+
^
174+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts
175+
^
176+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.brace.round.ts
177+
^^^
178+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts storage.type.ts
179+
^
180+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
181+
^
182+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.definition.variable.ts variable.other.readwrite.ts
183+
^
184+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts meta.var-single-variable.expr.ts
185+
^
186+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts keyword.operator.assignment.ts
187+
^
188+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts
189+
^
190+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.var.expr.ts constant.numeric.decimal.ts
191+
^
192+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts punctuation.terminator.statement.ts
193+
^
194+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts
195+
^
196+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts variable.other.readwrite.ts
197+
^
198+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts
199+
^
200+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts keyword.operator.relational.ts
201+
^
202+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts
203+
^^^^^
204+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts variable.other.object.ts
205+
^
206+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts punctuation.accessor.ts
207+
^^^^^^
208+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts support.variable.property.ts
209+
^
210+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts punctuation.terminator.statement.ts
211+
^
212+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts
213+
^
214+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts variable.other.readwrite.ts
215+
^^
216+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts keyword.operator.increment.ts
217+
^
218+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.brace.round.ts
219+
^
220+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts
221+
^
222+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts punctuation.definition.block.ts
223+
> console.log(array[i]);
224+
^^^^^^
225+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts
226+
^^^^^^^
227+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts meta.function-call.ts support.class.console.ts
228+
^
229+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts meta.function-call.ts punctuation.accessor.ts
230+
^^^
231+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts meta.function-call.ts support.function.console.ts
232+
^
233+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts meta.brace.round.ts
234+
^^^^^
235+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts variable.other.readwrite.ts
236+
^
237+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts meta.array.literal.ts meta.brace.square.ts
238+
^
239+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts meta.array.literal.ts variable.other.readwrite.ts
240+
^
241+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts meta.array.literal.ts meta.brace.square.ts
242+
^
243+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts meta.brace.round.ts
244+
^
245+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts punctuation.terminator.statement.ts
246+
> }
247+
^^^^
248+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts
249+
^
250+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts meta.block.ts punctuation.definition.block.ts
251+
> };
252+
^^
253+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts
254+
^
255+
source.ts meta.var.expr.ts meta.arrow.ts meta.block.ts punctuation.definition.block.ts
256+
^
257+
source.ts punctuation.terminator.statement.ts
258+
>
259+
^^^
260+
source.ts
261+
> brokenSyntaxHighlighting();
262+
^^
263+
source.ts
264+
^^^^^^^^^^^^^^^^^^^^^^^^
265+
source.ts meta.function-call.ts entity.name.function.ts
266+
^
267+
source.ts meta.brace.round.ts
268+
^
269+
source.ts meta.brace.round.ts
270+
^
271+
source.ts punctuation.terminator.statement.ts
272+
>
273+
^^^
274+
source.ts

tests/cases/issue522_1.ts

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
const brokenSyntaxHighlighting = () => {
2+
const array = a ?? b ?? c ?? d ?? g;
3+
4+
/**
5+
* No TypeEror, but syntax highlighting is broken
6+
*/
7+
const test = a ?? b ?? c ?? d ?? g;
8+
9+
for (let i = 0; i < array.length; i++) {
10+
console.log(array[i]);
11+
}
12+
};
13+
14+
brokenSyntaxHighlighting();
15+

0 commit comments

Comments
 (0)