Skip to content

Commit 349fb33

Browse files
committed
Support labels
Fixes #610
1 parent a9055b1 commit 349fb33

File tree

5 files changed

+244
-1
lines changed

5 files changed

+244
-1
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ variables:
1414
constantIdentifier: '[[:upper:]][_$[:digit:][:upper:]]*'
1515
quotedStrings: (\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")
1616
nonIdentifierPropertyName: '{{quotedStrings}}|(\[([^\[\]]|\[[^\[\]]*\])+\])'
17+
label: ({{identifier}})\s*(:)
1718
hexNumber: \b(?<!\$)0(x|X)[0-9a-fA-F][0-9a-fA-F_]*\b(?!\$)
1819
binaryNumber: \b(?<!\$)0(b|B)[01][01_]*\b(?!\$)
1920
octalNumber: \b(?<!\$)0(o|O)?[0-7][0-7_]*\b(?!\$)
@@ -130,7 +131,7 @@ repository:
130131
- include: '#control-statement'
131132
- include: '#after-operator-block-as-object-literal'
132133
- include: '#decl-block'
133-
# add label
134+
- include: '#label'
134135
- include: '#expression'
135136
- include: '#punctuation-semicolon'
136137

@@ -169,6 +170,21 @@ repository:
169170
- name: storage.modifier.ts
170171
match: '{{startOfIdentifier}}(declare){{endOfIdentifier}}'
171172

173+
label:
174+
patterns:
175+
# handle declaration block followed by label so as to not confuse it with { followed by ternary operator which would be object literal
176+
- begin: '{{label}}(?=\s*\{)'
177+
beginCaptures:
178+
'1': { name: entity.name.label.ts }
179+
'2': { name: punctuation.separator.label.ts }
180+
end: (?<=\{)
181+
patterns:
182+
- include: '#decl-block'
183+
- match: '{{label}}'
184+
captures:
185+
'1': { name: entity.name.label.ts }
186+
'2': { name: punctuation.separator.label.ts }
187+
172188
expression:
173189
patterns:
174190
- include: '#expressionWithoutIdentifiers'

TypeScript.tmLanguage

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@
7171
<key>include</key>
7272
<string>#decl-block</string>
7373
</dict>
74+
<dict>
75+
<key>include</key>
76+
<string>#label</string>
77+
</dict>
7478
<dict>
7579
<key>include</key>
7680
<string>#expression</string>
@@ -193,6 +197,55 @@
193197
</dict>
194198
</array>
195199
</dict>
200+
<key>label</key>
201+
<dict>
202+
<key>patterns</key>
203+
<array>
204+
<dict>
205+
<key>begin</key>
206+
<string>([_$[:alpha:]][_$[:alnum:]]*)\s*(:)(?=\s*\{)</string>
207+
<key>beginCaptures</key>
208+
<dict>
209+
<key>1</key>
210+
<dict>
211+
<key>name</key>
212+
<string>entity.name.label.ts</string>
213+
</dict>
214+
<key>2</key>
215+
<dict>
216+
<key>name</key>
217+
<string>punctuation.separator.label.ts</string>
218+
</dict>
219+
</dict>
220+
<key>end</key>
221+
<string>(?&lt;=\{)</string>
222+
<key>patterns</key>
223+
<array>
224+
<dict>
225+
<key>include</key>
226+
<string>#decl-block</string>
227+
</dict>
228+
</array>
229+
</dict>
230+
<dict>
231+
<key>match</key>
232+
<string>([_$[:alpha:]][_$[:alnum:]]*)\s*(:)</string>
233+
<key>captures</key>
234+
<dict>
235+
<key>1</key>
236+
<dict>
237+
<key>name</key>
238+
<string>entity.name.label.ts</string>
239+
</dict>
240+
<key>2</key>
241+
<dict>
242+
<key>name</key>
243+
<string>punctuation.separator.label.ts</string>
244+
</dict>
245+
</dict>
246+
</dict>
247+
</array>
248+
</dict>
196249
<key>expression</key>
197250
<dict>
198251
<key>patterns</key>

TypeScriptReact.tmLanguage

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@
7171
<key>include</key>
7272
<string>#decl-block</string>
7373
</dict>
74+
<dict>
75+
<key>include</key>
76+
<string>#label</string>
77+
</dict>
7478
<dict>
7579
<key>include</key>
7680
<string>#expression</string>
@@ -193,6 +197,55 @@
193197
</dict>
194198
</array>
195199
</dict>
200+
<key>label</key>
201+
<dict>
202+
<key>patterns</key>
203+
<array>
204+
<dict>
205+
<key>begin</key>
206+
<string>([_$[:alpha:]][_$[:alnum:]]*)\s*(:)(?=\s*\{)</string>
207+
<key>beginCaptures</key>
208+
<dict>
209+
<key>1</key>
210+
<dict>
211+
<key>name</key>
212+
<string>entity.name.label.tsx</string>
213+
</dict>
214+
<key>2</key>
215+
<dict>
216+
<key>name</key>
217+
<string>punctuation.separator.label.tsx</string>
218+
</dict>
219+
</dict>
220+
<key>end</key>
221+
<string>(?&lt;=\{)</string>
222+
<key>patterns</key>
223+
<array>
224+
<dict>
225+
<key>include</key>
226+
<string>#decl-block</string>
227+
</dict>
228+
</array>
229+
</dict>
230+
<dict>
231+
<key>match</key>
232+
<string>([_$[:alpha:]][_$[:alnum:]]*)\s*(:)</string>
233+
<key>captures</key>
234+
<dict>
235+
<key>1</key>
236+
<dict>
237+
<key>name</key>
238+
<string>entity.name.label.tsx</string>
239+
</dict>
240+
<key>2</key>
241+
<dict>
242+
<key>name</key>
243+
<string>punctuation.separator.label.tsx</string>
244+
</dict>
245+
</dict>
246+
</dict>
247+
</array>
248+
</dict>
196249
<key>expression</key>
197250
<dict>
198251
<key>patterns</key>

tests/baselines/Issue610.baseline.txt

Lines changed: 112 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,112 @@
1+
original file
2+
-----------------------------------
3+
class Test {
4+
constructor() {
5+
hola: {
6+
const x = 1;
7+
console.log('bad highlight');
8+
break hola;
9+
}
10+
}
11+
}
12+
-----------------------------------
13+
14+
Grammar: TypeScript.tmLanguage
15+
-----------------------------------
16+
>class Test {
17+
^^^^^
18+
source.ts meta.class.ts storage.type.class.ts
19+
^
20+
source.ts meta.class.ts
21+
^^^^
22+
source.ts meta.class.ts entity.name.type.class.ts
23+
^
24+
source.ts meta.class.ts
25+
^
26+
source.ts meta.class.ts punctuation.definition.block.ts
27+
> constructor() {
28+
^^
29+
source.ts meta.class.ts
30+
^^^^^^^^^^^
31+
source.ts meta.class.ts meta.method.declaration.ts storage.type.ts
32+
^
33+
source.ts meta.class.ts meta.method.declaration.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
34+
^
35+
source.ts meta.class.ts meta.method.declaration.ts meta.parameters.ts punctuation.definition.parameters.end.ts
36+
^
37+
source.ts meta.class.ts meta.method.declaration.ts
38+
^
39+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts punctuation.definition.block.ts
40+
> hola: {
41+
^^^^
42+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts
43+
^^^^
44+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts entity.name.label.ts
45+
^
46+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts punctuation.separator.label.ts
47+
^
48+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts
49+
^
50+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts punctuation.definition.block.ts
51+
> const x = 1;
52+
^^^^^^
53+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts
54+
^^^^^
55+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts meta.var.expr.ts storage.type.ts
56+
^
57+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts meta.var.expr.ts
58+
^
59+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.definition.variable.ts variable.other.readwrite.ts
60+
^
61+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts meta.var.expr.ts meta.var-single-variable.expr.ts
62+
^
63+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts meta.var.expr.ts keyword.operator.assignment.ts
64+
^
65+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts meta.var.expr.ts
66+
^
67+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts meta.var.expr.ts constant.numeric.decimal.ts
68+
^
69+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts punctuation.terminator.statement.ts
70+
> console.log('bad highlight');
71+
^^^^^^
72+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts
73+
^^^^^^^
74+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts meta.function-call.ts support.class.console.ts
75+
^
76+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts meta.function-call.ts punctuation.accessor.ts
77+
^^^
78+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts meta.function-call.ts support.function.console.ts
79+
^
80+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts meta.brace.round.ts
81+
^
82+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts string.quoted.single.ts punctuation.definition.string.begin.ts
83+
^^^^^^^^^^^^^
84+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts string.quoted.single.ts
85+
^
86+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts string.quoted.single.ts punctuation.definition.string.end.ts
87+
^
88+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts meta.brace.round.ts
89+
^
90+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts punctuation.terminator.statement.ts
91+
> break hola;
92+
^^^^^^
93+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts
94+
^^^^^
95+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts keyword.control.loop.ts
96+
^
97+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts
98+
^^^^
99+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts variable.other.readwrite.ts
100+
^
101+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts punctuation.terminator.statement.ts
102+
> }
103+
^^^^
104+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts
105+
^
106+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts meta.block.ts punctuation.definition.block.ts
107+
> }
108+
^^^^
109+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts
110+
>}
111+
^^
112+
source.ts meta.class.ts meta.method.declaration.ts meta.block.ts

tests/cases/Issue610.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
class Test {
2+
constructor() {
3+
hola: {
4+
const x = 1;
5+
console.log('bad highlight');
6+
break hola;
7+
}
8+
}
9+
}

0 commit comments

Comments
 (0)