Skip to content

Commit aef7be5

Browse files
committed
Support the JSX Opening or self closing tag's type arguments
This handles support for microsoft/TypeScript#22415
1 parent 30a2e6b commit aef7be5

6 files changed

+144
-83
lines changed

TypeScript.YAML-tmLanguage

+16-12
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ variables:
3636
# Identifier start | matching braces | matching parenthesis | matching square brackets | matching strings
3737
typeArgumentsStart: ({{typeParamersStart}}|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))
3838
typeArgumentsInnerExpressionPart: '[^<>\(]|{{matchingParenthesis}}|(?<==)\>'
39-
typeArguments: (<\s*{{typeArgumentsStart}}({{typeArgumentsInnerExpressionPart}}|\<\s*{{typeArgumentsStart}}({{typeArgumentsInnerExpressionPart}})*(?!=)\>)*(?!=)>\s*)
40-
functionCallLookup: \s*(\?\.\s*)?{{typeArguments}}?\(
39+
typeArguments: '<\s*{{typeArgumentsStart}}({{typeArgumentsInnerExpressionPart}}|\<\s*{{typeArgumentsStart}}({{typeArgumentsInnerExpressionPart}})*(?!=)\>)*(?!=)>'
40+
functionCallLookup: \s*(\?\.\s*)?({{typeArguments}}\s*)?\(
4141
arrowLookup: |-
4242
# sure shot arrow functions even if => is on new line
4343
(
@@ -1111,16 +1111,7 @@ repository:
11111111
- include: '#comment'
11121112
- name: meta.function-call.ts punctuation.accessor.optional.ts
11131113
match: \?\.
1114-
- name: meta.type.parameters.ts
1115-
begin: \<
1116-
beginCaptures:
1117-
'0': { name: punctuation.definition.typeparameters.begin.ts }
1118-
end: \>
1119-
endCaptures:
1120-
'0': { name: punctuation.definition.typeparameters.end.ts }
1121-
patterns:
1122-
- include: '#type'
1123-
- include: '#punctuation-comma'
1114+
- include: '#type-arguments'
11241115
- include: '#paren-expression'
11251116

11261117
new-expr:
@@ -1755,6 +1746,19 @@ repository:
17551746
- include: '#type'
17561747
- include: '#punctuation-comma'
17571748

1749+
#type arguments
1750+
type-arguments:
1751+
name: meta.type.parameters.ts
1752+
begin: \<
1753+
beginCaptures:
1754+
'0': { name: punctuation.definition.typeparameters.begin.ts }
1755+
end: \>
1756+
endCaptures:
1757+
'0': { name: punctuation.definition.typeparameters.end.ts }
1758+
patterns:
1759+
- include: '#type'
1760+
- include: '#punctuation-comma'
1761+
17581762
#different types
17591763
type:
17601764
patterns:

TypeScript.tmLanguage

+38-33
Original file line numberDiff line numberDiff line change
@@ -3481,39 +3481,8 @@
34813481
<string>\?\.</string>
34823482
</dict>
34833483
<dict>
3484-
<key>name</key>
3485-
<string>meta.type.parameters.ts</string>
3486-
<key>begin</key>
3487-
<string>\&lt;</string>
3488-
<key>beginCaptures</key>
3489-
<dict>
3490-
<key>0</key>
3491-
<dict>
3492-
<key>name</key>
3493-
<string>punctuation.definition.typeparameters.begin.ts</string>
3494-
</dict>
3495-
</dict>
3496-
<key>end</key>
3497-
<string>\&gt;</string>
3498-
<key>endCaptures</key>
3499-
<dict>
3500-
<key>0</key>
3501-
<dict>
3502-
<key>name</key>
3503-
<string>punctuation.definition.typeparameters.end.ts</string>
3504-
</dict>
3505-
</dict>
3506-
<key>patterns</key>
3507-
<array>
3508-
<dict>
3509-
<key>include</key>
3510-
<string>#type</string>
3511-
</dict>
3512-
<dict>
3513-
<key>include</key>
3514-
<string>#punctuation-comma</string>
3515-
</dict>
3516-
</array>
3484+
<key>include</key>
3485+
<string>#type-arguments</string>
35173486
</dict>
35183487
<dict>
35193488
<key>include</key>
@@ -4985,6 +4954,42 @@
49854954
</dict>
49864955
</array>
49874956
</dict>
4957+
<key>type-arguments</key>
4958+
<dict>
4959+
<key>name</key>
4960+
<string>meta.type.parameters.ts</string>
4961+
<key>begin</key>
4962+
<string>\&lt;</string>
4963+
<key>beginCaptures</key>
4964+
<dict>
4965+
<key>0</key>
4966+
<dict>
4967+
<key>name</key>
4968+
<string>punctuation.definition.typeparameters.begin.ts</string>
4969+
</dict>
4970+
</dict>
4971+
<key>end</key>
4972+
<string>\&gt;</string>
4973+
<key>endCaptures</key>
4974+
<dict>
4975+
<key>0</key>
4976+
<dict>
4977+
<key>name</key>
4978+
<string>punctuation.definition.typeparameters.end.ts</string>
4979+
</dict>
4980+
</dict>
4981+
<key>patterns</key>
4982+
<array>
4983+
<dict>
4984+
<key>include</key>
4985+
<string>#type</string>
4986+
</dict>
4987+
<dict>
4988+
<key>include</key>
4989+
<string>#punctuation-comma</string>
4990+
</dict>
4991+
</array>
4992+
</dict>
49884993
<key>type</key>
49894994
<dict>
49904995
<key>patterns</key>

TypeScriptReact.YAML-tmLanguage

+2-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ variables:
1414
jsxTagName: \s*{{jsxTagNamespace}}((?:[a-z][a-z0-9]*|({{jsxTagOrAtrributeIdentifier}}*))(?<!\.|-))
1515
jsxOpeningTagWithoutAttributes: (<){{jsxTagName}}?\s*(>)
1616
jsxClosingTag: (</){{jsxTagName}}?\s*(>)
17-
jsxTagStart: (<){{jsxTagName}}(?=\s+(?!\?)|\/?>)
17+
jsxTagStart: (<){{jsxTagName}}(?=(?:\s*{{typeArguments}})?\s+(?!\?)|\/?>)
1818
jsxTagStartLookahead: (?={{jsxTagStart}})
1919

2020
repository:
@@ -122,6 +122,7 @@ repository:
122122
contentName: meta.tag.attributes.tsx
123123
patterns:
124124
- include: '#comment'
125+
- include: '#type-arguments'
125126
- include: '#jsx-tag-attributes'
126127
- include: '#jsx-tag-attributes-illegal'
127128
- begin: (>)

TypeScriptReact.tmLanguage

+46-37
Original file line numberDiff line numberDiff line change
@@ -3485,39 +3485,8 @@
34853485
<string>\?\.</string>
34863486
</dict>
34873487
<dict>
3488-
<key>name</key>
3489-
<string>meta.type.parameters.tsx</string>
3490-
<key>begin</key>
3491-
<string>\&lt;</string>
3492-
<key>beginCaptures</key>
3493-
<dict>
3494-
<key>0</key>
3495-
<dict>
3496-
<key>name</key>
3497-
<string>punctuation.definition.typeparameters.begin.tsx</string>
3498-
</dict>
3499-
</dict>
3500-
<key>end</key>
3501-
<string>\&gt;</string>
3502-
<key>endCaptures</key>
3503-
<dict>
3504-
<key>0</key>
3505-
<dict>
3506-
<key>name</key>
3507-
<string>punctuation.definition.typeparameters.end.tsx</string>
3508-
</dict>
3509-
</dict>
3510-
<key>patterns</key>
3511-
<array>
3512-
<dict>
3513-
<key>include</key>
3514-
<string>#type</string>
3515-
</dict>
3516-
<dict>
3517-
<key>include</key>
3518-
<string>#punctuation-comma</string>
3519-
</dict>
3520-
</array>
3488+
<key>include</key>
3489+
<string>#type-arguments</string>
35213490
</dict>
35223491
<dict>
35233492
<key>include</key>
@@ -4931,6 +4900,42 @@
49314900
</dict>
49324901
</array>
49334902
</dict>
4903+
<key>type-arguments</key>
4904+
<dict>
4905+
<key>name</key>
4906+
<string>meta.type.parameters.tsx</string>
4907+
<key>begin</key>
4908+
<string>\&lt;</string>
4909+
<key>beginCaptures</key>
4910+
<dict>
4911+
<key>0</key>
4912+
<dict>
4913+
<key>name</key>
4914+
<string>punctuation.definition.typeparameters.begin.tsx</string>
4915+
</dict>
4916+
</dict>
4917+
<key>end</key>
4918+
<string>\&gt;</string>
4919+
<key>endCaptures</key>
4920+
<dict>
4921+
<key>0</key>
4922+
<dict>
4923+
<key>name</key>
4924+
<string>punctuation.definition.typeparameters.end.tsx</string>
4925+
</dict>
4926+
</dict>
4927+
<key>patterns</key>
4928+
<array>
4929+
<dict>
4930+
<key>include</key>
4931+
<string>#type</string>
4932+
</dict>
4933+
<dict>
4934+
<key>include</key>
4935+
<string>#punctuation-comma</string>
4936+
</dict>
4937+
</array>
4938+
</dict>
49344939
<key>type</key>
49354940
<dict>
49364941
<key>patterns</key>
@@ -7024,7 +7029,7 @@
70247029
<string>(?x)
70257030
(?&lt;=[({\[,?=&gt;:*]|&amp;&amp;|\|\||\?|^return|[^\._$[:alnum:]]return|^default|[^\._$[:alnum:]]default|^)\s*
70267031
(?!&lt;\s*[_$[:alpha:]][_$[:alnum:]]*((\s+extends\s+[^=&gt;])|,)) # look ahead is not type parameter of arrow
7027-
(?=(&lt;)\s*(?:([_$a-zA-Z][-$\w.]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?&lt;!\.|-))(?=\s+(?!\?)|\/?&gt;))</string>
7032+
(?=(&lt;)\s*(?:([_$a-zA-Z][-$\w.]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?&lt;!\.|-))(?=(?:\s*&lt;\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))([^&lt;&gt;\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?&lt;==)\&gt;|\&lt;\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))([^&lt;&gt;\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?&lt;==)\&gt;)*(?!=)\&gt;)*(?!=)&gt;)?\s+(?!\?)|\/?&gt;))</string>
70287033
<key>end</key>
70297034
<string>(/&gt;)|(?:(&lt;/)\s*(?:([_$a-zA-Z][-$\w.]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?&lt;!\.|-))?\s*(&gt;))</string>
70307035
<key>endCaptures</key>
@@ -7081,7 +7086,7 @@
70817086
<key>jsx-child-tag</key>
70827087
<dict>
70837088
<key>begin</key>
7084-
<string>(?=(&lt;)\s*(?:([_$a-zA-Z][-$\w.]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?&lt;!\.|-))(?=\s+(?!\?)|\/?&gt;))</string>
7089+
<string>(?=(&lt;)\s*(?:([_$a-zA-Z][-$\w.]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?&lt;!\.|-))(?=(?:\s*&lt;\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))([^&lt;&gt;\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?&lt;==)\&gt;|\&lt;\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))([^&lt;&gt;\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?&lt;==)\&gt;)*(?!=)\&gt;)*(?!=)&gt;)?\s+(?!\?)|\/?&gt;))</string>
70857090
<key>end</key>
70867091
<string>(/&gt;)|(?:(&lt;/)\s*(?:([_$a-zA-Z][-$\w.]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?&lt;!\.|-))?\s*(&gt;))</string>
70877092
<key>endCaptures</key>
@@ -7140,14 +7145,14 @@
71407145
<key>name</key>
71417146
<string>meta.tag.tsx</string>
71427147
<key>begin</key>
7143-
<string>(?=(&lt;)\s*(?:([_$a-zA-Z][-$\w.]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?&lt;!\.|-))(?=\s+(?!\?)|\/?&gt;))</string>
7148+
<string>(?=(&lt;)\s*(?:([_$a-zA-Z][-$\w.]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?&lt;!\.|-))(?=(?:\s*&lt;\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))([^&lt;&gt;\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?&lt;==)\&gt;|\&lt;\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))([^&lt;&gt;\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?&lt;==)\&gt;)*(?!=)\&gt;)*(?!=)&gt;)?\s+(?!\?)|\/?&gt;))</string>
71447149
<key>end</key>
71457150
<string>(?=(/&gt;)|(?:(&lt;/)\s*(?:([_$a-zA-Z][-$\w.]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?&lt;!\.|-))?\s*(&gt;)))</string>
71467151
<key>patterns</key>
71477152
<array>
71487153
<dict>
71497154
<key>begin</key>
7150-
<string>(&lt;)\s*(?:([_$a-zA-Z][-$\w.]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?&lt;!\.|-))(?=\s+(?!\?)|\/?&gt;)</string>
7155+
<string>(&lt;)\s*(?:([_$a-zA-Z][-$\w.]*)(?&lt;!\.|-)(:))?((?:[a-z][a-z0-9]*|([_$a-zA-Z][-$\w.]*))(?&lt;!\.|-))(?=(?:\s*&lt;\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))([^&lt;&gt;\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?&lt;==)\&gt;|\&lt;\s*(([_$[:alpha:]]|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\]))|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))([^&lt;&gt;\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?&lt;==)\&gt;)*(?!=)\&gt;)*(?!=)&gt;)?\s+(?!\?)|\/?&gt;)</string>
71517156
<key>beginCaptures</key>
71527157
<dict>
71537158
<key>1</key>
@@ -7186,6 +7191,10 @@
71867191
<key>include</key>
71877192
<string>#comment</string>
71887193
</dict>
7194+
<dict>
7195+
<key>include</key>
7196+
<string>#type-arguments</string>
7197+
</dict>
71897198
<dict>
71907199
<key>include</key>
71917200
<string>#jsx-tag-attributes</string>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
original file
2+
-----------------------------------
3+
// @onlyOwnGrammar - As this has jsx
4+
<MyComponent<number> data={12} />
5+
-----------------------------------
6+
7+
Grammar: TypeScriptReact.tmLanguage
8+
-----------------------------------
9+
>// @onlyOwnGrammar - As this has jsx
10+
^^
11+
source.tsx comment.line.double-slash.tsx punctuation.definition.comment.tsx
12+
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
13+
source.tsx comment.line.double-slash.tsx
14+
><MyComponent<number> data={12} />
15+
^
16+
source.tsx meta.tag.tsx punctuation.definition.tag.begin.tsx
17+
^^^^^^^^^^^
18+
source.tsx meta.tag.tsx entity.name.tag.tsx support.class.component.tsx
19+
^
20+
source.tsx meta.tag.tsx meta.tag.attributes.tsx meta.type.parameters.tsx punctuation.definition.typeparameters.begin.tsx
21+
^^^^^^
22+
source.tsx meta.tag.tsx meta.tag.attributes.tsx meta.type.parameters.tsx support.type.primitive.tsx
23+
^
24+
source.tsx meta.tag.tsx meta.tag.attributes.tsx meta.type.parameters.tsx punctuation.definition.typeparameters.end.tsx
25+
^
26+
source.tsx meta.tag.tsx meta.tag.attributes.tsx
27+
^^^^
28+
source.tsx meta.tag.tsx meta.tag.attributes.tsx entity.other.attribute-name.tsx
29+
^
30+
source.tsx meta.tag.tsx meta.tag.attributes.tsx keyword.operator.assignment.tsx
31+
^
32+
source.tsx meta.tag.tsx meta.tag.attributes.tsx meta.embedded.expression.tsx punctuation.section.embedded.begin.tsx
33+
^^
34+
source.tsx meta.tag.tsx meta.tag.attributes.tsx meta.embedded.expression.tsx constant.numeric.decimal.tsx
35+
^
36+
source.tsx meta.tag.tsx meta.tag.attributes.tsx meta.embedded.expression.tsx punctuation.section.embedded.end.tsx
37+
^
38+
source.tsx meta.tag.tsx meta.tag.attributes.tsx
39+
^^
40+
source.tsx meta.tag.tsx punctuation.definition.tag.end.tsx
+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// @onlyOwnGrammar - As this has jsx
2+
<MyComponent<number> data={12} />

0 commit comments

Comments
 (0)