Skip to content

Commit 4a31715

Browse files
committed
Fix multiline conditional types
Fixes #613
1 parent 2165b3e commit 4a31715

File tree

6 files changed

+226
-47
lines changed

6 files changed

+226
-47
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -881,10 +881,12 @@ repository:
881881
patterns:
882882
- include: '#comment'
883883
- include: '#type-parameters'
884-
- include: '#type'
885-
- match: '(=)\s*'
886-
captures:
884+
- begin: '(=)\s*'
885+
beginCaptures:
887886
'1': { name: keyword.operator.assignment.ts }
887+
end: (?=\}|{{endOfStatement}})
888+
patterns:
889+
- include: '#type'
888890

889891
#import and export
890892
import-equals-declaration:
@@ -2010,9 +2012,21 @@ repository:
20102012

20112013
#conditional type
20122014
type-conditional:
2013-
match: '{{startOfIdentifier}}(extends)\s+'
2014-
captures:
2015-
'1': { name: storage.modifier.ts }
2015+
patterns:
2016+
- begin: '{{startOfIdentifier}}(extends)\s+'
2017+
beginCaptures:
2018+
'1': { name: storage.modifier.ts }
2019+
end: (?<=:)
2020+
patterns:
2021+
- begin: \?
2022+
beginCaptures:
2023+
'0': { name: keyword.operator.ternary.ts }
2024+
end: ':'
2025+
endCaptures:
2026+
'0': { name: keyword.operator.ternary.ts }
2027+
patterns:
2028+
- include: '#type'
2029+
- include: '#type'
20162030

20172031
# Parenthesis can contain either types and function parameters
20182032
# (number | string) or (param: number, param2: string)
@@ -2070,15 +2084,15 @@ repository:
20702084
begin: (=>)(?=\s*\S)
20712085
beginCaptures:
20722086
'1': { name: storage.type.function.arrow.ts }
2073-
end: (?<!=>)(?<![|&])(?=[,\]\)\{\}=;>]|//|$)
2087+
end: (?<!=>)(?<![|&])(?=[,\]\)\{\}=;>:\?]|//|$)
20742088
patterns:
20752089
- include: '#type-function-return-type-core'
20762090
# if type starts on next line use modified line endings as end of type annotation eg. complete empty line
20772091
- name: meta.type.function.return.ts
20782092
begin: '=>'
20792093
beginCaptures:
20802094
'0': { name: storage.type.function.arrow.ts }
2081-
end: (?<!=>)(?<![|&])((?=[,\]\)\{\}=;>]|//|^\s*$)|((?<=\S)(?=\s*$)))
2095+
end: (?<!=>)(?<![|&])((?=[,\]\)\{\}=;:\?>]|//|^\s*$)|((?<=\S)(?=\s*$)))
20822096
patterns:
20832097
- include: '#type-function-return-type-core'
20842098

TypeScript.tmLanguage

Lines changed: 64 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2767,20 +2767,25 @@
27672767
<string>#type-parameters</string>
27682768
</dict>
27692769
<dict>
2770-
<key>include</key>
2771-
<string>#type</string>
2772-
</dict>
2773-
<dict>
2774-
<key>match</key>
2770+
<key>begin</key>
27752771
<string>(=)\s*</string>
2776-
<key>captures</key>
2772+
<key>beginCaptures</key>
27772773
<dict>
27782774
<key>1</key>
27792775
<dict>
27802776
<key>name</key>
27812777
<string>keyword.operator.assignment.ts</string>
27822778
</dict>
27832779
</dict>
2780+
<key>end</key>
2781+
<string>(?=\}|;|\babstract\b|\basync\b|\bclass\b|\bconst\b|\bdeclare\b|\benum\b|\bexport\b|\bfunction\b|\bimport\b|\binterface\b|\blet\b|\bmodule\b|\bnamespace\b|\breturn\b|\btype\b|\bvar\b)</string>
2782+
<key>patterns</key>
2783+
<array>
2784+
<dict>
2785+
<key>include</key>
2786+
<string>#type</string>
2787+
</dict>
2788+
</array>
27842789
</dict>
27852790
</array>
27862791
</dict>
@@ -5875,16 +5880,59 @@
58755880
</dict>
58765881
<key>type-conditional</key>
58775882
<dict>
5878-
<key>match</key>
5879-
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(extends)\s+</string>
5880-
<key>captures</key>
5881-
<dict>
5882-
<key>1</key>
5883+
<key>patterns</key>
5884+
<array>
58835885
<dict>
5884-
<key>name</key>
5885-
<string>storage.modifier.ts</string>
5886+
<key>begin</key>
5887+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(extends)\s+</string>
5888+
<key>beginCaptures</key>
5889+
<dict>
5890+
<key>1</key>
5891+
<dict>
5892+
<key>name</key>
5893+
<string>storage.modifier.ts</string>
5894+
</dict>
5895+
</dict>
5896+
<key>end</key>
5897+
<string>(?&lt;=:)</string>
5898+
<key>patterns</key>
5899+
<array>
5900+
<dict>
5901+
<key>begin</key>
5902+
<string>\?</string>
5903+
<key>beginCaptures</key>
5904+
<dict>
5905+
<key>0</key>
5906+
<dict>
5907+
<key>name</key>
5908+
<string>keyword.operator.ternary.ts</string>
5909+
</dict>
5910+
</dict>
5911+
<key>end</key>
5912+
<string>:</string>
5913+
<key>endCaptures</key>
5914+
<dict>
5915+
<key>0</key>
5916+
<dict>
5917+
<key>name</key>
5918+
<string>keyword.operator.ternary.ts</string>
5919+
</dict>
5920+
</dict>
5921+
<key>patterns</key>
5922+
<array>
5923+
<dict>
5924+
<key>include</key>
5925+
<string>#type</string>
5926+
</dict>
5927+
</array>
5928+
</dict>
5929+
<dict>
5930+
<key>include</key>
5931+
<string>#type</string>
5932+
</dict>
5933+
</array>
58865934
</dict>
5887-
</dict>
5935+
</array>
58885936
</dict>
58895937
<key>type-paren-or-function-parameters</key>
58905938
<dict>
@@ -6009,7 +6057,7 @@
60096057
</dict>
60106058
</dict>
60116059
<key>end</key>
6012-
<string>(?&lt;!=&gt;)(?&lt;![|&amp;])(?=[,\]\)\{\}=;&gt;]|//|$)</string>
6060+
<string>(?&lt;!=&gt;)(?&lt;![|&amp;])(?=[,\]\)\{\}=;&gt;:\?]|//|$)</string>
60136061
<key>patterns</key>
60146062
<array>
60156063
<dict>
@@ -6032,7 +6080,7 @@
60326080
</dict>
60336081
</dict>
60346082
<key>end</key>
6035-
<string>(?&lt;!=&gt;)(?&lt;![|&amp;])((?=[,\]\)\{\}=;&gt;]|//|^\s*$)|((?&lt;=\S)(?=\s*$)))</string>
6083+
<string>(?&lt;!=&gt;)(?&lt;![|&amp;])((?=[,\]\)\{\}=;:\?&gt;]|//|^\s*$)|((?&lt;=\S)(?=\s*$)))</string>
60366084
<key>patterns</key>
60376085
<array>
60386086
<dict>

TypeScriptReact.tmLanguage

Lines changed: 64 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -2771,20 +2771,25 @@
27712771
<string>#type-parameters</string>
27722772
</dict>
27732773
<dict>
2774-
<key>include</key>
2775-
<string>#type</string>
2776-
</dict>
2777-
<dict>
2778-
<key>match</key>
2774+
<key>begin</key>
27792775
<string>(=)\s*</string>
2780-
<key>captures</key>
2776+
<key>beginCaptures</key>
27812777
<dict>
27822778
<key>1</key>
27832779
<dict>
27842780
<key>name</key>
27852781
<string>keyword.operator.assignment.tsx</string>
27862782
</dict>
27872783
</dict>
2784+
<key>end</key>
2785+
<string>(?=\}|;|\babstract\b|\basync\b|\bclass\b|\bconst\b|\bdeclare\b|\benum\b|\bexport\b|\bfunction\b|\bimport\b|\binterface\b|\blet\b|\bmodule\b|\bnamespace\b|\breturn\b|\btype\b|\bvar\b)</string>
2786+
<key>patterns</key>
2787+
<array>
2788+
<dict>
2789+
<key>include</key>
2790+
<string>#type</string>
2791+
</dict>
2792+
</array>
27882793
</dict>
27892794
</array>
27902795
</dict>
@@ -5821,16 +5826,59 @@
58215826
</dict>
58225827
<key>type-conditional</key>
58235828
<dict>
5824-
<key>match</key>
5825-
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(extends)\s+</string>
5826-
<key>captures</key>
5827-
<dict>
5828-
<key>1</key>
5829+
<key>patterns</key>
5830+
<array>
58295831
<dict>
5830-
<key>name</key>
5831-
<string>storage.modifier.tsx</string>
5832+
<key>begin</key>
5833+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(extends)\s+</string>
5834+
<key>beginCaptures</key>
5835+
<dict>
5836+
<key>1</key>
5837+
<dict>
5838+
<key>name</key>
5839+
<string>storage.modifier.tsx</string>
5840+
</dict>
5841+
</dict>
5842+
<key>end</key>
5843+
<string>(?&lt;=:)</string>
5844+
<key>patterns</key>
5845+
<array>
5846+
<dict>
5847+
<key>begin</key>
5848+
<string>\?</string>
5849+
<key>beginCaptures</key>
5850+
<dict>
5851+
<key>0</key>
5852+
<dict>
5853+
<key>name</key>
5854+
<string>keyword.operator.ternary.tsx</string>
5855+
</dict>
5856+
</dict>
5857+
<key>end</key>
5858+
<string>:</string>
5859+
<key>endCaptures</key>
5860+
<dict>
5861+
<key>0</key>
5862+
<dict>
5863+
<key>name</key>
5864+
<string>keyword.operator.ternary.tsx</string>
5865+
</dict>
5866+
</dict>
5867+
<key>patterns</key>
5868+
<array>
5869+
<dict>
5870+
<key>include</key>
5871+
<string>#type</string>
5872+
</dict>
5873+
</array>
5874+
</dict>
5875+
<dict>
5876+
<key>include</key>
5877+
<string>#type</string>
5878+
</dict>
5879+
</array>
58325880
</dict>
5833-
</dict>
5881+
</array>
58345882
</dict>
58355883
<key>type-paren-or-function-parameters</key>
58365884
<dict>
@@ -5955,7 +6003,7 @@
59556003
</dict>
59566004
</dict>
59576005
<key>end</key>
5958-
<string>(?&lt;!=&gt;)(?&lt;![|&amp;])(?=[,\]\)\{\}=;&gt;]|//|$)</string>
6006+
<string>(?&lt;!=&gt;)(?&lt;![|&amp;])(?=[,\]\)\{\}=;&gt;:\?]|//|$)</string>
59596007
<key>patterns</key>
59606008
<array>
59616009
<dict>
@@ -5978,7 +6026,7 @@
59786026
</dict>
59796027
</dict>
59806028
<key>end</key>
5981-
<string>(?&lt;!=&gt;)(?&lt;![|&amp;])((?=[,\]\)\{\}=;&gt;]|//|^\s*$)|((?&lt;=\S)(?=\s*$)))</string>
6029+
<string>(?&lt;!=&gt;)(?&lt;![|&amp;])((?=[,\]\)\{\}=;:\?&gt;]|//|^\s*$)|((?&lt;=\S)(?=\s*$)))</string>
59826030
<key>patterns</key>
59836031
<array>
59846032
<dict>

tests/baselines/Issue613.baseline.txt

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
original file
2+
-----------------------------------
3+
interface I {
4+
x: number extends number
5+
? string
6+
: boolean;
7+
}
8+
-----------------------------------
9+
10+
Grammar: TypeScript.tmLanguage
11+
-----------------------------------
12+
>interface I {
13+
^^^^^^^^^
14+
source.ts meta.interface.ts storage.type.interface.ts
15+
^
16+
source.ts meta.interface.ts
17+
^
18+
source.ts meta.interface.ts entity.name.type.interface.ts
19+
^
20+
source.ts meta.interface.ts
21+
^
22+
source.ts meta.interface.ts punctuation.definition.block.ts
23+
> x: number extends number
24+
^^^^
25+
source.ts meta.interface.ts
26+
^
27+
source.ts meta.interface.ts meta.field.declaration.ts meta.definition.property.ts variable.object.property.ts
28+
^
29+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts keyword.operator.type.annotation.ts
30+
^
31+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts
32+
^^^^^^
33+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts support.type.primitive.ts
34+
^
35+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts
36+
^^^^^^^
37+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts storage.modifier.ts
38+
^
39+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts
40+
^^^^^^
41+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts support.type.primitive.ts
42+
> ? string
43+
^^^^^^^^
44+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts
45+
^
46+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts keyword.operator.ternary.ts
47+
^
48+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts
49+
^^^^^^
50+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts support.type.primitive.ts
51+
> : boolean;
52+
^^^^^^^^
53+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts
54+
^
55+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts keyword.operator.ternary.ts
56+
^
57+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts
58+
^^^^^^^
59+
source.ts meta.interface.ts meta.field.declaration.ts meta.type.annotation.ts support.type.primitive.ts
60+
^
61+
source.ts meta.interface.ts punctuation.terminator.statement.ts
62+
>}
63+
^
64+
source.ts meta.interface.ts punctuation.definition.block.ts

tests/baselines/inferTypes.baseline.txt

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -219,19 +219,19 @@ Grammar: TypeScript.tmLanguage
219219
^
220220
source.ts meta.type.declaration.ts meta.type.function.return.ts
221221
^
222-
source.ts meta.type.declaration.ts meta.type.function.return.ts keyword.operator.ternary.ts
222+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
223223
^
224-
source.ts meta.type.declaration.ts meta.type.function.return.ts
224+
source.ts meta.type.declaration.ts
225225
^
226-
source.ts meta.type.declaration.ts meta.type.function.return.ts entity.name.type.ts
226+
source.ts meta.type.declaration.ts entity.name.type.ts
227227
^
228-
source.ts meta.type.declaration.ts meta.type.function.return.ts
228+
source.ts meta.type.declaration.ts
229229
^
230-
source.ts meta.type.declaration.ts meta.type.function.return.ts keyword.operator.ternary.ts
230+
source.ts meta.type.declaration.ts keyword.operator.ternary.ts
231231
^
232-
source.ts meta.type.declaration.ts meta.type.function.return.ts
232+
source.ts meta.type.declaration.ts
233233
^^^
234-
source.ts meta.type.declaration.ts meta.type.function.return.ts support.type.primitive.ts
234+
source.ts meta.type.declaration.ts support.type.primitive.ts
235235
^
236236
source.ts punctuation.terminator.statement.ts
237237
>type X1<T extends { x: any, y: any }> = T extends { x: infer X, y: infer Y } ? [X, Y] : any;

tests/cases/Issue613.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
interface I {
2+
x: number extends number
3+
? string
4+
: boolean;
5+
}

0 commit comments

Comments
 (0)