Skip to content

Commit 9f36bf2

Browse files
committed
Add support for definite assignment operator
Fixes #701
1 parent de48df2 commit 9f36bf2

File tree

5 files changed

+155
-18
lines changed

5 files changed

+155
-18
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -305,23 +305,26 @@ repository:
305305
patterns:
306306
- name: meta.var-single-variable.expr.ts
307307
begin: |-
308-
(?x)({{identifier}})(?={{functionLikeAssignmentOrType}})
308+
(?x)({{identifier}})(\!)?(?={{functionLikeAssignmentOrType}})
309309
beginCaptures:
310310
'1': { name: meta.definition.variable.ts entity.name.function.ts }
311+
'2': { name: keyword.operator.definiteassignment.ts }
311312
end: (?=$|^|[;,=}]|(\s+(of|in)\s+))
312313
patterns:
313314
- include: '#var-single-variable-type-annotation'
314315
- name: meta.var-single-variable.expr.ts
315-
begin: '{{constantVar}}'
316+
begin: '{{constantVar}}(\!)?'
316317
beginCaptures:
317318
'1': { name: meta.definition.variable.ts variable.other.constant.ts }
319+
'2': { name: keyword.operator.definiteassignment.ts }
318320
end: (?=$|^|[;,=}]|(\s+(of|in)\s+))
319321
patterns:
320322
- include: '#var-single-variable-type-annotation'
321323
- name: meta.var-single-variable.expr.ts
322-
begin: ({{identifier}})
324+
begin: ({{identifier}})(\!)?
323325
beginCaptures:
324326
'1': { name: meta.definition.variable.ts variable.other.readwrite.ts }
327+
'2': { name: keyword.operator.definiteassignment.ts }
325328
end: (?=$|^|[;,=}]|(\s+(of|in)\s+))
326329
patterns:
327330
- include: '#var-single-variable-type-annotation'
@@ -599,10 +602,10 @@ repository:
599602

600603
field-declaration:
601604
name: meta.field.declaration.ts
602-
begin: (?x)(?<!\()(?:{{startOfIdentifier}}(readonly)\s+)?(?=\s*{{propertyName}}\s*(\?\s*)?(=|:|;|,|$))
605+
begin: (?x)(?<!\()(?:{{startOfIdentifier}}(readonly)\s+)?(?=\s*{{propertyName}}\s*(?:(?:(\?)|(\!))\s*)?(=|:|;|,|$))
603606
beginCaptures:
604607
'1': { name: storage.modifier.ts }
605-
end: (?x)(?=\}|;|,|$|(^(?!\s*{{propertyName}}\s*(\?\s*)?(=|:|;|,|$))))|(?<=\})
608+
end: (?x)(?=\}|;|,|$|(^(?!\s*{{propertyName}}\s*(?:(?:(\?)|(\!))\s*)?(=|:|;|,|$))))|(?<=\})
606609
patterns:
607610
- include: '#variable-initializer'
608611
- include: '#type-annotation'
@@ -613,14 +616,17 @@ repository:
613616
# function assignment |
614617
# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>
615618
- match: |-
616-
(?x)({{identifier}})(\?)?(?=(\?\s*)?{{functionLikeAssignmentOrType}})
619+
(?x)({{identifier}})(?:(\?)|(\!))?(?=\s*{{functionLikeAssignmentOrType}})
617620
captures:
618621
'1': { name: meta.definition.property.ts entity.name.function.ts }
619622
'2': { name: keyword.operator.optional.ts }
623+
'3': { name: keyword.operator.definiteassignment.ts }
620624
- name: meta.definition.property.ts variable.object.property.ts
621625
match: '{{identifier}}'
622626
- name: keyword.operator.optional.ts
623627
match: \?
628+
- name: keyword.operator.definiteassignment.ts
629+
match: \!
624630

625631
variable-initializer:
626632
patterns:

TypeScript.tmLanguage

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@
611611
<key>name</key>
612612
<string>meta.var-single-variable.expr.ts</string>
613613
<key>begin</key>
614-
<string>(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\s*
614+
<string>(?x)([_$[:alpha:]][_$[:alnum:]]*)(\!)?(?=\s*
615615
# function assignment |
616616
(=\s*(
617617
((async\s+)?(
@@ -691,6 +691,11 @@
691691
<key>name</key>
692692
<string>meta.definition.variable.ts entity.name.function.ts</string>
693693
</dict>
694+
<key>2</key>
695+
<dict>
696+
<key>name</key>
697+
<string>keyword.operator.definiteassignment.ts</string>
698+
</dict>
694699
</dict>
695700
<key>end</key>
696701
<string>(?=$|^|[;,=}]|(\s+(of|in)\s+))</string>
@@ -706,14 +711,19 @@
706711
<key>name</key>
707712
<string>meta.var-single-variable.expr.ts</string>
708713
<key>begin</key>
709-
<string>([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])</string>
714+
<string>([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])(\!)?</string>
710715
<key>beginCaptures</key>
711716
<dict>
712717
<key>1</key>
713718
<dict>
714719
<key>name</key>
715720
<string>meta.definition.variable.ts variable.other.constant.ts</string>
716721
</dict>
722+
<key>2</key>
723+
<dict>
724+
<key>name</key>
725+
<string>keyword.operator.definiteassignment.ts</string>
726+
</dict>
717727
</dict>
718728
<key>end</key>
719729
<string>(?=$|^|[;,=}]|(\s+(of|in)\s+))</string>
@@ -729,14 +739,19 @@
729739
<key>name</key>
730740
<string>meta.var-single-variable.expr.ts</string>
731741
<key>begin</key>
732-
<string>([_$[:alpha:]][_$[:alnum:]]*)</string>
742+
<string>([_$[:alpha:]][_$[:alnum:]]*)(\!)?</string>
733743
<key>beginCaptures</key>
734744
<dict>
735745
<key>1</key>
736746
<dict>
737747
<key>name</key>
738748
<string>meta.definition.variable.ts variable.other.readwrite.ts</string>
739749
</dict>
750+
<key>2</key>
751+
<dict>
752+
<key>name</key>
753+
<string>keyword.operator.definiteassignment.ts</string>
754+
</dict>
740755
</dict>
741756
<key>end</key>
742757
<string>(?=$|^|[;,=}]|(\s+(of|in)\s+))</string>
@@ -1813,7 +1828,7 @@
18131828
(?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
18141829
(?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
18151830
(?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1816-
)(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\`([^\`\\]|\\\`|\\)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\?\s*)?(=|:|;|,|$))</string>
1831+
)(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\`([^\`\\]|\\\`|\\)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(?:(?:(\?)|(\!))\s*)?(=|:|;|,|$))</string>
18171832
<key>beginCaptures</key>
18181833
<dict>
18191834
<key>1</key>
@@ -1832,7 +1847,7 @@
18321847
(?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
18331848
(?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
18341849
(?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1835-
)(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\`([^\`\\]|\\\`|\\)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\?\s*)?(=|:|;|,|$))))|(?&lt;=\})</string>
1850+
)(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\`([^\`\\]|\\\`|\\)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(?:(?:(\?)|(\!))\s*)?(=|:|;|,|$))))|(?&lt;=\})</string>
18361851
<key>patterns</key>
18371852
<array>
18381853
<dict>
@@ -1861,7 +1876,7 @@
18611876
</dict>
18621877
<dict>
18631878
<key>match</key>
1864-
<string>(?x)([_$[:alpha:]][_$[:alnum:]]*)(\?)?(?=(\?\s*)?\s*
1879+
<string>(?x)([_$[:alpha:]][_$[:alnum:]]*)(?:(\?)|(\!))?(?=\s*\s*
18651880
# function assignment |
18661881
(=\s*(
18671882
((async\s+)?(
@@ -1946,6 +1961,11 @@
19461961
<key>name</key>
19471962
<string>keyword.operator.optional.ts</string>
19481963
</dict>
1964+
<key>3</key>
1965+
<dict>
1966+
<key>name</key>
1967+
<string>keyword.operator.definiteassignment.ts</string>
1968+
</dict>
19491969
</dict>
19501970
</dict>
19511971
<dict>
@@ -1960,6 +1980,12 @@
19601980
<key>match</key>
19611981
<string>\?</string>
19621982
</dict>
1983+
<dict>
1984+
<key>name</key>
1985+
<string>keyword.operator.definiteassignment.ts</string>
1986+
<key>match</key>
1987+
<string>\!</string>
1988+
</dict>
19631989
</array>
19641990
</dict>
19651991
<key>variable-initializer</key>

TypeScriptReact.tmLanguage

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -615,7 +615,7 @@
615615
<key>name</key>
616616
<string>meta.var-single-variable.expr.tsx</string>
617617
<key>begin</key>
618-
<string>(?x)([_$[:alpha:]][_$[:alnum:]]*)(?=\s*
618+
<string>(?x)([_$[:alpha:]][_$[:alnum:]]*)(\!)?(?=\s*
619619
# function assignment |
620620
(=\s*(
621621
((async\s+)?(
@@ -695,6 +695,11 @@
695695
<key>name</key>
696696
<string>meta.definition.variable.tsx entity.name.function.tsx</string>
697697
</dict>
698+
<key>2</key>
699+
<dict>
700+
<key>name</key>
701+
<string>keyword.operator.definiteassignment.tsx</string>
702+
</dict>
698703
</dict>
699704
<key>end</key>
700705
<string>(?=$|^|[;,=}]|(\s+(of|in)\s+))</string>
@@ -710,14 +715,19 @@
710715
<key>name</key>
711716
<string>meta.var-single-variable.expr.tsx</string>
712717
<key>begin</key>
713-
<string>([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])</string>
718+
<string>([[:upper:]][_$[:digit:][:upper:]]*)(?![_$[:alnum:]])(\!)?</string>
714719
<key>beginCaptures</key>
715720
<dict>
716721
<key>1</key>
717722
<dict>
718723
<key>name</key>
719724
<string>meta.definition.variable.tsx variable.other.constant.tsx</string>
720725
</dict>
726+
<key>2</key>
727+
<dict>
728+
<key>name</key>
729+
<string>keyword.operator.definiteassignment.tsx</string>
730+
</dict>
721731
</dict>
722732
<key>end</key>
723733
<string>(?=$|^|[;,=}]|(\s+(of|in)\s+))</string>
@@ -733,14 +743,19 @@
733743
<key>name</key>
734744
<string>meta.var-single-variable.expr.tsx</string>
735745
<key>begin</key>
736-
<string>([_$[:alpha:]][_$[:alnum:]]*)</string>
746+
<string>([_$[:alpha:]][_$[:alnum:]]*)(\!)?</string>
737747
<key>beginCaptures</key>
738748
<dict>
739749
<key>1</key>
740750
<dict>
741751
<key>name</key>
742752
<string>meta.definition.variable.tsx variable.other.readwrite.tsx</string>
743753
</dict>
754+
<key>2</key>
755+
<dict>
756+
<key>name</key>
757+
<string>keyword.operator.definiteassignment.tsx</string>
758+
</dict>
744759
</dict>
745760
<key>end</key>
746761
<string>(?=$|^|[;,=}]|(\s+(of|in)\s+))</string>
@@ -1817,7 +1832,7 @@
18171832
(?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
18181833
(?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
18191834
(?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1820-
)(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\`([^\`\\]|\\\`|\\)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\?\s*)?(=|:|;|,|$))</string>
1835+
)(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\`([^\`\\]|\\\`|\\)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(?:(?:(\?)|(\!))\s*)?(=|:|;|,|$))</string>
18211836
<key>beginCaptures</key>
18221837
<dict>
18231838
<key>1</key>
@@ -1836,7 +1851,7 @@
18361851
(?:\b[0-9][0-9_]*(\.)(n)?\B)| # 1.
18371852
(?:\B(\.)[0-9][0-9_]*(n)?\b)| # .1
18381853
(?:\b[0-9][0-9_]*(n)?\b(?!\.)) # 1
1839-
)(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\`([^\`\\]|\\\`|\\)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(\?\s*)?(=|:|;|,|$))))|(?&lt;=\})</string>
1854+
)(?!\$))|([_$[:alpha:]][_$[:alnum:]]*)|(\'([^\'\\]|\\\'|\\)*\')|(\"([^\"\\]|\\\"|\\)*\")|(\`([^\`\\]|\\\`|\\)*\`)|(\[([^\[\]]|\[[^\[\]]*\])+\]))\s*(?:(?:(\?)|(\!))\s*)?(=|:|;|,|$))))|(?&lt;=\})</string>
18401855
<key>patterns</key>
18411856
<array>
18421857
<dict>
@@ -1865,7 +1880,7 @@
18651880
</dict>
18661881
<dict>
18671882
<key>match</key>
1868-
<string>(?x)([_$[:alpha:]][_$[:alnum:]]*)(\?)?(?=(\?\s*)?\s*
1883+
<string>(?x)([_$[:alpha:]][_$[:alnum:]]*)(?:(\?)|(\!))?(?=\s*\s*
18691884
# function assignment |
18701885
(=\s*(
18711886
((async\s+)?(
@@ -1950,6 +1965,11 @@
19501965
<key>name</key>
19511966
<string>keyword.operator.optional.tsx</string>
19521967
</dict>
1968+
<key>3</key>
1969+
<dict>
1970+
<key>name</key>
1971+
<string>keyword.operator.definiteassignment.tsx</string>
1972+
</dict>
19531973
</dict>
19541974
</dict>
19551975
<dict>
@@ -1964,6 +1984,12 @@
19641984
<key>match</key>
19651985
<string>\?</string>
19661986
</dict>
1987+
<dict>
1988+
<key>name</key>
1989+
<string>keyword.operator.definiteassignment.tsx</string>
1990+
<key>match</key>
1991+
<string>\!</string>
1992+
</dict>
19671993
</array>
19681994
</dict>
19691995
<key>variable-initializer</key>

tests/baselines/Issue701.baseline.txt

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
original file
2+
-----------------------------------
3+
class Cl {
4+
one?: string;
5+
two!: string;
6+
}
7+
let x! = 1;
8+
-----------------------------------
9+
10+
Grammar: TypeScript.tmLanguage
11+
-----------------------------------
12+
>class Cl {
13+
^^^^^
14+
source.ts meta.class.ts storage.type.class.ts
15+
^
16+
source.ts meta.class.ts
17+
^^
18+
source.ts meta.class.ts entity.name.type.class.ts
19+
^
20+
source.ts meta.class.ts
21+
^
22+
source.ts meta.class.ts punctuation.definition.block.ts
23+
> one?: string;
24+
^^^^
25+
source.ts meta.class.ts meta.field.declaration.ts
26+
^^^
27+
source.ts meta.class.ts meta.field.declaration.ts meta.definition.property.ts variable.object.property.ts
28+
^
29+
source.ts meta.class.ts meta.field.declaration.ts keyword.operator.optional.ts
30+
^
31+
source.ts meta.class.ts meta.field.declaration.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
32+
^
33+
source.ts meta.class.ts meta.field.declaration.ts meta.type.annotation.ts
34+
^^^^^^
35+
source.ts meta.class.ts meta.field.declaration.ts meta.type.annotation.ts support.type.primitive.ts
36+
^
37+
source.ts meta.class.ts punctuation.terminator.statement.ts
38+
> two!: string;
39+
^^^^
40+
source.ts meta.class.ts meta.field.declaration.ts
41+
^^^
42+
source.ts meta.class.ts meta.field.declaration.ts meta.definition.property.ts variable.object.property.ts
43+
^
44+
source.ts meta.class.ts meta.field.declaration.ts keyword.operator.definiteassignment.ts
45+
^
46+
source.ts meta.class.ts meta.field.declaration.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
47+
^
48+
source.ts meta.class.ts meta.field.declaration.ts meta.type.annotation.ts
49+
^^^^^^
50+
source.ts meta.class.ts meta.field.declaration.ts meta.type.annotation.ts support.type.primitive.ts
51+
^
52+
source.ts meta.class.ts punctuation.terminator.statement.ts
53+
>}
54+
^
55+
source.ts meta.class.ts punctuation.definition.block.ts
56+
>let x! = 1;
57+
^^^
58+
source.ts meta.var.expr.ts storage.type.ts
59+
^
60+
source.ts meta.var.expr.ts
61+
^
62+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.definition.variable.ts variable.other.readwrite.ts
63+
^
64+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts keyword.operator.definiteassignment.ts
65+
^
66+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts
67+
^
68+
source.ts meta.var.expr.ts keyword.operator.assignment.ts
69+
^
70+
source.ts meta.var.expr.ts
71+
^
72+
source.ts meta.var.expr.ts constant.numeric.decimal.ts
73+
^
74+
source.ts punctuation.terminator.statement.ts

tests/cases/Issue701.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class Cl {
2+
one?: string;
3+
two!: string;
4+
}
5+
let x! = 1;

0 commit comments

Comments
 (0)