Skip to content

Commit 7db029d

Browse files
committed
Fix incorrect constructor type's type parameter detection
Fixes #687
1 parent 72cb5cd commit 7db029d

File tree

5 files changed

+160
-14
lines changed

5 files changed

+160
-14
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2220,10 +2220,13 @@ repository:
22202220
type-fn-type-parameters:
22212221
patterns:
22222222
# constructor type
2223-
- name: meta.type.constructor.ts
2224-
match: '{{startOfIdentifier}}(new)\b(?=\s*\<)'
2225-
captures:
2226-
'1': { name: keyword.control.new.ts }
2223+
- begin: '{{startOfIdentifier}}(new)\b(?=\s*\<)'
2224+
beginCaptures:
2225+
'1': { name: meta.type.constructor.ts keyword.control.new.ts }
2226+
end: (?<=>)
2227+
patterns:
2228+
- include: '#comment'
2229+
- include: '#type-parameters'
22272230
- name: meta.type.constructor.ts
22282231
begin: '{{startOfIdentifier}}(new)\b\s*(?=\()'
22292232
beginCaptures:

TypeScript.tmLanguage

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6628,18 +6628,29 @@
66286628
<key>patterns</key>
66296629
<array>
66306630
<dict>
6631-
<key>name</key>
6632-
<string>meta.type.constructor.ts</string>
6633-
<key>match</key>
6631+
<key>begin</key>
66346632
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(new)\b(?=\s*\&lt;)</string>
6635-
<key>captures</key>
6633+
<key>beginCaptures</key>
66366634
<dict>
66376635
<key>1</key>
66386636
<dict>
66396637
<key>name</key>
6640-
<string>keyword.control.new.ts</string>
6638+
<string>meta.type.constructor.ts keyword.control.new.ts</string>
66416639
</dict>
66426640
</dict>
6641+
<key>end</key>
6642+
<string>(?&lt;=&gt;)</string>
6643+
<key>patterns</key>
6644+
<array>
6645+
<dict>
6646+
<key>include</key>
6647+
<string>#comment</string>
6648+
</dict>
6649+
<dict>
6650+
<key>include</key>
6651+
<string>#type-parameters</string>
6652+
</dict>
6653+
</array>
66436654
</dict>
66446655
<dict>
66456656
<key>name</key>

TypeScriptReact.tmLanguage

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6574,18 +6574,29 @@
65746574
<key>patterns</key>
65756575
<array>
65766576
<dict>
6577-
<key>name</key>
6578-
<string>meta.type.constructor.tsx</string>
6579-
<key>match</key>
6577+
<key>begin</key>
65806578
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(new)\b(?=\s*\&lt;)</string>
6581-
<key>captures</key>
6579+
<key>beginCaptures</key>
65826580
<dict>
65836581
<key>1</key>
65846582
<dict>
65856583
<key>name</key>
6586-
<string>keyword.control.new.tsx</string>
6584+
<string>meta.type.constructor.tsx keyword.control.new.tsx</string>
65876585
</dict>
65886586
</dict>
6587+
<key>end</key>
6588+
<string>(?&lt;=&gt;)</string>
6589+
<key>patterns</key>
6590+
<array>
6591+
<dict>
6592+
<key>include</key>
6593+
<string>#comment</string>
6594+
</dict>
6595+
<dict>
6596+
<key>include</key>
6597+
<string>#type-parameters</string>
6598+
</dict>
6599+
</array>
65896600
</dict>
65906601
<dict>
65916602
<key>name</key>

tests/baselines/Issue687.baseline.txt

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
original file
2+
-----------------------------------
3+
export interface ObjectAllocator {
4+
getTokenConstructor(): new <TKind extends SyntaxKind>(kind: TKind, pos?: number, end?: number) => Token<TKind>;
5+
}
6+
-----------------------------------
7+
8+
Grammar: TypeScript.tmLanguage
9+
-----------------------------------
10+
>export interface ObjectAllocator {
11+
^^^^^^
12+
source.ts meta.interface.ts keyword.control.export.ts
13+
^
14+
source.ts meta.interface.ts
15+
^^^^^^^^^
16+
source.ts meta.interface.ts storage.type.interface.ts
17+
^
18+
source.ts meta.interface.ts
19+
^^^^^^^^^^^^^^^
20+
source.ts meta.interface.ts entity.name.type.interface.ts
21+
^
22+
source.ts meta.interface.ts
23+
^
24+
source.ts meta.interface.ts punctuation.definition.block.ts
25+
^^
26+
source.ts meta.interface.ts
27+
> getTokenConstructor(): new <TKind extends SyntaxKind>(kind: TKind, pos?: number, end?: number) => Token<TKind>;
28+
^^^^^^^^
29+
source.ts meta.interface.ts meta.method.declaration.ts
30+
^^^^^^^^^^^^^^^^^^^
31+
source.ts meta.interface.ts meta.method.declaration.ts meta.definition.method.ts entity.name.function.ts
32+
^
33+
source.ts meta.interface.ts meta.method.declaration.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
34+
^
35+
source.ts meta.interface.ts meta.method.declaration.ts meta.parameters.ts punctuation.definition.parameters.end.ts
36+
^
37+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts keyword.operator.type.annotation.ts
38+
^
39+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts
40+
^^^
41+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.constructor.ts keyword.control.new.ts
42+
^
43+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts
44+
^
45+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.parameters.ts punctuation.definition.typeparameters.begin.ts
46+
^^^^^
47+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.parameters.ts entity.name.type.ts
48+
^
49+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.parameters.ts
50+
^^^^^^^
51+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.parameters.ts storage.modifier.ts
52+
^
53+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.parameters.ts
54+
^^^^^^^^^^
55+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.parameters.ts entity.name.type.ts
56+
^
57+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.parameters.ts punctuation.definition.typeparameters.end.ts
58+
^
59+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
60+
^^^^
61+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts variable.parameter.ts
62+
^
63+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
64+
^
65+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts meta.type.annotation.ts
66+
^^^^^
67+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts meta.type.annotation.ts entity.name.type.ts
68+
^
69+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts punctuation.separator.parameter.ts
70+
^
71+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts
72+
^^^
73+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts variable.parameter.ts
74+
^
75+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts keyword.operator.optional.ts
76+
^
77+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
78+
^
79+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts meta.type.annotation.ts
80+
^^^^^^
81+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts meta.type.annotation.ts support.type.primitive.ts
82+
^
83+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts punctuation.separator.parameter.ts
84+
^
85+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts
86+
^^^
87+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts variable.parameter.ts
88+
^
89+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts keyword.operator.optional.ts
90+
^
91+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
92+
^
93+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts meta.type.annotation.ts
94+
^^^^^^
95+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts meta.type.annotation.ts support.type.primitive.ts
96+
^
97+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.ts meta.parameters.ts punctuation.definition.parameters.end.ts
98+
^
99+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts
100+
^^
101+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.return.ts storage.type.function.arrow.ts
102+
^
103+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.return.ts
104+
^^^^^
105+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.return.ts entity.name.type.ts
106+
^
107+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.return.ts meta.type.parameters.ts punctuation.definition.typeparameters.begin.ts
108+
^^^^^
109+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.return.ts meta.type.parameters.ts entity.name.type.ts
110+
^
111+
source.ts meta.interface.ts meta.method.declaration.ts meta.return.type.ts meta.type.function.return.ts meta.type.parameters.ts punctuation.definition.typeparameters.end.ts
112+
^
113+
source.ts meta.interface.ts punctuation.terminator.statement.ts
114+
^^
115+
source.ts meta.interface.ts
116+
>}
117+
^
118+
source.ts meta.interface.ts punctuation.definition.block.ts

tests/cases/Issue687.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export interface ObjectAllocator {
2+
getTokenConstructor(): new <TKind extends SyntaxKind>(kind: TKind, pos?: number, end?: number) => Token<TKind>;
3+
}

0 commit comments

Comments
 (0)