Skip to content

Commit 4006120

Browse files
committed
Correctly parse expression after typeof operator
Adds support for typeof class as part of microsoft/TypeScript#41587
1 parent 968be2a commit 4006120

9 files changed

+144
-17
lines changed

TypeScript.YAML-tmLanguage

+6-2
Original file line numberDiff line numberDiff line change
@@ -1726,8 +1726,12 @@ repository:
17261726
'1': { name: keyword.operator.arithmetic.ts }
17271727

17281728
typeof-operator:
1729-
name: keyword.operator.expression.typeof.ts
1730-
match: '{{startOfIdentifier}}typeof{{endOfIdentifier}}'
1729+
begin: '{{startOfIdentifier}}typeof{{endOfIdentifier}}'
1730+
beginCaptures:
1731+
'0': { name: keyword.operator.expression.typeof.ts }
1732+
end: (?=[,);}\]=]|$|{{endOfStatement}})
1733+
patterns:
1734+
- include: '#expression'
17311735

17321736
#literals
17331737
literal:

TypeScript.tmLanguage

+18-3
Original file line numberDiff line numberDiff line change
@@ -5592,10 +5592,25 @@
55925592
</dict>
55935593
<key>typeof-operator</key>
55945594
<dict>
5595-
<key>name</key>
5596-
<string>keyword.operator.expression.typeof.ts</string>
5597-
<key>match</key>
5595+
<key>begin</key>
55985596
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))typeof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))</string>
5597+
<key>beginCaptures</key>
5598+
<dict>
5599+
<key>0</key>
5600+
<dict>
5601+
<key>name</key>
5602+
<string>keyword.operator.expression.typeof.ts</string>
5603+
</dict>
5604+
</dict>
5605+
<key>end</key>
5606+
<string>(?=[,);}\]=]|$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))</string>
5607+
<key>patterns</key>
5608+
<array>
5609+
<dict>
5610+
<key>include</key>
5611+
<string>#expression</string>
5612+
</dict>
5613+
</array>
55995614
</dict>
56005615
<key>literal</key>
56015616
<dict>

TypeScriptReact.tmLanguage

+18-3
Original file line numberDiff line numberDiff line change
@@ -5538,10 +5538,25 @@
55385538
</dict>
55395539
<key>typeof-operator</key>
55405540
<dict>
5541-
<key>name</key>
5542-
<string>keyword.operator.expression.typeof.tsx</string>
5543-
<key>match</key>
5541+
<key>begin</key>
55445542
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))typeof(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))</string>
5543+
<key>beginCaptures</key>
5544+
<dict>
5545+
<key>0</key>
5546+
<dict>
5547+
<key>name</key>
5548+
<string>keyword.operator.expression.typeof.tsx</string>
5549+
</dict>
5550+
</dict>
5551+
<key>end</key>
5552+
<string>(?=[,);}\]=]|$|;|(?:^\s*(?:abstract|async|class|const|declare|enum|export|function|import|interface|let|module|namespace|return|type|var)\b))</string>
5553+
<key>patterns</key>
5554+
<array>
5555+
<dict>
5556+
<key>include</key>
5557+
<string>#expression</string>
5558+
</dict>
5559+
</array>
55455560
</dict>
55465561
<key>literal</key>
55475562
<dict>

tests/baselines/Issue37.baseline.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ Grammar: TypeScript.tmLanguage
470470
^
471471
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts
472472
^
473-
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts entity.name.type.ts
473+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts variable.other.constant.ts
474474
^
475475
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts
476476
^

tests/baselines/Issue685.baseline.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ Grammar: TypeScript.tmLanguage
9292
^
9393
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts
9494
^^^^^^^
95-
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts entity.name.type.ts
95+
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts variable.other.readwrite.ts
9696
^
9797
source.ts meta.var.expr.ts meta.objectliteral.ts meta.object.member.ts meta.type.parameters.ts punctuation.separator.comma.ts
9898
^

tests/baselines/Issue774.baseline.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -305,4 +305,4 @@ Grammar: TypeScript.tmLanguage
305305
^
306306
source.ts meta.type.declaration.ts
307307
^^^^^^
308-
source.ts meta.type.declaration.ts entity.name.type.ts
308+
source.ts meta.type.declaration.ts variable.other.readwrite.ts

tests/baselines/importTypes.baseline.txt

+6-6
Original file line numberDiff line numberDiff line change
@@ -259,17 +259,17 @@ Grammar: TypeScript.tmLanguage
259259
^
260260
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts
261261
^^^^^^
262-
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts keyword.operator.expression.import.ts
262+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts meta.function-call.ts keyword.operator.expression.import.ts
263263
^
264-
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts meta.type.paren.cover.ts meta.brace.round.ts
264+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts meta.brace.round.ts
265265
^
266-
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts meta.type.paren.cover.ts string.quoted.double.ts punctuation.definition.string.begin.ts
266+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts string.quoted.double.ts punctuation.definition.string.begin.ts
267267
^^^^^^
268-
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts meta.type.paren.cover.ts string.quoted.double.ts
268+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts string.quoted.double.ts
269269
^
270-
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts meta.type.paren.cover.ts string.quoted.double.ts punctuation.definition.string.end.ts
270+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts string.quoted.double.ts punctuation.definition.string.end.ts
271271
^
272-
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts meta.type.paren.cover.ts meta.brace.round.ts
272+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts meta.brace.round.ts
273273
^
274274
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.type.annotation.ts
275275
^
+88
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
original file
2+
-----------------------------------
3+
type TC1 = typeof class {
4+
constructor(s: string);
5+
static n: number;
6+
s: string;
7+
};
8+
-----------------------------------
9+
10+
Grammar: TypeScript.tmLanguage
11+
-----------------------------------
12+
>type TC1 = typeof class {
13+
^^^^
14+
source.ts meta.type.declaration.ts storage.type.type.ts
15+
^
16+
source.ts meta.type.declaration.ts
17+
^^^
18+
source.ts meta.type.declaration.ts entity.name.type.alias.ts
19+
^
20+
source.ts meta.type.declaration.ts
21+
^
22+
source.ts meta.type.declaration.ts keyword.operator.assignment.ts
23+
^
24+
source.ts meta.type.declaration.ts
25+
^^^^^^
26+
source.ts meta.type.declaration.ts keyword.operator.expression.typeof.ts
27+
^
28+
source.ts meta.type.declaration.ts
29+
^^^^^
30+
source.ts meta.type.declaration.ts meta.class.ts storage.type.class.ts
31+
^
32+
source.ts meta.type.declaration.ts meta.class.ts
33+
^
34+
source.ts meta.type.declaration.ts meta.class.ts punctuation.definition.block.ts
35+
> constructor(s: string);
36+
^^^^
37+
source.ts meta.type.declaration.ts meta.class.ts meta.method.declaration.ts
38+
^^^^^^^^^^^
39+
source.ts meta.type.declaration.ts meta.class.ts meta.method.declaration.ts storage.type.ts
40+
^
41+
source.ts meta.type.declaration.ts meta.class.ts meta.method.declaration.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
42+
^
43+
source.ts meta.type.declaration.ts meta.class.ts meta.method.declaration.ts meta.parameters.ts variable.parameter.ts
44+
^
45+
source.ts meta.type.declaration.ts meta.class.ts meta.method.declaration.ts meta.parameters.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
46+
^
47+
source.ts meta.type.declaration.ts meta.class.ts meta.method.declaration.ts meta.parameters.ts meta.type.annotation.ts
48+
^^^^^^
49+
source.ts meta.type.declaration.ts meta.class.ts meta.method.declaration.ts meta.parameters.ts meta.type.annotation.ts support.type.primitive.ts
50+
^
51+
source.ts meta.type.declaration.ts meta.class.ts meta.method.declaration.ts meta.parameters.ts punctuation.definition.parameters.end.ts
52+
^
53+
source.ts meta.type.declaration.ts meta.class.ts punctuation.terminator.statement.ts
54+
> static n: number;
55+
^^^^
56+
source.ts meta.type.declaration.ts meta.class.ts
57+
^^^^^^
58+
source.ts meta.type.declaration.ts meta.class.ts storage.modifier.ts
59+
^
60+
source.ts meta.type.declaration.ts meta.class.ts meta.field.declaration.ts
61+
^
62+
source.ts meta.type.declaration.ts meta.class.ts meta.field.declaration.ts meta.definition.property.ts variable.object.property.ts
63+
^
64+
source.ts meta.type.declaration.ts meta.class.ts meta.field.declaration.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
65+
^
66+
source.ts meta.type.declaration.ts meta.class.ts meta.field.declaration.ts meta.type.annotation.ts
67+
^^^^^^
68+
source.ts meta.type.declaration.ts meta.class.ts meta.field.declaration.ts meta.type.annotation.ts support.type.primitive.ts
69+
^
70+
source.ts meta.type.declaration.ts meta.class.ts punctuation.terminator.statement.ts
71+
> s: string;
72+
^^^^
73+
source.ts meta.type.declaration.ts meta.class.ts meta.field.declaration.ts
74+
^
75+
source.ts meta.type.declaration.ts meta.class.ts meta.field.declaration.ts meta.definition.property.ts variable.object.property.ts
76+
^
77+
source.ts meta.type.declaration.ts meta.class.ts meta.field.declaration.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
78+
^
79+
source.ts meta.type.declaration.ts meta.class.ts meta.field.declaration.ts meta.type.annotation.ts
80+
^^^^^^
81+
source.ts meta.type.declaration.ts meta.class.ts meta.field.declaration.ts meta.type.annotation.ts support.type.primitive.ts
82+
^
83+
source.ts meta.type.declaration.ts meta.class.ts punctuation.terminator.statement.ts
84+
>};
85+
^
86+
source.ts meta.type.declaration.ts meta.class.ts punctuation.definition.block.ts
87+
^
88+
source.ts punctuation.terminator.statement.ts

tests/cases/typeofClass.ts

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
type TC1 = typeof class {
2+
constructor(s: string);
3+
static n: number;
4+
s: string;
5+
};

0 commit comments

Comments
 (0)