Skip to content

Commit 4284108

Browse files
committed
Dont identify x ? as optional parameter in possible multiline arrow unless its followed by type annotation or assigment
Fixes #689
1 parent f0edf83 commit 4284108

File tree

5 files changed

+544
-3
lines changed

5 files changed

+544
-3
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -498,6 +498,8 @@ repository:
498498
- include: '#binding-element-const'
499499
- include: '#punctuation-comma'
500500

501+
# When doing modication to parameter name, also modify expression-inside-possibly-arrow-parens where this is inlined so as to make
502+
# as optional operator only if it is not followed by assignment or type annotation
501503
parameter-name:
502504
patterns:
503505
- match: '{{startOfIdentifier}}(public|protected|private|readonly)\s+(?=(public|protected|private|readonly)\s+)'
@@ -837,6 +839,7 @@ repository:
837839
patterns:
838840
- include: '#function-parameters-body'
839841

842+
# When updating this, also update the expression-inside-possibly-arrow-parens where this is inlined so that parameter-name can also be inlined
840843
function-parameters-body:
841844
patterns:
842845
- include: '#comment'
@@ -1431,7 +1434,33 @@ repository:
14311434
expression-inside-possibly-arrow-parens:
14321435
patterns:
14331436
- include: '#expressionWithoutIdentifiers'
1434-
- include: '#function-parameters-body'
1437+
- include: '#comment'
1438+
- include: '#string'
1439+
- include: '#decorator'
1440+
- include: '#destructuring-parameter'
1441+
- match: '{{startOfIdentifier}}(public|protected|private|readonly)\s+(?=(public|protected|private|readonly)\s+)'
1442+
captures:
1443+
'1': { name: storage.modifier.ts }
1444+
- match: |-
1445+
(?x)(?:{{startOfIdentifier}}(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:){{startOfIdentifier}}(?:(this)|({{identifier}})){{endOfIdentifier}}\s*(\??)(?={{functionLikeAssignmentOrType}})
1446+
captures:
1447+
'1': { name: storage.modifier.ts }
1448+
'2': { name: keyword.operator.rest.ts }
1449+
'3': { name: entity.name.function.ts variable.language.this.ts }
1450+
'4': { name: entity.name.function.ts }
1451+
'5': { name: keyword.operator.optional.ts }
1452+
- match: |-
1453+
(?x)(?:{{startOfIdentifier}}(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:){{startOfIdentifier}}(?:(this)|({{identifier}})){{endOfIdentifier}}\s*(\??)(?=\s*:)
1454+
captures:
1455+
'1': { name: storage.modifier.ts }
1456+
'2': { name: keyword.operator.rest.ts }
1457+
'3': { name: variable.parameter.ts variable.language.this.ts }
1458+
'4': { name: variable.parameter.ts }
1459+
'5': { name: keyword.operator.optional.ts }
1460+
- include: '#type-annotation'
1461+
- include: '#variable-initializer'
1462+
- name: punctuation.separator.parameter.ts
1463+
match: ','
14351464
- include: '#identifiers'
14361465
- include: '#expressionPunctuations'
14371466

TypeScript.tmLanguage

Lines changed: 175 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4620,7 +4620,181 @@
46204620
</dict>
46214621
<dict>
46224622
<key>include</key>
4623-
<string>#function-parameters-body</string>
4623+
<string>#comment</string>
4624+
</dict>
4625+
<dict>
4626+
<key>include</key>
4627+
<string>#string</string>
4628+
</dict>
4629+
<dict>
4630+
<key>include</key>
4631+
<string>#decorator</string>
4632+
</dict>
4633+
<dict>
4634+
<key>include</key>
4635+
<string>#destructuring-parameter</string>
4636+
</dict>
4637+
<dict>
4638+
<key>match</key>
4639+
<string>(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(public|protected|private|readonly)\s+(?=(public|protected|private|readonly)\s+)</string>
4640+
<key>captures</key>
4641+
<dict>
4642+
<key>1</key>
4643+
<dict>
4644+
<key>name</key>
4645+
<string>storage.modifier.ts</string>
4646+
</dict>
4647+
</dict>
4648+
</dict>
4649+
<dict>
4650+
<key>match</key>
4651+
<string>(?x)(?:(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?&lt;!=|:)(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*
4652+
# function assignment |
4653+
(=\s*(
4654+
((async\s+)?(
4655+
(function\s*[(&lt;*]) |
4656+
(function\s+) |
4657+
([_$[:alpha:]][_$[:alnum:]]*\s*=&gt;)
4658+
)) |
4659+
((async\s*)?(
4660+
((&lt;\s*$)|((&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;]|\&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;])*\&gt;)*&gt;\s*)?[\(]\s*([\{\[]\s*)?$)) |
4661+
# sure shot arrow functions even if =&gt; is on new line
4662+
(
4663+
(&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;]|\&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;])*\&gt;)*&gt;\s*)?
4664+
[(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
4665+
(
4666+
([)]\s*:) | # ():
4667+
((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
4668+
)
4669+
) |
4670+
(
4671+
[&lt;]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=&gt;] # &lt; typeparam extends
4672+
) |
4673+
# arrow function possible to detect only with =&gt; on same line
4674+
(
4675+
(&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;]|\&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;])*\&gt;)*&gt;\s*)? # typeparameters
4676+
\(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
4677+
(\s*:\s*([^&lt;&gt;\(\)\{\}]|\&lt;[^&lt;&gt;]+\&gt;|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
4678+
\s*=&gt; # arrow operator
4679+
)
4680+
))
4681+
)) |
4682+
# typeannotation is fn type: &lt; | () | (... | (param: | (param, | (param? | (param= | (param) =&gt;
4683+
(:\s*(
4684+
(&lt;) |
4685+
([(]\s*(
4686+
([)]) |
4687+
(\.\.\.) |
4688+
([_$[:alnum:]]+\s*(
4689+
([:,?=])|
4690+
([)]\s*=&gt;)
4691+
))
4692+
))
4693+
)) |
4694+
(:\s*((&lt;\s*$)|((&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;]|\&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;])*\&gt;)*&gt;\s*)?[\(]\s*([\{\[]\s*)?$))) |
4695+
(:\s*(=&gt;|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(&lt;[^&lt;&gt;]*&gt;)|[^&lt;&gt;(),=])+=\s*(
4696+
((async\s+)?(
4697+
(function\s*[(&lt;*]) |
4698+
(function\s+) |
4699+
([_$[:alpha:]][_$[:alnum:]]*\s*=&gt;)
4700+
)) |
4701+
((async\s*)?(
4702+
((&lt;\s*$)|((&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;]|\&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;])*\&gt;)*&gt;\s*)?[\(]\s*([\{\[]\s*)?$)) |
4703+
# sure shot arrow functions even if =&gt; is on new line
4704+
(
4705+
(&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;]|\&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;])*\&gt;)*&gt;\s*)?
4706+
[(]\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*
4707+
(
4708+
([)]\s*:) | # ():
4709+
((\.\.\.\s*)?[_$[:alpha:]][_$[:alnum:]]*\s*:) # [(]param: | [(]...param:
4710+
)
4711+
) |
4712+
(
4713+
[&lt;]\s*[_$[:alpha:]][_$[:alnum:]]*\s+extends\s*[^=&gt;] # &lt; typeparam extends
4714+
) |
4715+
# arrow function possible to detect only with =&gt; on same line
4716+
(
4717+
(&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;]|\&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;])*\&gt;)*&gt;\s*)? # typeparameters
4718+
\(\s*(\/\*([^\*]|(\*[^\/]))*\*\/\s*)*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\.\.\.\s*[_$[:alpha:]]))([^()]|(\(([^\(\)]|(\([^\(\)]*\)))*\)))*)?\) # parameters
4719+
(\s*:\s*([^&lt;&gt;\(\)\{\}]|\&lt;[^&lt;&gt;]+\&gt;|\([^\(\)]+\)|\{[^\{\}]+\})+)? # return type
4720+
\s*=&gt; # arrow operator
4721+
)
4722+
))
4723+
)))</string>
4724+
<key>captures</key>
4725+
<dict>
4726+
<key>1</key>
4727+
<dict>
4728+
<key>name</key>
4729+
<string>storage.modifier.ts</string>
4730+
</dict>
4731+
<key>2</key>
4732+
<dict>
4733+
<key>name</key>
4734+
<string>keyword.operator.rest.ts</string>
4735+
</dict>
4736+
<key>3</key>
4737+
<dict>
4738+
<key>name</key>
4739+
<string>entity.name.function.ts variable.language.this.ts</string>
4740+
</dict>
4741+
<key>4</key>
4742+
<dict>
4743+
<key>name</key>
4744+
<string>entity.name.function.ts</string>
4745+
</dict>
4746+
<key>5</key>
4747+
<dict>
4748+
<key>name</key>
4749+
<string>keyword.operator.optional.ts</string>
4750+
</dict>
4751+
</dict>
4752+
</dict>
4753+
<dict>
4754+
<key>match</key>
4755+
<string>(?x)(?:(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?&lt;!=|:)(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))(?![_$[:alnum:]])(?:(?=\.\.\.)|(?!\.))\s*(\??)(?=\s*:)</string>
4756+
<key>captures</key>
4757+
<dict>
4758+
<key>1</key>
4759+
<dict>
4760+
<key>name</key>
4761+
<string>storage.modifier.ts</string>
4762+
</dict>
4763+
<key>2</key>
4764+
<dict>
4765+
<key>name</key>
4766+
<string>keyword.operator.rest.ts</string>
4767+
</dict>
4768+
<key>3</key>
4769+
<dict>
4770+
<key>name</key>
4771+
<string>variable.parameter.ts variable.language.this.ts</string>
4772+
</dict>
4773+
<key>4</key>
4774+
<dict>
4775+
<key>name</key>
4776+
<string>variable.parameter.ts</string>
4777+
</dict>
4778+
<key>5</key>
4779+
<dict>
4780+
<key>name</key>
4781+
<string>keyword.operator.optional.ts</string>
4782+
</dict>
4783+
</dict>
4784+
</dict>
4785+
<dict>
4786+
<key>include</key>
4787+
<string>#type-annotation</string>
4788+
</dict>
4789+
<dict>
4790+
<key>include</key>
4791+
<string>#variable-initializer</string>
4792+
</dict>
4793+
<dict>
4794+
<key>name</key>
4795+
<string>punctuation.separator.parameter.ts</string>
4796+
<key>match</key>
4797+
<string>,</string>
46244798
</dict>
46254799
<dict>
46264800
<key>include</key>

0 commit comments

Comments
 (0)