Skip to content

Commit 0b7b9a5

Browse files
committed
Support for modifier operator on mapped type signature
1 parent e375f75 commit 0b7b9a5

File tree

5 files changed

+274
-17
lines changed

5 files changed

+274
-17
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -613,16 +613,18 @@ repository:
613613

614614
indexer-mapped-type-declaration:
615615
name: meta.indexer.mappedtype.declaration.ts
616-
begin: (?:{{startOfIdentifier}}(readonly)\s*)?(\[)\s*({{identifier}})\s+(in)\s+
616+
begin: (?:{{startOfIdentifier}}([+-])?(readonly)\s*)?(\[)\s*({{identifier}})\s+(in)\s+
617617
beginCaptures:
618-
'1': { name: storage.modifier.ts }
619-
'2': { name: meta.brace.square.ts }
620-
'3': { name: entity.name.type.ts }
621-
'4': { name: keyword.operator.expression.in.ts }
622-
end: (\])\s*(\?\s*)?|$
618+
'1': { name: keyword.operator.type.modifier.ts }
619+
'2': { name: storage.modifier.ts }
620+
'3': { name: meta.brace.square.ts }
621+
'4': { name: entity.name.type.ts }
622+
'5': { name: keyword.operator.expression.in.ts }
623+
end: (\])([+-])?\s*(\?\s*)?|$
623624
endCaptures:
624625
'1': { name: meta.brace.square.ts }
625-
'2': { name: keyword.operator.optional.ts }
626+
'2': { name: keyword.operator.type.modifier.ts }
627+
'3': { name: keyword.operator.optional.ts }
626628
patterns:
627629
- include: '#type'
628630

TypeScript.tmLanguage

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1877,32 +1877,37 @@
18771877
<key>name</key>
18781878
<string>meta.indexer.mappedtype.declaration.ts</string>
18791879
<key>begin</key>
1880-
<string>(?:(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(readonly)\s*)?(\[)\s*([_$[:alpha:]][_$[:alnum:]]*)\s+(in)\s+</string>
1880+
<string>(?:(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))([+-])?(readonly)\s*)?(\[)\s*([_$[:alpha:]][_$[:alnum:]]*)\s+(in)\s+</string>
18811881
<key>beginCaptures</key>
18821882
<dict>
18831883
<key>1</key>
18841884
<dict>
18851885
<key>name</key>
1886-
<string>storage.modifier.ts</string>
1886+
<string>keyword.operator.type.modifier.ts</string>
18871887
</dict>
18881888
<key>2</key>
18891889
<dict>
18901890
<key>name</key>
1891-
<string>meta.brace.square.ts</string>
1891+
<string>storage.modifier.ts</string>
18921892
</dict>
18931893
<key>3</key>
18941894
<dict>
18951895
<key>name</key>
1896-
<string>entity.name.type.ts</string>
1896+
<string>meta.brace.square.ts</string>
18971897
</dict>
18981898
<key>4</key>
1899+
<dict>
1900+
<key>name</key>
1901+
<string>entity.name.type.ts</string>
1902+
</dict>
1903+
<key>5</key>
18991904
<dict>
19001905
<key>name</key>
19011906
<string>keyword.operator.expression.in.ts</string>
19021907
</dict>
19031908
</dict>
19041909
<key>end</key>
1905-
<string>(\])\s*(\?\s*)?|$</string>
1910+
<string>(\])([+-])?\s*(\?\s*)?|$</string>
19061911
<key>endCaptures</key>
19071912
<dict>
19081913
<key>1</key>
@@ -1911,6 +1916,11 @@
19111916
<string>meta.brace.square.ts</string>
19121917
</dict>
19131918
<key>2</key>
1919+
<dict>
1920+
<key>name</key>
1921+
<string>keyword.operator.type.modifier.ts</string>
1922+
</dict>
1923+
<key>3</key>
19141924
<dict>
19151925
<key>name</key>
19161926
<string>keyword.operator.optional.ts</string>

TypeScriptReact.tmLanguage

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1881,32 +1881,37 @@
18811881
<key>name</key>
18821882
<string>meta.indexer.mappedtype.declaration.tsx</string>
18831883
<key>begin</key>
1884-
<string>(?:(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(readonly)\s*)?(\[)\s*([_$[:alpha:]][_$[:alnum:]]*)\s+(in)\s+</string>
1884+
<string>(?:(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))([+-])?(readonly)\s*)?(\[)\s*([_$[:alpha:]][_$[:alnum:]]*)\s+(in)\s+</string>
18851885
<key>beginCaptures</key>
18861886
<dict>
18871887
<key>1</key>
18881888
<dict>
18891889
<key>name</key>
1890-
<string>storage.modifier.tsx</string>
1890+
<string>keyword.operator.type.modifier.tsx</string>
18911891
</dict>
18921892
<key>2</key>
18931893
<dict>
18941894
<key>name</key>
1895-
<string>meta.brace.square.tsx</string>
1895+
<string>storage.modifier.tsx</string>
18961896
</dict>
18971897
<key>3</key>
18981898
<dict>
18991899
<key>name</key>
1900-
<string>entity.name.type.tsx</string>
1900+
<string>meta.brace.square.tsx</string>
19011901
</dict>
19021902
<key>4</key>
1903+
<dict>
1904+
<key>name</key>
1905+
<string>entity.name.type.tsx</string>
1906+
</dict>
1907+
<key>5</key>
19031908
<dict>
19041909
<key>name</key>
19051910
<string>keyword.operator.expression.in.tsx</string>
19061911
</dict>
19071912
</dict>
19081913
<key>end</key>
1909-
<string>(\])\s*(\?\s*)?|$</string>
1914+
<string>(\])([+-])?\s*(\?\s*)?|$</string>
19101915
<key>endCaptures</key>
19111916
<dict>
19121917
<key>1</key>
@@ -1915,6 +1920,11 @@
19151920
<string>meta.brace.square.tsx</string>
19161921
</dict>
19171922
<key>2</key>
1923+
<dict>
1924+
<key>name</key>
1925+
<string>keyword.operator.type.modifier.tsx</string>
1926+
</dict>
1927+
<key>3</key>
19181928
<dict>
19191929
<key>name</key>
19201930
<string>keyword.operator.optional.tsx</string>
Lines changed: 226 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,226 @@
1+
original file
2+
-----------------------------------
3+
type Mutable<T> = {
4+
-readonly [P in keyof T]: T[P]
5+
}
6+
type Required<T> = {
7+
[P in keyof T]-?: T[P];
8+
}
9+
type ReadonlyAndPartial<T> = {
10+
+readonly [P in keyof T]+?: T[P];
11+
}
12+
-----------------------------------
13+
14+
Grammar: TypeScript.tmLanguage
15+
-----------------------------------
16+
>type Mutable<T> = {
17+
^^^^
18+
source.ts meta.type.declaration.ts storage.type.type.ts
19+
^
20+
source.ts meta.type.declaration.ts
21+
^^^^^^^
22+
source.ts meta.type.declaration.ts entity.name.type.alias.ts
23+
^
24+
source.ts meta.type.declaration.ts meta.type.parameters.ts punctuation.definition.typeparameters.begin.ts
25+
^
26+
source.ts meta.type.declaration.ts meta.type.parameters.ts entity.name.type.ts
27+
^
28+
source.ts meta.type.declaration.ts meta.type.parameters.ts punctuation.definition.typeparameters.end.ts
29+
^
30+
source.ts meta.type.declaration.ts
31+
^
32+
source.ts meta.type.declaration.ts keyword.operator.assignment.ts
33+
^
34+
source.ts meta.type.declaration.ts
35+
^
36+
source.ts meta.type.declaration.ts meta.object.type.ts punctuation.definition.block.ts
37+
^^
38+
source.ts meta.type.declaration.ts meta.object.type.ts
39+
> -readonly [P in keyof T]: T[P]
40+
^^^^
41+
source.ts meta.type.declaration.ts meta.object.type.ts
42+
^
43+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts keyword.operator.type.modifier.ts
44+
^^^^^^^^
45+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts storage.modifier.ts
46+
^
47+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts
48+
^
49+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts meta.brace.square.ts
50+
^
51+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts entity.name.type.ts
52+
^
53+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts
54+
^^
55+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts keyword.operator.expression.in.ts
56+
^
57+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts
58+
^^^^^
59+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts keyword.operator.expression.keyof.ts
60+
^
61+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts
62+
^
63+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts entity.name.type.ts
64+
^
65+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts meta.brace.square.ts
66+
^
67+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
68+
^
69+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts
70+
^
71+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts entity.name.type.ts
72+
^
73+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts meta.type.tuple.ts meta.brace.square.ts
74+
^
75+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts meta.type.tuple.ts entity.name.type.ts
76+
^
77+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts meta.type.tuple.ts meta.brace.square.ts
78+
^
79+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts
80+
>}
81+
^
82+
source.ts meta.type.declaration.ts meta.object.type.ts punctuation.definition.block.ts
83+
^^
84+
source.ts meta.type.declaration.ts
85+
>type Required<T> = {
86+
^^^^
87+
source.ts meta.type.declaration.ts storage.type.type.ts
88+
^
89+
source.ts meta.type.declaration.ts
90+
^^^^^^^^
91+
source.ts meta.type.declaration.ts entity.name.type.alias.ts
92+
^
93+
source.ts meta.type.declaration.ts meta.type.parameters.ts punctuation.definition.typeparameters.begin.ts
94+
^
95+
source.ts meta.type.declaration.ts meta.type.parameters.ts entity.name.type.ts
96+
^
97+
source.ts meta.type.declaration.ts meta.type.parameters.ts punctuation.definition.typeparameters.end.ts
98+
^
99+
source.ts meta.type.declaration.ts
100+
^
101+
source.ts meta.type.declaration.ts keyword.operator.assignment.ts
102+
^
103+
source.ts meta.type.declaration.ts
104+
^
105+
source.ts meta.type.declaration.ts meta.object.type.ts punctuation.definition.block.ts
106+
^^
107+
source.ts meta.type.declaration.ts meta.object.type.ts
108+
> [P in keyof T]-?: T[P];
109+
^^^^
110+
source.ts meta.type.declaration.ts meta.object.type.ts
111+
^
112+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts meta.brace.square.ts
113+
^
114+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts entity.name.type.ts
115+
^
116+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts
117+
^^
118+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts keyword.operator.expression.in.ts
119+
^
120+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts
121+
^^^^^
122+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts keyword.operator.expression.keyof.ts
123+
^
124+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts
125+
^
126+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts entity.name.type.ts
127+
^
128+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts meta.brace.square.ts
129+
^
130+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts keyword.operator.type.modifier.ts
131+
^
132+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts keyword.operator.optional.ts
133+
^
134+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
135+
^
136+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts
137+
^
138+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts entity.name.type.ts
139+
^
140+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts meta.type.tuple.ts meta.brace.square.ts
141+
^
142+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts meta.type.tuple.ts entity.name.type.ts
143+
^
144+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts meta.type.tuple.ts meta.brace.square.ts
145+
^
146+
source.ts meta.type.declaration.ts meta.object.type.ts punctuation.terminator.statement.ts
147+
^^
148+
source.ts meta.type.declaration.ts meta.object.type.ts
149+
>}
150+
^
151+
source.ts meta.type.declaration.ts meta.object.type.ts punctuation.definition.block.ts
152+
^^
153+
source.ts meta.type.declaration.ts
154+
>type ReadonlyAndPartial<T> = {
155+
^^^^
156+
source.ts meta.type.declaration.ts storage.type.type.ts
157+
^
158+
source.ts meta.type.declaration.ts
159+
^^^^^^^^^^^^^^^^^^
160+
source.ts meta.type.declaration.ts entity.name.type.alias.ts
161+
^
162+
source.ts meta.type.declaration.ts meta.type.parameters.ts punctuation.definition.typeparameters.begin.ts
163+
^
164+
source.ts meta.type.declaration.ts meta.type.parameters.ts entity.name.type.ts
165+
^
166+
source.ts meta.type.declaration.ts meta.type.parameters.ts punctuation.definition.typeparameters.end.ts
167+
^
168+
source.ts meta.type.declaration.ts
169+
^
170+
source.ts meta.type.declaration.ts keyword.operator.assignment.ts
171+
^
172+
source.ts meta.type.declaration.ts
173+
^
174+
source.ts meta.type.declaration.ts meta.object.type.ts punctuation.definition.block.ts
175+
^^
176+
source.ts meta.type.declaration.ts meta.object.type.ts
177+
> +readonly [P in keyof T]+?: T[P];
178+
^^^^
179+
source.ts meta.type.declaration.ts meta.object.type.ts
180+
^
181+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts keyword.operator.type.modifier.ts
182+
^^^^^^^^
183+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts storage.modifier.ts
184+
^
185+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts
186+
^
187+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts meta.brace.square.ts
188+
^
189+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts entity.name.type.ts
190+
^
191+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts
192+
^^
193+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts keyword.operator.expression.in.ts
194+
^
195+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts
196+
^^^^^
197+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts keyword.operator.expression.keyof.ts
198+
^
199+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts
200+
^
201+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts entity.name.type.ts
202+
^
203+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts meta.brace.square.ts
204+
^
205+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts keyword.operator.type.modifier.ts
206+
^
207+
source.ts meta.type.declaration.ts meta.object.type.ts meta.indexer.mappedtype.declaration.ts keyword.operator.optional.ts
208+
^
209+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
210+
^
211+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts
212+
^
213+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts entity.name.type.ts
214+
^
215+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts meta.type.tuple.ts meta.brace.square.ts
216+
^
217+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts meta.type.tuple.ts entity.name.type.ts
218+
^
219+
source.ts meta.type.declaration.ts meta.object.type.ts meta.type.annotation.ts meta.type.tuple.ts meta.brace.square.ts
220+
^
221+
source.ts meta.type.declaration.ts meta.object.type.ts punctuation.terminator.statement.ts
222+
^^
223+
source.ts meta.type.declaration.ts meta.object.type.ts
224+
>}
225+
^
226+
source.ts meta.type.declaration.ts meta.object.type.ts punctuation.definition.block.ts

tests/cases/modifierOperators.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
type Mutable<T> = {
2+
-readonly [P in keyof T]: T[P]
3+
}
4+
type Required<T> = {
5+
[P in keyof T]-?: T[P];
6+
}
7+
type ReadonlyAndPartial<T> = {
8+
+readonly [P in keyof T]+?: T[P];
9+
}

0 commit comments

Comments
 (0)