Skip to content

Commit 160a756

Browse files
committed
Handle the generic tagged template
Fixes #603
1 parent 3f27a79 commit 160a756

5 files changed

+199
-72
lines changed

TypeScript.YAML-tmLanguage

+18-10
Original file line numberDiff line numberDiff line change
@@ -2113,17 +2113,25 @@ repository:
21132113
match: \\(x[0-9A-Fa-f]{2}|[0-2][0-7]{0,2}|3[0-6][0-7]?|37[0-7]?|[4-7][0-7]?|.|$)
21142114

21152115
template:
2116-
name: string.template.ts
2117-
begin: '({{identifier}})?(`)'
2118-
beginCaptures:
2119-
'1': { name: entity.name.function.tagged-template.ts }
2120-
'2': { name: punctuation.definition.string.template.begin.ts }
2121-
end: '`'
2122-
endCaptures:
2123-
'0': { name: punctuation.definition.string.template.end.ts}
21242116
patterns:
2125-
- include: '#template-substitution-element'
2126-
- include: '#string-character-escape'
2117+
- name: string.template.ts
2118+
begin: ({{identifier}})\s*(?=({{typeArguments}}\s*)`)
2119+
beginCaptures:
2120+
'1': { name: entity.name.function.tagged-template.ts }
2121+
end: (?=`)
2122+
patterns:
2123+
- include: '#type-parameters'
2124+
- name: string.template.ts
2125+
begin: '({{identifier}})?(`)'
2126+
beginCaptures:
2127+
'1': { name: entity.name.function.tagged-template.ts }
2128+
'2': { name: punctuation.definition.string.template.begin.ts }
2129+
end: '`'
2130+
endCaptures:
2131+
'0': { name: punctuation.definition.string.template.end.ts}
2132+
patterns:
2133+
- include: '#template-substitution-element'
2134+
- include: '#string-character-escape'
21272135

21282136
template-substitution-element:
21292137
name: meta.template.expression.ts

TypeScript.tmLanguage

+59-31
Original file line numberDiff line numberDiff line change
@@ -5991,42 +5991,70 @@
59915991
</dict>
59925992
<key>template</key>
59935993
<dict>
5994-
<key>name</key>
5995-
<string>string.template.ts</string>
5996-
<key>begin</key>
5997-
<string>([_$[:alpha:]][_$[:alnum:]]*)?(`)</string>
5998-
<key>beginCaptures</key>
5999-
<dict>
6000-
<key>1</key>
6001-
<dict>
6002-
<key>name</key>
6003-
<string>entity.name.function.tagged-template.ts</string>
6004-
</dict>
6005-
<key>2</key>
6006-
<dict>
6007-
<key>name</key>
6008-
<string>punctuation.definition.string.template.begin.ts</string>
6009-
</dict>
6010-
</dict>
6011-
<key>end</key>
6012-
<string>`</string>
6013-
<key>endCaptures</key>
6014-
<dict>
6015-
<key>0</key>
6016-
<dict>
6017-
<key>name</key>
6018-
<string>punctuation.definition.string.template.end.ts</string>
6019-
</dict>
6020-
</dict>
60215994
<key>patterns</key>
60225995
<array>
60235996
<dict>
6024-
<key>include</key>
6025-
<string>#template-substitution-element</string>
5997+
<key>name</key>
5998+
<string>string.template.ts</string>
5999+
<key>begin</key>
6000+
<string>([_$[:alpha:]][_$[:alnum:]]*)\s*(?=(&lt;\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\&lt;\&gt;\,\.\[]|=&gt;|&amp;(?!&amp;)|\|(?!\|)))))([^&lt;&gt;\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?&lt;==)\&gt;|\&lt;\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\&lt;\&gt;\,\.\[]|=&gt;|&amp;(?!&amp;)|\|(?!\|)))))([^&lt;&gt;\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?&lt;==)\&gt;)*(?!=)\&gt;)*(?!=)&gt;\s*)`)</string>
6001+
<key>beginCaptures</key>
6002+
<dict>
6003+
<key>1</key>
6004+
<dict>
6005+
<key>name</key>
6006+
<string>entity.name.function.tagged-template.ts</string>
6007+
</dict>
6008+
</dict>
6009+
<key>end</key>
6010+
<string>(?=`)</string>
6011+
<key>patterns</key>
6012+
<array>
6013+
<dict>
6014+
<key>include</key>
6015+
<string>#type-parameters</string>
6016+
</dict>
6017+
</array>
60266018
</dict>
60276019
<dict>
6028-
<key>include</key>
6029-
<string>#string-character-escape</string>
6020+
<key>name</key>
6021+
<string>string.template.ts</string>
6022+
<key>begin</key>
6023+
<string>([_$[:alpha:]][_$[:alnum:]]*)?(`)</string>
6024+
<key>beginCaptures</key>
6025+
<dict>
6026+
<key>1</key>
6027+
<dict>
6028+
<key>name</key>
6029+
<string>entity.name.function.tagged-template.ts</string>
6030+
</dict>
6031+
<key>2</key>
6032+
<dict>
6033+
<key>name</key>
6034+
<string>punctuation.definition.string.template.begin.ts</string>
6035+
</dict>
6036+
</dict>
6037+
<key>end</key>
6038+
<string>`</string>
6039+
<key>endCaptures</key>
6040+
<dict>
6041+
<key>0</key>
6042+
<dict>
6043+
<key>name</key>
6044+
<string>punctuation.definition.string.template.end.ts</string>
6045+
</dict>
6046+
</dict>
6047+
<key>patterns</key>
6048+
<array>
6049+
<dict>
6050+
<key>include</key>
6051+
<string>#template-substitution-element</string>
6052+
</dict>
6053+
<dict>
6054+
<key>include</key>
6055+
<string>#string-character-escape</string>
6056+
</dict>
6057+
</array>
60306058
</dict>
60316059
</array>
60326060
</dict>

TypeScriptReact.tmLanguage

+59-31
Original file line numberDiff line numberDiff line change
@@ -5937,42 +5937,70 @@
59375937
</dict>
59385938
<key>template</key>
59395939
<dict>
5940-
<key>name</key>
5941-
<string>string.template.tsx</string>
5942-
<key>begin</key>
5943-
<string>([_$[:alpha:]][_$[:alnum:]]*)?(`)</string>
5944-
<key>beginCaptures</key>
5945-
<dict>
5946-
<key>1</key>
5947-
<dict>
5948-
<key>name</key>
5949-
<string>entity.name.function.tagged-template.tsx</string>
5950-
</dict>
5951-
<key>2</key>
5952-
<dict>
5953-
<key>name</key>
5954-
<string>punctuation.definition.string.template.begin.tsx</string>
5955-
</dict>
5956-
</dict>
5957-
<key>end</key>
5958-
<string>`</string>
5959-
<key>endCaptures</key>
5960-
<dict>
5961-
<key>0</key>
5962-
<dict>
5963-
<key>name</key>
5964-
<string>punctuation.definition.string.template.end.tsx</string>
5965-
</dict>
5966-
</dict>
59675940
<key>patterns</key>
59685941
<array>
59695942
<dict>
5970-
<key>include</key>
5971-
<string>#template-substitution-element</string>
5943+
<key>name</key>
5944+
<string>string.template.tsx</string>
5945+
<key>begin</key>
5946+
<string>([_$[:alpha:]][_$[:alnum:]]*)\s*(?=(&lt;\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\&lt;\&gt;\,\.\[]|=&gt;|&amp;(?!&amp;)|\|(?!\|)))))([^&lt;&gt;\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?&lt;==)\&gt;|\&lt;\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\&lt;\&gt;\,\.\[]|=&gt;|&amp;(?!&amp;)|\|(?!\|)))))([^&lt;&gt;\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?&lt;==)\&gt;)*(?!=)\&gt;)*(?!=)&gt;\s*)`)</string>
5947+
<key>beginCaptures</key>
5948+
<dict>
5949+
<key>1</key>
5950+
<dict>
5951+
<key>name</key>
5952+
<string>entity.name.function.tagged-template.tsx</string>
5953+
</dict>
5954+
</dict>
5955+
<key>end</key>
5956+
<string>(?=`)</string>
5957+
<key>patterns</key>
5958+
<array>
5959+
<dict>
5960+
<key>include</key>
5961+
<string>#type-parameters</string>
5962+
</dict>
5963+
</array>
59725964
</dict>
59735965
<dict>
5974-
<key>include</key>
5975-
<string>#string-character-escape</string>
5966+
<key>name</key>
5967+
<string>string.template.tsx</string>
5968+
<key>begin</key>
5969+
<string>([_$[:alpha:]][_$[:alnum:]]*)?(`)</string>
5970+
<key>beginCaptures</key>
5971+
<dict>
5972+
<key>1</key>
5973+
<dict>
5974+
<key>name</key>
5975+
<string>entity.name.function.tagged-template.tsx</string>
5976+
</dict>
5977+
<key>2</key>
5978+
<dict>
5979+
<key>name</key>
5980+
<string>punctuation.definition.string.template.begin.tsx</string>
5981+
</dict>
5982+
</dict>
5983+
<key>end</key>
5984+
<string>`</string>
5985+
<key>endCaptures</key>
5986+
<dict>
5987+
<key>0</key>
5988+
<dict>
5989+
<key>name</key>
5990+
<string>punctuation.definition.string.template.end.tsx</string>
5991+
</dict>
5992+
</dict>
5993+
<key>patterns</key>
5994+
<array>
5995+
<dict>
5996+
<key>include</key>
5997+
<string>#template-substitution-element</string>
5998+
</dict>
5999+
<dict>
6000+
<key>include</key>
6001+
<string>#string-character-escape</string>
6002+
</dict>
6003+
</array>
59766004
</dict>
59776005
</array>
59786006
</dict>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
original file
2+
-----------------------------------
3+
let a = tag<string | number> `${100} ${"hello"}`;
4+
-----------------------------------
5+
6+
Grammar: TypeScript.tmLanguage
7+
-----------------------------------
8+
>let a = tag<string | number> `${100} ${"hello"}`;
9+
^^^
10+
source.ts meta.var.expr.ts storage.type.ts
11+
^
12+
source.ts meta.var.expr.ts
13+
^
14+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.definition.variable.ts variable.other.readwrite.ts
15+
^
16+
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts
17+
^
18+
source.ts meta.var.expr.ts keyword.operator.assignment.ts
19+
^
20+
source.ts meta.var.expr.ts
21+
^^^
22+
source.ts meta.var.expr.ts string.template.ts entity.name.function.tagged-template.ts
23+
^
24+
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts punctuation.definition.typeparameters.begin.ts
25+
^^^^^^
26+
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts support.type.primitive.ts
27+
^
28+
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts
29+
^
30+
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts keyword.operator.type.ts
31+
^
32+
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts
33+
^^^^^^
34+
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts support.type.primitive.ts
35+
^
36+
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts punctuation.definition.typeparameters.end.ts
37+
^
38+
source.ts meta.var.expr.ts string.template.ts
39+
^
40+
source.ts meta.var.expr.ts string.template.ts punctuation.definition.string.template.begin.ts
41+
^^
42+
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts punctuation.definition.template-expression.begin.ts
43+
^^^
44+
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts meta.embedded.line.ts constant.numeric.decimal.ts
45+
^
46+
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts punctuation.definition.template-expression.end.ts
47+
^
48+
source.ts meta.var.expr.ts string.template.ts
49+
^^
50+
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts punctuation.definition.template-expression.begin.ts
51+
^
52+
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts meta.embedded.line.ts string.quoted.double.ts punctuation.definition.string.begin.ts
53+
^^^^^
54+
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts meta.embedded.line.ts string.quoted.double.ts
55+
^
56+
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts meta.embedded.line.ts string.quoted.double.ts punctuation.definition.string.end.ts
57+
^
58+
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts punctuation.definition.template-expression.end.ts
59+
^
60+
source.ts meta.var.expr.ts string.template.ts punctuation.definition.string.template.end.ts
61+
^
62+
source.ts punctuation.terminator.statement.ts

tests/cases/genericTaggedTemplate.ts

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
let a = tag<string | number> `${100} ${"hello"}`;

0 commit comments

Comments
 (0)