Skip to content

Commit

Permalink
Handle the generic tagged template
Browse files Browse the repository at this point in the history
Fixes #603
  • Loading branch information
sheetalkamat committed Apr 19, 2018
1 parent 3f27a79 commit 160a756
Show file tree
Hide file tree
Showing 5 changed files with 199 additions and 72 deletions.
28 changes: 18 additions & 10 deletions TypeScript.YAML-tmLanguage
Original file line number Diff line number Diff line change
Expand Up @@ -2113,17 +2113,25 @@ repository:
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]?|.|$)

template:
name: string.template.ts
begin: '({{identifier}})?(`)'
beginCaptures:
'1': { name: entity.name.function.tagged-template.ts }
'2': { name: punctuation.definition.string.template.begin.ts }
end: '`'
endCaptures:
'0': { name: punctuation.definition.string.template.end.ts}
patterns:
- include: '#template-substitution-element'
- include: '#string-character-escape'
- name: string.template.ts
begin: ({{identifier}})\s*(?=({{typeArguments}}\s*)`)
beginCaptures:
'1': { name: entity.name.function.tagged-template.ts }
end: (?=`)
patterns:
- include: '#type-parameters'
- name: string.template.ts
begin: '({{identifier}})?(`)'
beginCaptures:
'1': { name: entity.name.function.tagged-template.ts }
'2': { name: punctuation.definition.string.template.begin.ts }
end: '`'
endCaptures:
'0': { name: punctuation.definition.string.template.end.ts}
patterns:
- include: '#template-substitution-element'
- include: '#string-character-escape'

template-substitution-element:
name: meta.template.expression.ts
Expand Down
90 changes: 59 additions & 31 deletions TypeScript.tmLanguage
Original file line number Diff line number Diff line change
Expand Up @@ -5991,42 +5991,70 @@
</dict>
<key>template</key>
<dict>
<key>name</key>
<string>string.template.ts</string>
<key>begin</key>
<string>([_$[:alpha:]][_$[:alnum:]]*)?(`)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.name.function.tagged-template.ts</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.template.begin.ts</string>
</dict>
</dict>
<key>end</key>
<string>`</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.template.end.ts</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#template-substitution-element</string>
<key>name</key>
<string>string.template.ts</string>
<key>begin</key>
<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>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.name.function.tagged-template.ts</string>
</dict>
</dict>
<key>end</key>
<string>(?=`)</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#type-parameters</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#string-character-escape</string>
<key>name</key>
<string>string.template.ts</string>
<key>begin</key>
<string>([_$[:alpha:]][_$[:alnum:]]*)?(`)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.name.function.tagged-template.ts</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.template.begin.ts</string>
</dict>
</dict>
<key>end</key>
<string>`</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.template.end.ts</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#template-substitution-element</string>
</dict>
<dict>
<key>include</key>
<string>#string-character-escape</string>
</dict>
</array>
</dict>
</array>
</dict>
Expand Down
90 changes: 59 additions & 31 deletions TypeScriptReact.tmLanguage
Original file line number Diff line number Diff line change
Expand Up @@ -5937,42 +5937,70 @@
</dict>
<key>template</key>
<dict>
<key>name</key>
<string>string.template.tsx</string>
<key>begin</key>
<string>([_$[:alpha:]][_$[:alnum:]]*)?(`)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.name.function.tagged-template.tsx</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.template.begin.tsx</string>
</dict>
</dict>
<key>end</key>
<string>`</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.template.end.tsx</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#template-substitution-element</string>
<key>name</key>
<string>string.template.tsx</string>
<key>begin</key>
<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>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.name.function.tagged-template.tsx</string>
</dict>
</dict>
<key>end</key>
<string>(?=`)</string>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#type-parameters</string>
</dict>
</array>
</dict>
<dict>
<key>include</key>
<string>#string-character-escape</string>
<key>name</key>
<string>string.template.tsx</string>
<key>begin</key>
<string>([_$[:alpha:]][_$[:alnum:]]*)?(`)</string>
<key>beginCaptures</key>
<dict>
<key>1</key>
<dict>
<key>name</key>
<string>entity.name.function.tagged-template.tsx</string>
</dict>
<key>2</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.template.begin.tsx</string>
</dict>
</dict>
<key>end</key>
<string>`</string>
<key>endCaptures</key>
<dict>
<key>0</key>
<dict>
<key>name</key>
<string>punctuation.definition.string.template.end.tsx</string>
</dict>
</dict>
<key>patterns</key>
<array>
<dict>
<key>include</key>
<string>#template-substitution-element</string>
</dict>
<dict>
<key>include</key>
<string>#string-character-escape</string>
</dict>
</array>
</dict>
</array>
</dict>
Expand Down
62 changes: 62 additions & 0 deletions tests/baselines/genericTaggedTemplate.baseline.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
original file
-----------------------------------
let a = tag<string | number> `${100} ${"hello"}`;
-----------------------------------

Grammar: TypeScript.tmLanguage
-----------------------------------
>let a = tag<string | number> `${100} ${"hello"}`;
^^^
source.ts meta.var.expr.ts storage.type.ts
^
source.ts meta.var.expr.ts
^
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts meta.definition.variable.ts variable.other.readwrite.ts
^
source.ts meta.var.expr.ts meta.var-single-variable.expr.ts
^
source.ts meta.var.expr.ts keyword.operator.assignment.ts
^
source.ts meta.var.expr.ts
^^^
source.ts meta.var.expr.ts string.template.ts entity.name.function.tagged-template.ts
^
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts punctuation.definition.typeparameters.begin.ts
^^^^^^
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts support.type.primitive.ts
^
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts
^
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts keyword.operator.type.ts
^
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts
^^^^^^
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts support.type.primitive.ts
^
source.ts meta.var.expr.ts string.template.ts meta.type.parameters.ts punctuation.definition.typeparameters.end.ts
^
source.ts meta.var.expr.ts string.template.ts
^
source.ts meta.var.expr.ts string.template.ts punctuation.definition.string.template.begin.ts
^^
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts punctuation.definition.template-expression.begin.ts
^^^
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts meta.embedded.line.ts constant.numeric.decimal.ts
^
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts punctuation.definition.template-expression.end.ts
^
source.ts meta.var.expr.ts string.template.ts
^^
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts punctuation.definition.template-expression.begin.ts
^
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
^^^^^
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts meta.embedded.line.ts string.quoted.double.ts
^
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
^
source.ts meta.var.expr.ts string.template.ts meta.template.expression.ts punctuation.definition.template-expression.end.ts
^
source.ts meta.var.expr.ts string.template.ts punctuation.definition.string.template.end.ts
^
source.ts punctuation.terminator.statement.ts
1 change: 1 addition & 0 deletions tests/cases/genericTaggedTemplate.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
let a = tag<string | number> `${100} ${"hello"}`;

0 comments on commit 160a756

Please sign in to comment.