Skip to content

Commit de11c82

Browse files
committed
Handle declaration block with ternary operator and switch case statement better
Fixes #595
1 parent 5c237f7 commit de11c82

File tree

5 files changed

+191
-12
lines changed

5 files changed

+191
-12
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -982,11 +982,23 @@ repository:
982982
begin: '{{startOfIdentifier}}(case|default(?=:)){{endOfIdentifier}}'
983983
beginCaptures:
984984
'1': { name: keyword.control.switch.ts }
985-
end: ':'
986-
endCaptures:
987-
'0': { name: punctuation.definition.section.case-statement.ts }
985+
end: (?=:)
988986
patterns:
989987
- include: '#expression'
988+
# case block
989+
- begin: (:)\s*(\{)
990+
beginCaptures:
991+
'1': { name: case-clause.expr.ts punctuation.definition.section.case-statement.ts }
992+
'2': { name: meta.block.ts punctuation.definition.block.ts }
993+
end: \}
994+
endCaptures:
995+
'0': { name: meta.block.ts punctuation.definition.block.ts }
996+
contentName: meta.block.ts
997+
patterns:
998+
- include: '#statements'
999+
- match: (:)
1000+
captures:
1001+
'0': { name: case-clause.expr.ts punctuation.definition.section.case-statement.ts }
9901002
- include: '#statements'
9911003

9921004
for-loop:
@@ -1024,7 +1036,7 @@ repository:
10241036
#object literals
10251037
after-operator-block-as-object-literal:
10261038
name: meta.objectliteral.ts
1027-
begin: (?<!\+\+|--)(?<=[=(,\[?+!]|{{lookBehindAwait}}|{{lookBehindReturn}}|{{lookBehindYield}}|{{lookBehindThrow}}|{{lookBehindIn}}|{{lookBehindOf}}|{{lookBehindTypeof}}|&&|\|\||\*)\s*(\{)
1039+
begin: (?<!\+\+|--)(?<=[:=(,\[?+!]|{{lookBehindAwait}}|{{lookBehindReturn}}|{{lookBehindYield}}|{{lookBehindThrow}}|{{lookBehindIn}}|{{lookBehindOf}}|{{lookBehindTypeof}}|&&|\|\||\*)\s*(\{)
10281040
beginCaptures:
10291041
'1': { name: punctuation.definition.block.ts }
10301042
end: \}

TypeScript.tmLanguage

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3061,23 +3061,63 @@
30613061
</dict>
30623062
</dict>
30633063
<key>end</key>
3064-
<string>:</string>
3064+
<string>(?=:)</string>
3065+
<key>patterns</key>
3066+
<array>
3067+
<dict>
3068+
<key>include</key>
3069+
<string>#expression</string>
3070+
</dict>
3071+
</array>
3072+
</dict>
3073+
<dict>
3074+
<key>begin</key>
3075+
<string>(:)\s*(\{)</string>
3076+
<key>beginCaptures</key>
3077+
<dict>
3078+
<key>1</key>
3079+
<dict>
3080+
<key>name</key>
3081+
<string>case-clause.expr.ts punctuation.definition.section.case-statement.ts</string>
3082+
</dict>
3083+
<key>2</key>
3084+
<dict>
3085+
<key>name</key>
3086+
<string>meta.block.ts punctuation.definition.block.ts</string>
3087+
</dict>
3088+
</dict>
3089+
<key>end</key>
3090+
<string>\}</string>
30653091
<key>endCaptures</key>
30663092
<dict>
30673093
<key>0</key>
30683094
<dict>
30693095
<key>name</key>
3070-
<string>punctuation.definition.section.case-statement.ts</string>
3096+
<string>meta.block.ts punctuation.definition.block.ts</string>
30713097
</dict>
30723098
</dict>
3099+
<key>contentName</key>
3100+
<string>meta.block.ts</string>
30733101
<key>patterns</key>
30743102
<array>
30753103
<dict>
30763104
<key>include</key>
3077-
<string>#expression</string>
3105+
<string>#statements</string>
30783106
</dict>
30793107
</array>
30803108
</dict>
3109+
<dict>
3110+
<key>match</key>
3111+
<string>(:)</string>
3112+
<key>captures</key>
3113+
<dict>
3114+
<key>0</key>
3115+
<dict>
3116+
<key>name</key>
3117+
<string>case-clause.expr.ts punctuation.definition.section.case-statement.ts</string>
3118+
</dict>
3119+
</dict>
3120+
</dict>
30813121
<dict>
30823122
<key>include</key>
30833123
<string>#statements</string>
@@ -3188,7 +3228,7 @@
31883228
<key>name</key>
31893229
<string>meta.objectliteral.ts</string>
31903230
<key>begin</key>
3191-
<string>(?&lt;!\+\+|--)(?&lt;=[=(,\[?+!]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&amp;&amp;|\|\||\*)\s*(\{)</string>
3231+
<string>(?&lt;!\+\+|--)(?&lt;=[:=(,\[?+!]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&amp;&amp;|\|\||\*)\s*(\{)</string>
31923232
<key>beginCaptures</key>
31933233
<dict>
31943234
<key>1</key>

TypeScriptReact.tmLanguage

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3065,23 +3065,63 @@
30653065
</dict>
30663066
</dict>
30673067
<key>end</key>
3068-
<string>:</string>
3068+
<string>(?=:)</string>
3069+
<key>patterns</key>
3070+
<array>
3071+
<dict>
3072+
<key>include</key>
3073+
<string>#expression</string>
3074+
</dict>
3075+
</array>
3076+
</dict>
3077+
<dict>
3078+
<key>begin</key>
3079+
<string>(:)\s*(\{)</string>
3080+
<key>beginCaptures</key>
3081+
<dict>
3082+
<key>1</key>
3083+
<dict>
3084+
<key>name</key>
3085+
<string>case-clause.expr.tsx punctuation.definition.section.case-statement.tsx</string>
3086+
</dict>
3087+
<key>2</key>
3088+
<dict>
3089+
<key>name</key>
3090+
<string>meta.block.tsx punctuation.definition.block.tsx</string>
3091+
</dict>
3092+
</dict>
3093+
<key>end</key>
3094+
<string>\}</string>
30693095
<key>endCaptures</key>
30703096
<dict>
30713097
<key>0</key>
30723098
<dict>
30733099
<key>name</key>
3074-
<string>punctuation.definition.section.case-statement.tsx</string>
3100+
<string>meta.block.tsx punctuation.definition.block.tsx</string>
30753101
</dict>
30763102
</dict>
3103+
<key>contentName</key>
3104+
<string>meta.block.tsx</string>
30773105
<key>patterns</key>
30783106
<array>
30793107
<dict>
30803108
<key>include</key>
3081-
<string>#expression</string>
3109+
<string>#statements</string>
30823110
</dict>
30833111
</array>
30843112
</dict>
3113+
<dict>
3114+
<key>match</key>
3115+
<string>(:)</string>
3116+
<key>captures</key>
3117+
<dict>
3118+
<key>0</key>
3119+
<dict>
3120+
<key>name</key>
3121+
<string>case-clause.expr.tsx punctuation.definition.section.case-statement.tsx</string>
3122+
</dict>
3123+
</dict>
3124+
</dict>
30853125
<dict>
30863126
<key>include</key>
30873127
<string>#statements</string>
@@ -3192,7 +3232,7 @@
31923232
<key>name</key>
31933233
<string>meta.objectliteral.tsx</string>
31943234
<key>begin</key>
3195-
<string>(?&lt;!\+\+|--)(?&lt;=[=(,\[?+!]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&amp;&amp;|\|\||\*)\s*(\{)</string>
3235+
<string>(?&lt;!\+\+|--)(?&lt;=[:=(,\[?+!]|^await|[^\._$[:alnum:]]await|^return|[^\._$[:alnum:]]return|^yield|[^\._$[:alnum:]]yield|^throw|[^\._$[:alnum:]]throw|^in|[^\._$[:alnum:]]in|^of|[^\._$[:alnum:]]of|^typeof|[^\._$[:alnum:]]typeof|&amp;&amp;|\|\||\*)\s*(\{)</string>
31963236
<key>beginCaptures</key>
31973237
<dict>
31983238
<key>1</key>

tests/baselines/Issue595.baseline.txt

Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
original file
2+
-----------------------------------
3+
function f() {
4+
return foo ? { a: true } : { b: false }
5+
}
6+
-----------------------------------
7+
8+
Grammar: TypeScript.tmLanguage
9+
-----------------------------------
10+
>function f() {
11+
^^^^^^^^
12+
source.ts meta.function.ts storage.type.function.ts
13+
^
14+
source.ts meta.function.ts
15+
^
16+
source.ts meta.function.ts meta.definition.function.ts entity.name.function.ts
17+
^
18+
source.ts meta.function.ts meta.parameters.ts punctuation.definition.parameters.begin.ts
19+
^
20+
source.ts meta.function.ts meta.parameters.ts punctuation.definition.parameters.end.ts
21+
^
22+
source.ts meta.function.ts
23+
^
24+
source.ts meta.function.ts meta.block.ts punctuation.definition.block.ts
25+
^^
26+
source.ts meta.function.ts meta.block.ts
27+
> return foo ? { a: true } : { b: false }
28+
^^^^
29+
source.ts meta.function.ts meta.block.ts
30+
^^^^^^
31+
source.ts meta.function.ts meta.block.ts keyword.control.flow.ts
32+
^
33+
source.ts meta.function.ts meta.block.ts
34+
^^^
35+
source.ts meta.function.ts meta.block.ts variable.other.readwrite.ts
36+
^
37+
source.ts meta.function.ts meta.block.ts
38+
^
39+
source.ts meta.function.ts meta.block.ts keyword.operator.ternary.ts
40+
^
41+
source.ts meta.function.ts meta.block.ts
42+
^
43+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts punctuation.definition.block.ts
44+
^
45+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts
46+
^
47+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts meta.object.member.ts meta.object-literal.key.ts
48+
^
49+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts meta.object.member.ts meta.object-literal.key.ts punctuation.separator.key-value.ts
50+
^
51+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts meta.object.member.ts
52+
^^^^
53+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts meta.object.member.ts constant.language.boolean.true.ts
54+
^
55+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts meta.object.member.ts
56+
^
57+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts punctuation.definition.block.ts
58+
^
59+
source.ts meta.function.ts meta.block.ts
60+
^
61+
source.ts meta.function.ts meta.block.ts keyword.operator.ternary.ts
62+
^
63+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts
64+
^
65+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts punctuation.definition.block.ts
66+
^
67+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts
68+
^
69+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts meta.object.member.ts meta.object-literal.key.ts
70+
^
71+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts meta.object.member.ts meta.object-literal.key.ts punctuation.separator.key-value.ts
72+
^
73+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts meta.object.member.ts
74+
^^^^^
75+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts meta.object.member.ts constant.language.boolean.false.ts
76+
^
77+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts meta.object.member.ts
78+
^
79+
source.ts meta.function.ts meta.block.ts meta.objectliteral.ts punctuation.definition.block.ts
80+
^^
81+
source.ts meta.function.ts meta.block.ts
82+
>}
83+
^
84+
source.ts meta.function.ts meta.block.ts punctuation.definition.block.ts

tests/cases/Issue595.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
function f() {
2+
return foo ? { a: true } : { b: false }
3+
}

0 commit comments

Comments
 (0)