Skip to content

Commit 9a52efa

Browse files
committed
Handle the parameter name scoping in function type
Fixes #629
1 parent 5629dc0 commit 9a52efa

File tree

5 files changed

+461
-10
lines changed

5 files changed

+461
-10
lines changed

TypeScript.YAML-tmLanguage

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,11 +94,7 @@ variables:
9494
{{arrowLookup}}
9595
))
9696
)
97-
functionLikeAssignmentOrType: |-
98-
\s*
99-
# function assignment |
100-
(={{functionOrArrowLookup}}) |
101-
# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>
97+
functionLikeType: |-
10298
(:\s*(
10399
(<) |
104100
([(]\s*(
@@ -110,6 +106,13 @@ variables:
110106
))
111107
))
112108
)) |
109+
(:\s*{{possiblyMultilineArrow}})
110+
functionLikeAssignmentOrType: |-
111+
\s*
112+
# function assignment |
113+
(={{functionOrArrowLookup}}) |
114+
# typeannotation is fn type: < | () | (... | (param: | (param, | (param? | (param= | (param) =>
115+
{{functionLikeType}} |
113116
(:\s*(=>|{{matchingParenthesis}}|(<[^<>]*>)|[^<>(),=])+={{functionOrArrowLookup}})
114117
arrowFunctionEnd: (?==>|\{|(^\s*(export|function|class|interface|let|var|const|import|enum|namespace|module|type|abstract|declare)\s+))
115118

@@ -2027,8 +2030,28 @@ repository:
20272030
endCaptures:
20282031
'0': { name: meta.brace.round.ts }
20292032
patterns:
2033+
- include: '#destructuring-parameter'
2034+
#parameter name only if followed by type annotation
2035+
- match: |-
2036+
(?x)(?:{{startOfIdentifier}}(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:){{startOfIdentifier}}(?:(this)|({{identifier}}))\s*(\??)(?=\s*{{functionLikeType}})
2037+
captures:
2038+
'1': { name: storage.modifier.ts }
2039+
'2': { name: keyword.operator.rest.ts }
2040+
'3': { name: entity.name.function.ts variable.language.this.ts }
2041+
'4': { name: entity.name.function.ts }
2042+
'5': { name: keyword.operator.optional.ts }
2043+
- match: |-
2044+
(?x)(?:{{startOfIdentifier}}(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?<!=|:){{startOfIdentifier}}(?:(this)|({{identifier}}))\s*(\??)(?=:)
2045+
captures:
2046+
'1': { name: storage.modifier.ts }
2047+
'2': { name: keyword.operator.rest.ts }
2048+
'3': { name: variable.parameter.ts variable.language.this.ts }
2049+
'4': { name: variable.parameter.ts }
2050+
'5': { name: keyword.operator.optional.ts }
2051+
- include: '#type-annotation'
2052+
- name: punctuation.separator.parameter.ts
2053+
match: ','
20302054
- include: '#type'
2031-
- include: '#function-parameters'
20322055

20332056
type-fn-type-parameters:
20342057
patterns:

TypeScript.tmLanguage

Lines changed: 90 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@
526526
))
527527
))
528528
)) |
529+
(:\s*((&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;]|\&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;])*\&gt;)*&gt;\s*)?[\(]\s*([\{\[]\s*)?$)) |
529530
(:\s*(=&gt;|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(&lt;[^&lt;&gt;]*&gt;)|[^&lt;&gt;(),=])+=\s*(
530531
((async\s+)?(
531532
(function\s*[(&lt;*]) |
@@ -971,6 +972,7 @@
971972
))
972973
))
973974
)) |
975+
(:\s*((&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;]|\&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;])*\&gt;)*&gt;\s*)?[\(]\s*([\{\[]\s*)?$)) |
974976
(:\s*(=&gt;|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(&lt;[^&lt;&gt;]*&gt;)|[^&lt;&gt;(),=])+=\s*(
975977
((async\s+)?(
976978
(function\s*[(&lt;*]) |
@@ -1439,6 +1441,7 @@
14391441
))
14401442
))
14411443
)) |
1444+
(:\s*((&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;]|\&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;])*\&gt;)*&gt;\s*)?[\(]\s*([\{\[]\s*)?$)) |
14421445
(:\s*(=&gt;|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(&lt;[^&lt;&gt;]*&gt;)|[^&lt;&gt;(),=])+=\s*(
14431446
((async\s+)?(
14441447
(function\s*[(&lt;*]) |
@@ -5911,11 +5914,96 @@
59115914
<array>
59125915
<dict>
59135916
<key>include</key>
5914-
<string>#type</string>
5917+
<string>#destructuring-parameter</string>
5918+
</dict>
5919+
<dict>
5920+
<key>match</key>
5921+
<string>(?x)(?:(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?&lt;!=|:)(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))\s*(\??)(?=\s*(:\s*(
5922+
(&lt;) |
5923+
([(]\s*(
5924+
([)]) |
5925+
(\.\.\.) |
5926+
([_$[:alnum:]]+\s*(
5927+
([:,?=])|
5928+
([)]\s*=&gt;)
5929+
))
5930+
))
5931+
)) |
5932+
(:\s*((&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;]|\&lt;\s*([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))([^=&lt;&gt;]|=[^&lt;])*\&gt;)*&gt;\s*)?[\(]\s*([\{\[]\s*)?$)))</string>
5933+
<key>captures</key>
5934+
<dict>
5935+
<key>1</key>
5936+
<dict>
5937+
<key>name</key>
5938+
<string>storage.modifier.ts</string>
5939+
</dict>
5940+
<key>2</key>
5941+
<dict>
5942+
<key>name</key>
5943+
<string>keyword.operator.rest.ts</string>
5944+
</dict>
5945+
<key>3</key>
5946+
<dict>
5947+
<key>name</key>
5948+
<string>entity.name.function.ts variable.language.this.ts</string>
5949+
</dict>
5950+
<key>4</key>
5951+
<dict>
5952+
<key>name</key>
5953+
<string>entity.name.function.ts</string>
5954+
</dict>
5955+
<key>5</key>
5956+
<dict>
5957+
<key>name</key>
5958+
<string>keyword.operator.optional.ts</string>
5959+
</dict>
5960+
</dict>
5961+
</dict>
5962+
<dict>
5963+
<key>match</key>
5964+
<string>(?x)(?:(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?&lt;!=|:)(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))\s*(\??)(?=:)</string>
5965+
<key>captures</key>
5966+
<dict>
5967+
<key>1</key>
5968+
<dict>
5969+
<key>name</key>
5970+
<string>storage.modifier.ts</string>
5971+
</dict>
5972+
<key>2</key>
5973+
<dict>
5974+
<key>name</key>
5975+
<string>keyword.operator.rest.ts</string>
5976+
</dict>
5977+
<key>3</key>
5978+
<dict>
5979+
<key>name</key>
5980+
<string>variable.parameter.ts variable.language.this.ts</string>
5981+
</dict>
5982+
<key>4</key>
5983+
<dict>
5984+
<key>name</key>
5985+
<string>variable.parameter.ts</string>
5986+
</dict>
5987+
<key>5</key>
5988+
<dict>
5989+
<key>name</key>
5990+
<string>keyword.operator.optional.ts</string>
5991+
</dict>
5992+
</dict>
59155993
</dict>
59165994
<dict>
59175995
<key>include</key>
5918-
<string>#function-parameters</string>
5996+
<string>#type-annotation</string>
5997+
</dict>
5998+
<dict>
5999+
<key>name</key>
6000+
<string>punctuation.separator.parameter.ts</string>
6001+
<key>match</key>
6002+
<string>,</string>
6003+
</dict>
6004+
<dict>
6005+
<key>include</key>
6006+
<string>#type</string>
59196007
</dict>
59206008
</array>
59216009
</dict>

TypeScriptReact.tmLanguage

Lines changed: 90 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -530,6 +530,7 @@
530530
))
531531
))
532532
)) |
533+
(:\s*([\(]\s*([\{\[]\s*)?$)) |
533534
(:\s*(=&gt;|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(&lt;[^&lt;&gt;]*&gt;)|[^&lt;&gt;(),=])+=\s*(
534535
((async\s+)?(
535536
(function\s*[(&lt;*]) |
@@ -975,6 +976,7 @@
975976
))
976977
))
977978
)) |
979+
(:\s*([\(]\s*([\{\[]\s*)?$)) |
978980
(:\s*(=&gt;|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(&lt;[^&lt;&gt;]*&gt;)|[^&lt;&gt;(),=])+=\s*(
979981
((async\s+)?(
980982
(function\s*[(&lt;*]) |
@@ -1443,6 +1445,7 @@
14431445
))
14441446
))
14451447
)) |
1448+
(:\s*([\(]\s*([\{\[]\s*)?$)) |
14461449
(:\s*(=&gt;|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(&lt;[^&lt;&gt;]*&gt;)|[^&lt;&gt;(),=])+=\s*(
14471450
((async\s+)?(
14481451
(function\s*[(&lt;*]) |
@@ -5857,11 +5860,96 @@
58575860
<array>
58585861
<dict>
58595862
<key>include</key>
5860-
<string>#type</string>
5863+
<string>#destructuring-parameter</string>
5864+
</dict>
5865+
<dict>
5866+
<key>match</key>
5867+
<string>(?x)(?:(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?&lt;!=|:)(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))\s*(\??)(?=\s*(:\s*(
5868+
(&lt;) |
5869+
([(]\s*(
5870+
([)]) |
5871+
(\.\.\.) |
5872+
([_$[:alnum:]]+\s*(
5873+
([:,?=])|
5874+
([)]\s*=&gt;)
5875+
))
5876+
))
5877+
)) |
5878+
(:\s*([\(]\s*([\{\[]\s*)?$)))</string>
5879+
<key>captures</key>
5880+
<dict>
5881+
<key>1</key>
5882+
<dict>
5883+
<key>name</key>
5884+
<string>storage.modifier.tsx</string>
5885+
</dict>
5886+
<key>2</key>
5887+
<dict>
5888+
<key>name</key>
5889+
<string>keyword.operator.rest.tsx</string>
5890+
</dict>
5891+
<key>3</key>
5892+
<dict>
5893+
<key>name</key>
5894+
<string>entity.name.function.tsx variable.language.this.tsx</string>
5895+
</dict>
5896+
<key>4</key>
5897+
<dict>
5898+
<key>name</key>
5899+
<string>entity.name.function.tsx</string>
5900+
</dict>
5901+
<key>5</key>
5902+
<dict>
5903+
<key>name</key>
5904+
<string>keyword.operator.optional.tsx</string>
5905+
</dict>
5906+
</dict>
5907+
</dict>
5908+
<dict>
5909+
<key>match</key>
5910+
<string>(?x)(?:(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(public|private|protected|readonly)\s+)?(?:(\.\.\.)\s*)?(?&lt;!=|:)(?&lt;![_$[:alnum:]])(?:(?&lt;=\.\.\.)|(?&lt;!\.))(?:(this)|([_$[:alpha:]][_$[:alnum:]]*))\s*(\??)(?=:)</string>
5911+
<key>captures</key>
5912+
<dict>
5913+
<key>1</key>
5914+
<dict>
5915+
<key>name</key>
5916+
<string>storage.modifier.tsx</string>
5917+
</dict>
5918+
<key>2</key>
5919+
<dict>
5920+
<key>name</key>
5921+
<string>keyword.operator.rest.tsx</string>
5922+
</dict>
5923+
<key>3</key>
5924+
<dict>
5925+
<key>name</key>
5926+
<string>variable.parameter.tsx variable.language.this.tsx</string>
5927+
</dict>
5928+
<key>4</key>
5929+
<dict>
5930+
<key>name</key>
5931+
<string>variable.parameter.tsx</string>
5932+
</dict>
5933+
<key>5</key>
5934+
<dict>
5935+
<key>name</key>
5936+
<string>keyword.operator.optional.tsx</string>
5937+
</dict>
5938+
</dict>
58615939
</dict>
58625940
<dict>
58635941
<key>include</key>
5864-
<string>#function-parameters</string>
5942+
<string>#type-annotation</string>
5943+
</dict>
5944+
<dict>
5945+
<key>name</key>
5946+
<string>punctuation.separator.parameter.tsx</string>
5947+
<key>match</key>
5948+
<string>,</string>
5949+
</dict>
5950+
<dict>
5951+
<key>include</key>
5952+
<string>#type</string>
58655953
</dict>
58665954
</array>
58675955
</dict>

0 commit comments

Comments
 (0)