Skip to content

Commit 95f5929

Browse files
committed
Match regexp followed by if expression with special casing
Fixes #732
1 parent 17761d1 commit 95f5929

File tree

5 files changed

+306
-1
lines changed

5 files changed

+306
-1
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ variables:
123123
{{functionLikeType}} |
124124
(:\s*(=>|{{matchingParenthesis}}|(<[^<>]*>)|[^<>(),=])+={{functionOrArrowLookup}})
125125
arrowFunctionEnd: (?==>|\{|(^\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\s+))
126+
completeRegexp: \/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/[gimsuy]*(?!\s*[a-zA-Z0-9_$]))
126127

127128
patterns:
128129
- include: '#directives'
@@ -177,6 +178,7 @@ repository:
177178
match: '{{startOfIdentifier}}(return){{endOfIdentifier}}'
178179
- name: keyword.control.switch.ts
179180
match: '{{startOfIdentifier}}(case|default|switch){{endOfIdentifier}}'
181+
- include: '#if-statement'
180182
- name: keyword.control.conditional.ts
181183
match: '{{startOfIdentifier}}(else|if){{endOfIdentifier}}'
182184
- name: keyword.control.with.ts
@@ -1241,6 +1243,34 @@ repository:
12411243
- include: '#expression'
12421244
- include: '#punctuation-semicolon'
12431245

1246+
# Match if statement without block specially to handle regexp
1247+
if-statement:
1248+
patterns:
1249+
- begin: '{{startOfIdentifier}}(?=\bif\s*{{matchingParenthesis}}\s*(?!\{))'
1250+
end: (?=;|$)
1251+
patterns:
1252+
- include: '#comment'
1253+
- begin: '{{startOfIdentifier}}(if)\s*(\()'
1254+
beginCaptures:
1255+
'1': { name: keyword.control.conditional.ts }
1256+
'2': { name: meta.brace.round.ts }
1257+
end: \)
1258+
endCaptures:
1259+
'0': { name: meta.brace.round.ts }
1260+
patterns:
1261+
- include: '#expression'
1262+
- name: string.regexp.ts
1263+
begin: (?<=\))\s*{{completeRegexp}}
1264+
beginCaptures:
1265+
'0': { name: punctuation.definition.string.begin.ts }
1266+
end: (/)([gimsuy]*)
1267+
endCaptures:
1268+
'1': { name: punctuation.definition.string.end.ts }
1269+
'2': { name: keyword.other.ts }
1270+
patterns:
1271+
- include: '#regexp'
1272+
- include: '#statements'
1273+
12441274
#blocks
12451275
decl-block:
12461276
name: meta.block.ts
@@ -2531,7 +2561,7 @@ repository:
25312561
- include: '#regexp'
25322562
# Check if complete regexp syntax
25332563
- name: string.regexp.ts
2534-
begin: (?<![_$[:alnum:])\]]|\+\+|--|}|\*\/)\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/[gimsuy]*(?!\s*[a-zA-Z0-9_$]))
2564+
begin: (?<![_$[:alnum:])\]]|\+\+|--|}|\*\/){{completeRegexp}}
25352565
beginCaptures:
25362566
'0': { name: punctuation.definition.string.begin.ts }
25372567
end: (/)([gimsuy]*)

TypeScript.tmLanguage

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,10 @@
190190
<key>match</key>
191191
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(case|default|switch)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))</string>
192192
</dict>
193+
<dict>
194+
<key>include</key>
195+
<string>#if-statement</string>
196+
</dict>
193197
<dict>
194198
<key>name</key>
195199
<string>keyword.control.conditional.ts</string>
@@ -4017,6 +4021,99 @@
40174021
</dict>
40184022
</array>
40194023
</dict>
4024+
<key>if-statement</key>
4025+
<dict>
4026+
<key>patterns</key>
4027+
<array>
4028+
<dict>
4029+
<key>begin</key>
4030+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?=\bif\s*(\(([^\(\)]|(\([^\(\)]*\)))*\))\s*(?!\{))</string>
4031+
<key>end</key>
4032+
<string>(?=;|$)</string>
4033+
<key>patterns</key>
4034+
<array>
4035+
<dict>
4036+
<key>include</key>
4037+
<string>#comment</string>
4038+
</dict>
4039+
<dict>
4040+
<key>begin</key>
4041+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(if)\s*(\()</string>
4042+
<key>beginCaptures</key>
4043+
<dict>
4044+
<key>1</key>
4045+
<dict>
4046+
<key>name</key>
4047+
<string>keyword.control.conditional.ts</string>
4048+
</dict>
4049+
<key>2</key>
4050+
<dict>
4051+
<key>name</key>
4052+
<string>meta.brace.round.ts</string>
4053+
</dict>
4054+
</dict>
4055+
<key>end</key>
4056+
<string>\)</string>
4057+
<key>endCaptures</key>
4058+
<dict>
4059+
<key>0</key>
4060+
<dict>
4061+
<key>name</key>
4062+
<string>meta.brace.round.ts</string>
4063+
</dict>
4064+
</dict>
4065+
<key>patterns</key>
4066+
<array>
4067+
<dict>
4068+
<key>include</key>
4069+
<string>#expression</string>
4070+
</dict>
4071+
</array>
4072+
</dict>
4073+
<dict>
4074+
<key>name</key>
4075+
<string>string.regexp.ts</string>
4076+
<key>begin</key>
4077+
<string>(?&lt;=\))\s*\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/[gimsuy]*(?!\s*[a-zA-Z0-9_$]))</string>
4078+
<key>beginCaptures</key>
4079+
<dict>
4080+
<key>0</key>
4081+
<dict>
4082+
<key>name</key>
4083+
<string>punctuation.definition.string.begin.ts</string>
4084+
</dict>
4085+
</dict>
4086+
<key>end</key>
4087+
<string>(/)([gimsuy]*)</string>
4088+
<key>endCaptures</key>
4089+
<dict>
4090+
<key>1</key>
4091+
<dict>
4092+
<key>name</key>
4093+
<string>punctuation.definition.string.end.ts</string>
4094+
</dict>
4095+
<key>2</key>
4096+
<dict>
4097+
<key>name</key>
4098+
<string>keyword.other.ts</string>
4099+
</dict>
4100+
</dict>
4101+
<key>patterns</key>
4102+
<array>
4103+
<dict>
4104+
<key>include</key>
4105+
<string>#regexp</string>
4106+
</dict>
4107+
</array>
4108+
</dict>
4109+
<dict>
4110+
<key>include</key>
4111+
<string>#statements</string>
4112+
</dict>
4113+
</array>
4114+
</dict>
4115+
</array>
4116+
</dict>
40204117
<key>decl-block</key>
40214118
<dict>
40224119
<key>name</key>

TypeScriptReact.tmLanguage

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,10 @@
190190
<key>match</key>
191191
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(case|default|switch)(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))</string>
192192
</dict>
193+
<dict>
194+
<key>include</key>
195+
<string>#if-statement</string>
196+
</dict>
193197
<dict>
194198
<key>name</key>
195199
<string>keyword.control.conditional.tsx</string>
@@ -4021,6 +4025,99 @@
40214025
</dict>
40224026
</array>
40234027
</dict>
4028+
<key>if-statement</key>
4029+
<dict>
4030+
<key>patterns</key>
4031+
<array>
4032+
<dict>
4033+
<key>begin</key>
4034+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?=\bif\s*(\(([^\(\)]|(\([^\(\)]*\)))*\))\s*(?!\{))</string>
4035+
<key>end</key>
4036+
<string>(?=;|$)</string>
4037+
<key>patterns</key>
4038+
<array>
4039+
<dict>
4040+
<key>include</key>
4041+
<string>#comment</string>
4042+
</dict>
4043+
<dict>
4044+
<key>begin</key>
4045+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(if)\s*(\()</string>
4046+
<key>beginCaptures</key>
4047+
<dict>
4048+
<key>1</key>
4049+
<dict>
4050+
<key>name</key>
4051+
<string>keyword.control.conditional.tsx</string>
4052+
</dict>
4053+
<key>2</key>
4054+
<dict>
4055+
<key>name</key>
4056+
<string>meta.brace.round.tsx</string>
4057+
</dict>
4058+
</dict>
4059+
<key>end</key>
4060+
<string>\)</string>
4061+
<key>endCaptures</key>
4062+
<dict>
4063+
<key>0</key>
4064+
<dict>
4065+
<key>name</key>
4066+
<string>meta.brace.round.tsx</string>
4067+
</dict>
4068+
</dict>
4069+
<key>patterns</key>
4070+
<array>
4071+
<dict>
4072+
<key>include</key>
4073+
<string>#expression</string>
4074+
</dict>
4075+
</array>
4076+
</dict>
4077+
<dict>
4078+
<key>name</key>
4079+
<string>string.regexp.tsx</string>
4080+
<key>begin</key>
4081+
<string>(?&lt;=\))\s*\/(?![\/*])(?=(?:[^\/\\\[]|\\.|\[([^\]\\]|\\.)+\])+\/[gimsuy]*(?!\s*[a-zA-Z0-9_$]))</string>
4082+
<key>beginCaptures</key>
4083+
<dict>
4084+
<key>0</key>
4085+
<dict>
4086+
<key>name</key>
4087+
<string>punctuation.definition.string.begin.tsx</string>
4088+
</dict>
4089+
</dict>
4090+
<key>end</key>
4091+
<string>(/)([gimsuy]*)</string>
4092+
<key>endCaptures</key>
4093+
<dict>
4094+
<key>1</key>
4095+
<dict>
4096+
<key>name</key>
4097+
<string>punctuation.definition.string.end.tsx</string>
4098+
</dict>
4099+
<key>2</key>
4100+
<dict>
4101+
<key>name</key>
4102+
<string>keyword.other.tsx</string>
4103+
</dict>
4104+
</dict>
4105+
<key>patterns</key>
4106+
<array>
4107+
<dict>
4108+
<key>include</key>
4109+
<string>#regexp</string>
4110+
</dict>
4111+
</array>
4112+
</dict>
4113+
<dict>
4114+
<key>include</key>
4115+
<string>#statements</string>
4116+
</dict>
4117+
</array>
4118+
</dict>
4119+
</array>
4120+
</dict>
40244121
<key>decl-block</key>
40254122
<dict>
40264123
<key>name</key>

tests/baselines/Issue732.baseline.txt

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
original file
2+
-----------------------------------
3+
function validateEmail(e) {
4+
if (true) /"/.test(e); return 1 + 1;
5+
}
6+
-----------------------------------
7+
8+
Grammar: TypeScript.tmLanguage
9+
-----------------------------------
10+
>function validateEmail(e) {
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 variable.parameter.ts
21+
^
22+
source.ts meta.function.ts meta.parameters.ts punctuation.definition.parameters.end.ts
23+
^
24+
source.ts meta.function.ts
25+
^
26+
source.ts meta.function.ts meta.block.ts punctuation.definition.block.ts
27+
> if (true) /"/.test(e); return 1 + 1;
28+
^^^^
29+
source.ts meta.function.ts meta.block.ts
30+
^^
31+
source.ts meta.function.ts meta.block.ts keyword.control.conditional.ts
32+
^
33+
source.ts meta.function.ts meta.block.ts
34+
^
35+
source.ts meta.function.ts meta.block.ts meta.brace.round.ts
36+
^^^^
37+
source.ts meta.function.ts meta.block.ts constant.language.boolean.true.ts
38+
^
39+
source.ts meta.function.ts meta.block.ts meta.brace.round.ts
40+
^^
41+
source.ts meta.function.ts meta.block.ts string.regexp.ts punctuation.definition.string.begin.ts
42+
^
43+
source.ts meta.function.ts meta.block.ts string.regexp.ts
44+
^
45+
source.ts meta.function.ts meta.block.ts string.regexp.ts punctuation.definition.string.end.ts
46+
^
47+
source.ts meta.function.ts meta.block.ts meta.function-call.ts punctuation.accessor.ts
48+
^^^^
49+
source.ts meta.function.ts meta.block.ts meta.function-call.ts support.function.ts
50+
^
51+
source.ts meta.function.ts meta.block.ts meta.brace.round.ts
52+
^
53+
source.ts meta.function.ts meta.block.ts variable.other.readwrite.ts
54+
^
55+
source.ts meta.function.ts meta.block.ts meta.brace.round.ts
56+
^
57+
source.ts meta.function.ts meta.block.ts punctuation.terminator.statement.ts
58+
^
59+
source.ts meta.function.ts meta.block.ts
60+
^^^^^^
61+
source.ts meta.function.ts meta.block.ts keyword.control.flow.ts
62+
^
63+
source.ts meta.function.ts meta.block.ts
64+
^
65+
source.ts meta.function.ts meta.block.ts constant.numeric.decimal.ts
66+
^
67+
source.ts meta.function.ts meta.block.ts
68+
^
69+
source.ts meta.function.ts meta.block.ts keyword.operator.arithmetic.ts
70+
^
71+
source.ts meta.function.ts meta.block.ts
72+
^
73+
source.ts meta.function.ts meta.block.ts constant.numeric.decimal.ts
74+
^
75+
source.ts meta.function.ts meta.block.ts punctuation.terminator.statement.ts
76+
>}
77+
^
78+
source.ts meta.function.ts meta.block.ts punctuation.definition.block.ts

tests/cases/Issue732.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
function validateEmail(e) {
2+
if (true) /"/.test(e); return 1 + 1;
3+
}

0 commit comments

Comments
 (0)