Skip to content

Commit a63a0fb

Browse files
committed
Support arrow type parameters
1 parent 1c5a0d1 commit a63a0fb

File tree

6 files changed

+192
-23
lines changed

6 files changed

+192
-23
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -166,8 +166,8 @@ repository:
166166
- include: '#literal'
167167
- include: '#function-declaration'
168168
- include: '#class-or-interface-declaration'
169-
- include: '#cast'
170169
- include: '#arrow-function'
170+
- include: '#cast'
171171
- include: '#paren-expression'
172172
- include: '#ternary-expression'
173173
- include: '#new-expr'
@@ -949,8 +949,7 @@ repository:
949949
begin: (?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\s*(:)(?=\s*(
950950
(async\s+)|(function\s+)|
951951
([_$[:alpha:]][_$[:alnum:]]*\s*=>)|
952-
(\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=>)|
953-
(<[^<>]*(\<[^<>]+\>)*[^<>]*(\<[^<>]+\>)*[^<>]*>\s*\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=>))))
952+
((<[^<>]*(\<[^<>]+\>)*[^<>]*(\<[^<>]+\>)*[^<>]*>\s*)?\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=>))))
954953
beginCaptures:
955954
'0': { name: meta.object-literal.key.ts }
956955
'1': { name: entity.name.function.ts }
@@ -1023,21 +1022,22 @@ repository:
10231022

10241023
arrow-function:
10251024
patterns:
1026-
# TODO: type parameter of arrow
10271025
- name: meta.arrow.ts
10281026
match: (?<!\.|\$)(\basync)(?=\s*[<(])
10291027
captures:
10301028
'1': { name: storage.modifier.async.ts }
10311029
# paramters of the arrow
10321030
- name: meta.arrow.ts
1033-
match: ([_$[:alpha:]][_$[:alnum:]]*)\s*(?==>)
1031+
match: (?:(?<!\.|\$)(\basync)\s*)?([_$[:alpha:]][_$[:alnum:]]*)\s*(?==>)
10341032
captures:
1035-
'1': { name: variable.parameter.ts }
1033+
'1': { name: storage.modifier.async.ts }
1034+
'2': { name: variable.parameter.ts }
10361035
- name: meta.arrow.ts
1037-
begin: (?x)(?<=return|throw|yield|await|async|[=(\[,:>*])\s*(?=\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=>)
1036+
begin: (?x)(?<=return|throw|yield|await|async|[=(\[,:>*])\s*(?=(<[^<>]*(\<[^<>]+\>)*[^<>]*(\<[^<>]+\>)*[^<>]*>\s*)?\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=>)
10381037
end: (?==>)
10391038
patterns:
10401039
- include: '#comment'
1040+
- include: '#type-parameters'
10411041
- include: '#function-parameters'
10421042
# return type of the arrow
10431043
- include: '#arrow-return-type'

TypeScript.tmLanguage

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -170,19 +170,24 @@
170170
<key>captures</key>
171171
<dict>
172172
<key>1</key>
173+
<dict>
174+
<key>name</key>
175+
<string>storage.modifier.async.ts</string>
176+
</dict>
177+
<key>2</key>
173178
<dict>
174179
<key>name</key>
175180
<string>variable.parameter.ts</string>
176181
</dict>
177182
</dict>
178183
<key>match</key>
179-
<string>([_$[:alpha:]][_$[:alnum:]]*)\s*(?==&gt;)</string>
184+
<string>(?:(?&lt;!\.|\$)(\basync)\s*)?([_$[:alpha:]][_$[:alnum:]]*)\s*(?==&gt;)</string>
180185
<key>name</key>
181186
<string>meta.arrow.ts</string>
182187
</dict>
183188
<dict>
184189
<key>begin</key>
185-
<string>(?x)(?&lt;=return|throw|yield|await|async|[=(\[,:&gt;*])\s*(?=\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=&gt;)</string>
190+
<string>(?x)(?&lt;=return|throw|yield|await|async|[=(\[,:&gt;*])\s*(?=(&lt;[^&lt;&gt;]*(\&lt;[^&lt;&gt;]+\&gt;)*[^&lt;&gt;]*(\&lt;[^&lt;&gt;]+\&gt;)*[^&lt;&gt;]*&gt;\s*)?\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=&gt;)</string>
186191
<key>end</key>
187192
<string>(?==&gt;)</string>
188193
<key>name</key>
@@ -193,6 +198,10 @@
193198
<key>include</key>
194199
<string>#comment</string>
195200
</dict>
201+
<dict>
202+
<key>include</key>
203+
<string>#type-parameters</string>
204+
</dict>
196205
<dict>
197206
<key>include</key>
198207
<string>#function-parameters</string>
@@ -1185,11 +1194,11 @@
11851194
</dict>
11861195
<dict>
11871196
<key>include</key>
1188-
<string>#cast</string>
1197+
<string>#arrow-function</string>
11891198
</dict>
11901199
<dict>
11911200
<key>include</key>
1192-
<string>#arrow-function</string>
1201+
<string>#cast</string>
11931202
</dict>
11941203
<dict>
11951204
<key>include</key>
@@ -2473,7 +2482,7 @@
24732482
</dict>
24742483
<dict>
24752484
<key>begin</key>
2476-
<string>(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\s*(:)(?=\s*( (async\s+)|(function\s+)| ([_$[:alpha:]][_$[:alnum:]]*\s*=&gt;)| (\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=&gt;)| (&lt;[^&lt;&gt;]*(\&lt;[^&lt;&gt;]+\&gt;)*[^&lt;&gt;]*(\&lt;[^&lt;&gt;]+\&gt;)*[^&lt;&gt;]*&gt;\s*\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=&gt;))))</string>
2485+
<string>(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\s*(:)(?=\s*( (async\s+)|(function\s+)| ([_$[:alpha:]][_$[:alnum:]]*\s*=&gt;)| ((&lt;[^&lt;&gt;]*(\&lt;[^&lt;&gt;]+\&gt;)*[^&lt;&gt;]*(\&lt;[^&lt;&gt;]+\&gt;)*[^&lt;&gt;]*&gt;\s*)?\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=&gt;))))</string>
24772486
<key>beginCaptures</key>
24782487
<dict>
24792488
<key>0</key>

TypeScriptReact.YAML-tmLanguage

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -938,8 +938,7 @@ repository:
938938
begin: (?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\s*(:)(?=\s*(
939939
(async\s+)|(function\s+)|
940940
([_$[:alpha:]][_$[:alnum:]]*\s*=>)|
941-
(\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=>)|
942-
(<[^<>]*(\<[^<>]+\>)*[^<>]*(\<[^<>]+\>)*[^<>]*>\s*\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=>))))
941+
((<[^<>]*(\<[^<>]+\>)*[^<>]*(\<[^<>]+\>)*[^<>]*>\s*)?\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=>))))
943942
beginCaptures:
944943
'0': { name: meta.object-literal.key.tsx }
945944
'1': { name: entity.name.function.tsx }
@@ -1012,21 +1011,22 @@ repository:
10121011

10131012
arrow-function:
10141013
patterns:
1015-
# TODO: type parameter of arrow
1016-
- name: meta.arrow.tsx
1014+
- name: meta.arrow.ts
10171015
match: (?<!\.|\$)(\basync)(?=\s*[<(])
10181016
captures:
10191017
'1': { name: storage.modifier.async.tsx }
10201018
# paramters of the arrow
10211019
- name: meta.arrow.tsx
1022-
match: ([_$[:alpha:]][_$[:alnum:]]*)\s*(?==>)
1020+
match: (?:(?<!\.|\$)(\basync)\s*)?([_$[:alpha:]][_$[:alnum:]]*)\s*(?==>)
10231021
captures:
1024-
'1': { name: variable.parameter.tsx }
1022+
'1': { name: storage.modifier.async.tsx }
1023+
'2': { name: variable.parameter.tsx }
10251024
- name: meta.arrow.tsx
1026-
begin: (?x)(?<=return|throw|yield|await|async|[=(\[,:>*])\s*(?=\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=>)
1025+
begin: (?x)(?<=return|throw|yield|await|async|[=(\[,:>*])\s*(?=(<[^<>]*(\<[^<>]+\>)*[^<>]*(\<[^<>]+\>)*[^<>]*>\s*)?\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=>)
10271026
end: (?==>)
10281027
patterns:
10291028
- include: '#comment'
1029+
- include: '#type-parameters'
10301030
- include: '#function-parameters'
10311031
# return type of the arrow
10321032
- include: '#arrow-return-type'

TypeScriptReact.tmLanguage

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -164,25 +164,30 @@
164164
<key>match</key>
165165
<string>(?&lt;!\.|\$)(\basync)(?=\s*[&lt;(])</string>
166166
<key>name</key>
167-
<string>meta.arrow.tsx</string>
167+
<string>meta.arrow.ts</string>
168168
</dict>
169169
<dict>
170170
<key>captures</key>
171171
<dict>
172172
<key>1</key>
173+
<dict>
174+
<key>name</key>
175+
<string>storage.modifier.async.tsx</string>
176+
</dict>
177+
<key>2</key>
173178
<dict>
174179
<key>name</key>
175180
<string>variable.parameter.tsx</string>
176181
</dict>
177182
</dict>
178183
<key>match</key>
179-
<string>([_$[:alpha:]][_$[:alnum:]]*)\s*(?==&gt;)</string>
184+
<string>(?:(?&lt;!\.|\$)(\basync)\s*)?([_$[:alpha:]][_$[:alnum:]]*)\s*(?==&gt;)</string>
180185
<key>name</key>
181186
<string>meta.arrow.tsx</string>
182187
</dict>
183188
<dict>
184189
<key>begin</key>
185-
<string>(?x)(?&lt;=return|throw|yield|await|async|[=(\[,:&gt;*])\s*(?=\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=&gt;)</string>
190+
<string>(?x)(?&lt;=return|throw|yield|await|async|[=(\[,:&gt;*])\s*(?=(&lt;[^&lt;&gt;]*(\&lt;[^&lt;&gt;]+\&gt;)*[^&lt;&gt;]*(\&lt;[^&lt;&gt;]+\&gt;)*[^&lt;&gt;]*&gt;\s*)?\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=&gt;)</string>
186191
<key>end</key>
187192
<string>(?==&gt;)</string>
188193
<key>name</key>
@@ -193,6 +198,10 @@
193198
<key>include</key>
194199
<string>#comment</string>
195200
</dict>
201+
<dict>
202+
<key>include</key>
203+
<string>#type-parameters</string>
204+
</dict>
196205
<dict>
197206
<key>include</key>
198207
<string>#function-parameters</string>
@@ -2859,7 +2868,7 @@
28592868
</dict>
28602869
<dict>
28612870
<key>begin</key>
2862-
<string>(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\s*(:)(?=\s*( (async\s+)|(function\s+)| ([_$[:alpha:]][_$[:alnum:]]*\s*=&gt;)| (\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=&gt;)| (&lt;[^&lt;&gt;]*(\&lt;[^&lt;&gt;]+\&gt;)*[^&lt;&gt;]*(\&lt;[^&lt;&gt;]+\&gt;)*[^&lt;&gt;]*&gt;\s*\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=&gt;))))</string>
2871+
<string>(?x)(?:([_$[:alpha:]][_$[:alnum:]]*)\s*(:)(?=\s*( (async\s+)|(function\s+)| ([_$[:alpha:]][_$[:alnum:]]*\s*=&gt;)| ((&lt;[^&lt;&gt;]*(\&lt;[^&lt;&gt;]+\&gt;)*[^&lt;&gt;]*(\&lt;[^&lt;&gt;]+\&gt;)*[^&lt;&gt;]*&gt;\s*)?\([^()]*(\([^()]*\))*[^()]*(\([^()]*\))*[^()]*\)(\s*:\s*(.)*)?\s*=&gt;))))</string>
28632872
<key>beginCaptures</key>
28642873
<dict>
28652874
<key>0</key>

tests/baselines/arrow.baseline.txt

Lines changed: 142 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
original file
2+
-----------------------------------
3+
var a = async p => {
4+
}
5+
class C {
6+
}
7+
function foo() {
8+
return <T extends C>(a: T) => {
9+
return a;
10+
};
11+
}
12+
-----------------------------------
13+
14+
>var a = async p => {
15+
^^^
16+
source.ts meta.var.expr.ts storage.type.ts
17+
^
18+
source.ts meta.var.expr.ts
19+
^
20+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts variable.other.readwrite.ts
21+
^
22+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts
23+
^
24+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts keyword.operator.assignment.ts
25+
^
26+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts
27+
^^^^^
28+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.arrow.ts storage.modifier.async.ts
29+
^
30+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.arrow.ts
31+
^
32+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.arrow.ts variable.parameter.ts
33+
^
34+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.arrow.ts
35+
^^
36+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.arrow.ts storage.type.function.arrow.ts
37+
^
38+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.arrow.ts
39+
^
40+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.arrow.ts meta.block.ts punctuation.definition.block.ts
41+
^^
42+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.arrow.ts meta.block.ts
43+
>}
44+
^
45+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.arrow.ts meta.block.ts punctuation.definition.block.ts
46+
^
47+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts
48+
>class C {
49+
^^^^^
50+
source.ts meta.class.ts storage.type.class.ts
51+
^
52+
source.ts meta.class.ts
53+
^
54+
source.ts meta.class.ts entity.name.class.ts
55+
^
56+
source.ts meta.class.ts
57+
^
58+
source.ts meta.class.ts punctuation.definition.block.ts
59+
^^
60+
source.ts meta.class.ts
61+
>}
62+
^
63+
source.ts meta.class.ts punctuation.definition.block.ts
64+
^^
65+
source.ts
66+
>function foo() {
67+
^^^^^^^^
68+
source.ts meta.function.ts storage.type.function.ts
69+
^
70+
source.ts meta.function.ts
71+
^^^
72+
source.ts meta.function.ts entity.name.function.ts
73+
^
74+
source.ts meta.function.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
75+
^
76+
source.ts meta.function.ts meta.parameters.ts punctuation.definition.parameters.end.ts
77+
^
78+
source.ts meta.function.ts
79+
^
80+
source.ts meta.function.ts meta.block.ts punctuation.definition.block.ts
81+
^^
82+
source.ts meta.function.ts meta.block.ts
83+
> return <T extends C>(a: T) => {
84+
^^^^
85+
source.ts meta.function.ts meta.block.ts
86+
^^^^^^
87+
source.ts meta.function.ts meta.block.ts keyword.control.flow.ts
88+
^
89+
source.ts meta.function.ts meta.block.ts meta.arrow.ts
90+
^
91+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.type.parameters.ts punctuation.definition.typeparameters.begin.ts
92+
^
93+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.type.parameters.ts entity.name.type.ts
94+
^
95+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.type.parameters.ts
96+
^^^^^^^
97+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.type.parameters.ts storage.modifier.ts
98+
^
99+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.type.parameters.ts
100+
^
101+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.type.parameters.ts entity.name.type.ts
102+
^
103+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.type.parameters.ts punctuation.definition.typeparameters.end.ts
104+
^
105+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
106+
^
107+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.parameters.ts variable.parameter.ts
108+
^
109+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.parameters.ts meta.type.annotation.ts
110+
^
111+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.parameters.ts meta.type.annotation.ts
112+
^
113+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.parameters.ts meta.type.annotation.ts entity.name.type.ts
114+
^
115+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.parameters.ts punctuation.definition.parameters.end.ts
116+
^
117+
source.ts meta.function.ts meta.block.ts meta.arrow.ts
118+
^^
119+
source.ts meta.function.ts meta.block.ts meta.arrow.ts storage.type.function.arrow.ts
120+
^
121+
source.ts meta.function.ts meta.block.ts meta.arrow.ts
122+
^
123+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.block.ts punctuation.definition.block.ts
124+
^^
125+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.block.ts
126+
> return a;
127+
^^^^^^^^
128+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.block.ts
129+
^^^^^^
130+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.block.ts keyword.control.flow.ts
131+
^^^^^
132+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.block.ts
133+
> };
134+
^^^^
135+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.block.ts
136+
^
137+
source.ts meta.function.ts meta.block.ts meta.arrow.ts meta.block.ts punctuation.definition.block.ts
138+
^^^
139+
source.ts meta.function.ts meta.block.ts
140+
>}
141+
^
142+
source.ts meta.function.ts meta.block.ts punctuation.definition.block.ts

tests/cases/arrow.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
var a = async p => {
2+
}
3+
class C {
4+
}
5+
function foo() {
6+
return <T extends C>(a: T) => {
7+
return a;
8+
};
9+
}

0 commit comments

Comments
 (0)