Skip to content

Commit 82ac7df

Browse files
committed
Arrow function bodies and minimal return type support
1 parent 9c1006c commit 82ac7df

25 files changed

+801
-286
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -462,9 +462,13 @@ repository:
462462
'2': { name: keyword.operator.optional.ts }
463463
end: '(?=\}|;|,|$)|(?<=\})'
464464
patterns:
465-
- include: '#ternary-expression'
466-
- include: '#type-annotation'
467-
- include: '#expression'
465+
- include: '#variable-initializer'
466+
- begin: \G
467+
end: (?!\G)(?=[};,=]|$)|(?<=\})
468+
patterns:
469+
- include: '#type-annotation'
470+
- include: '#string'
471+
- include: '#comment'
468472

469473
method-declaration:
470474
name: meta.method.declaration.ts
@@ -577,17 +581,6 @@ repository:
577581
patterns:
578582
- include: '#statements'
579583

580-
arrow-body:
581-
name: meta.block.ts
582-
begin: (?<==>)\s*(\{)
583-
beginCaptures:
584-
'1': { name: punctuation.definition.block.ts }
585-
end: \}
586-
endCaptures:
587-
'0': { name: punctuation.definition.block.ts }
588-
patterns:
589-
- include: '#statements'
590-
591584
after-operator-block:
592585
name: meta.object-literal.ts
593586
begin: (?<=[=(:,\[?+!]|^|await|return|yield|throw|in|of|typeof|&&|\|\|)\s*(\{)
@@ -977,23 +970,33 @@ repository:
977970
'1': { name: storage.modifier.async.ts }
978971
# paramters of the arrow
979972
- name: meta.arrow.ts
980-
match: ([_$[:alpha:]][_$[:alnum:]]*)\s*(=>)
973+
match: ([_$[:alpha:]][_$[:alnum:]]*)\s*(?==>)
981974
captures:
982975
'1': { name: variable.parameter.ts }
983-
'2': { name: storage.type.function.arrow.ts }
984976
- name: meta.arrow.ts
985-
begin: (?x)(?<=return|throw|yield|await|async|[=(,:>])\s*(?=\(([^()]+|\([^()]*\))*\)\s*=>)
986-
end: =>
987-
endCaptures:
988-
'0': { name: storage.type.function.arrow.ts }
977+
begin: (?x)(?<=return|throw|yield|await|async|[=(,:>])\s*(?=\(([^()]+|\([^()]*\))*\)(\s*:\s*(.)*)?\s*=>)
978+
end: (?==>)
989979
patterns:
990980
- include: '#function-parameters'
991-
# TODO: return type of the arrow
992-
# arrow operator for anything that doesnt get captured by above regex
993-
- name: storage.type.function.arrow.ts
994-
match: =>
995-
# body
996-
- include: '#arrow-body'
981+
# return type of the arrow
982+
- include: '#arrow-return-type'
983+
# arrow operator
984+
- name: meta.arrow.ts
985+
begin: =>
986+
beginCaptures:
987+
'0': { name: storage.type.function.arrow.ts }
988+
end: (?<=\})|((?!\{)(?=\S))
989+
patterns:
990+
- include: '#decl-block'
991+
- include: '#expression'
992+
993+
arrow-return-type:
994+
name: meta.return.type.arrow.ts
995+
begin: '(?<=\))\s*:'
996+
end: (?<!:)((?=$)|(?==>|;|//))
997+
patterns:
998+
# TODO: handle the fn and constructor type specifically.
999+
- include: '#type'
9971000

9981001
paren-expression:
9991002
begin: \(

TypeScript.tmLanguage

Lines changed: 60 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -148,38 +148,6 @@
148148
</dict>
149149
</array>
150150
</dict>
151-
<key>arrow-body</key>
152-
<dict>
153-
<key>begin</key>
154-
<string>(?&lt;==&gt;)\s*(\{)</string>
155-
<key>beginCaptures</key>
156-
<dict>
157-
<key>1</key>
158-
<dict>
159-
<key>name</key>
160-
<string>punctuation.definition.block.ts</string>
161-
</dict>
162-
</dict>
163-
<key>end</key>
164-
<string>\}</string>
165-
<key>endCaptures</key>
166-
<dict>
167-
<key>0</key>
168-
<dict>
169-
<key>name</key>
170-
<string>punctuation.definition.block.ts</string>
171-
</dict>
172-
</dict>
173-
<key>name</key>
174-
<string>meta.block.ts</string>
175-
<key>patterns</key>
176-
<array>
177-
<dict>
178-
<key>include</key>
179-
<string>#statements</string>
180-
</dict>
181-
</array>
182-
</dict>
183151
<key>arrow-function</key>
184152
<dict>
185153
<key>patterns</key>
@@ -206,49 +174,73 @@
206174
<key>name</key>
207175
<string>variable.parameter.ts</string>
208176
</dict>
209-
<key>2</key>
210-
<dict>
211-
<key>name</key>
212-
<string>storage.type.function.arrow.ts</string>
213-
</dict>
214177
</dict>
215178
<key>match</key>
216-
<string>([_$[:alpha:]][_$[:alnum:]]*)\s*(=&gt;)</string>
179+
<string>([_$[:alpha:]][_$[:alnum:]]*)\s*(?==&gt;)</string>
217180
<key>name</key>
218181
<string>meta.arrow.ts</string>
219182
</dict>
220183
<dict>
221184
<key>begin</key>
222-
<string>(?x)(?&lt;=return|throw|yield|await|async|[=(,:&gt;])\s*(?=\(([^()]+|\([^()]*\))*\)\s*=&gt;)</string>
185+
<string>(?x)(?&lt;=return|throw|yield|await|async|[=(,:&gt;])\s*(?=\(([^()]+|\([^()]*\))*\)(\s*:\s*(.)*)?\s*=&gt;)</string>
223186
<key>end</key>
187+
<string>(?==&gt;)</string>
188+
<key>name</key>
189+
<string>meta.arrow.ts</string>
190+
<key>patterns</key>
191+
<array>
192+
<dict>
193+
<key>include</key>
194+
<string>#function-parameters</string>
195+
</dict>
196+
<dict>
197+
<key>include</key>
198+
<string>#arrow-return-type</string>
199+
</dict>
200+
</array>
201+
</dict>
202+
<dict>
203+
<key>begin</key>
224204
<string>=&gt;</string>
225-
<key>endCaptures</key>
205+
<key>beginCaptures</key>
226206
<dict>
227207
<key>0</key>
228208
<dict>
229209
<key>name</key>
230210
<string>storage.type.function.arrow.ts</string>
231211
</dict>
232212
</dict>
213+
<key>end</key>
214+
<string>(?&lt;=\})|((?!\{)(?=\S))</string>
233215
<key>name</key>
234216
<string>meta.arrow.ts</string>
235217
<key>patterns</key>
236218
<array>
237219
<dict>
238220
<key>include</key>
239-
<string>#function-parameters</string>
221+
<string>#decl-block</string>
222+
</dict>
223+
<dict>
224+
<key>include</key>
225+
<string>#expression</string>
240226
</dict>
241227
</array>
242228
</dict>
243-
<dict>
244-
<key>match</key>
245-
<string>=&gt;</string>
246-
<key>name</key>
247-
<string>storage.type.function.arrow.ts</string>
248-
</dict>
229+
</array>
230+
</dict>
231+
<key>arrow-return-type</key>
232+
<dict>
233+
<key>begin</key>
234+
<string>(?&lt;=\))\s*:</string>
235+
<key>end</key>
236+
<string>(?&lt;!:)((?=$)|(?==&gt;|;|//))</string>
237+
<key>name</key>
238+
<string>meta.return.type.arrow.ts</string>
239+
<key>patterns</key>
240+
<array>
249241
<dict>
250242
<key>include</key>
251-
<string>#arrow-body</string>
243+
<string>#type</string>
252244
</dict>
253245
</array>
254246
</dict>
@@ -1282,15 +1274,28 @@
12821274
<array>
12831275
<dict>
12841276
<key>include</key>
1285-
<string>#ternary-expression</string>
1286-
</dict>
1287-
<dict>
1288-
<key>include</key>
1289-
<string>#type-annotation</string>
1277+
<string>#variable-initializer</string>
12901278
</dict>
12911279
<dict>
1292-
<key>include</key>
1293-
<string>#expression</string>
1280+
<key>begin</key>
1281+
<string>\G</string>
1282+
<key>end</key>
1283+
<string>(?!\G)(?=[};,=]|$)|(?&lt;=\})</string>
1284+
<key>patterns</key>
1285+
<array>
1286+
<dict>
1287+
<key>include</key>
1288+
<string>#type-annotation</string>
1289+
</dict>
1290+
<dict>
1291+
<key>include</key>
1292+
<string>#string</string>
1293+
</dict>
1294+
<dict>
1295+
<key>include</key>
1296+
<string>#comment</string>
1297+
</dict>
1298+
</array>
12941299
</dict>
12951300
</array>
12961301
</dict>

TypeScriptReact.YAML-tmLanguage

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -466,9 +466,13 @@ repository:
466466
'2': { name: keyword.operator.optional.tsx }
467467
end: '(?=\}|;|,|$)|(?<=\})'
468468
patterns:
469-
- include: '#ternary-expression'
470-
- include: '#type-annotation'
471-
- include: '#expression'
469+
- include: '#variable-initializer'
470+
- begin: \G
471+
end: (?!\G)(?=[};,=]|$)|(?<=\})
472+
patterns:
473+
- include: '#type-annotation'
474+
- include: '#string'
475+
- include: '#comment'
472476

473477
method-declaration:
474478
name: meta.method.declaration.tsx
@@ -581,17 +585,6 @@ repository:
581585
patterns:
582586
- include: '#statements'
583587

584-
arrow-body:
585-
name: meta.block.tsx
586-
begin: (?<==>)\s*(\{)
587-
beginCaptures:
588-
'1': { name: punctuation.definition.block.tsx }
589-
end: \}
590-
endCaptures:
591-
'0': { name: punctuation.definition.block.tsx }
592-
patterns:
593-
- include: '#statements'
594-
595588
after-operator-block:
596589
name: meta.object-literal.tsx
597590
begin: (?<=[=(:,\[?+!]|^|await|return|yield|throw|in|of|typeof|&&|\|\|)\s*(\{)
@@ -961,29 +954,39 @@ repository:
961954
arrow-function:
962955
patterns:
963956
# TODO: type parameter of arrow
964-
- name: meta.arrow.ts
957+
- name: meta.arrow.tsx
965958
match: (\basync)(?=\s*[<(])
966959
captures:
967960
'1': { name: storage.modifier.async.tsx }
968961
# paramters of the arrow
969962
- name: meta.arrow.tsx
970-
match: ([_$[:alpha:]][_$[:alnum:]]*)\s*(=>)
963+
match: ([_$[:alpha:]][_$[:alnum:]]*)\s*(?==>)
971964
captures:
972965
'1': { name: variable.parameter.tsx }
973-
'2': { name: storage.type.function.arrow.tsx }
974966
- name: meta.arrow.tsx
975-
begin: (?x)(?<=return|throw|yield|await|async|[=(,:>])\s*(?=\(([^()]+|\([^()]*\))*\)\s*=>)
976-
end: =>
977-
endCaptures:
978-
'0': { name: storage.type.function.arrow.tsx }
967+
begin: (?x)(?<=return|throw|yield|await|async|[=(,:>])\s*(?=\(([^()]+|\([^()]*\))*\)(\s*:\s*(.)*)?\s*=>)
968+
end: (?==>)
979969
patterns:
980970
- include: '#function-parameters'
981-
# TODO: return type of the arrow
982-
# arrow operator for anything that doesnt get captured by above regex
983-
- name: storage.type.function.arrow.tsx
984-
match: =>
985-
# body
986-
- include: '#arrow-body'
971+
# return type of the arrow
972+
- include: '#arrow-return-type'
973+
# arrow operator
974+
- name: meta.arrow.tsx
975+
begin: =>
976+
beginCaptures:
977+
'0': { name: storage.type.function.arrow.tsx }
978+
end: (?<=\})|((?!\{)(?=\S))
979+
patterns:
980+
- include: '#decl-block'
981+
- include: '#expression'
982+
983+
arrow-return-type:
984+
name: meta.return.type.arrow.tsx
985+
begin: '(?<=\))\s*:'
986+
end: (?<!:)((?=$)|(?==>|;|//))
987+
patterns:
988+
# TODO: handle the fn and constructor type specifically.
989+
- include: '#type'
987990

988991
paren-expression:
989992
begin: \(

0 commit comments

Comments
 (0)