@@ -588,6 +588,80 @@ export const Expression: GrammarDefinition = {
588588 ] ,
589589 } ,
590590
591+ // Via https://github.com/microsoft/vscode-typescript-next/blob/bb6c015fdfe8c80e2f24bd83bb70d4d6581b0708/syntaxes/TypeScript.tmLanguage.json
592+ templateLiteral : {
593+ patterns : [
594+ { include : '#templateLiteralCall' } ,
595+ {
596+ contentName : 'string.template.ts' ,
597+ begin : / ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * ) ? ( ` ) / ,
598+ beginCaptures : {
599+ 1 : { name : 'entity.name.function.tagged-template.ts' } ,
600+ 2 : { name : 'string.template.ts punctuation.definition.string.template.begin.ts' } ,
601+ } ,
602+ end : / ` / ,
603+ endCaptures : {
604+ 0 : { name : 'string.template.ts punctuation.definition.string.template.end.ts' } ,
605+ } ,
606+ patterns : [
607+ { include : '#templateLiteralSubstitutionElement' } ,
608+ { include : '#stringCharacterEscape' } ,
609+ ] ,
610+ } ,
611+ ] ,
612+ } ,
613+
614+ templateLiteralCall : {
615+ patterns : [
616+ {
617+ begin :
618+ / (? = ( ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * \s * \? ? \. \s * ) * | ( \? ? \. \s * ) ? ) ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * ) ( < \s * ( ( ( k e y o f | i n f e r | t y p e o f | r e a d o n l y ) \s + ) | ( ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * | ( \{ ( [ ^ \{ \} ] | ( \{ ( [ ^ \{ \} ] | \{ [ ^ \{ \} ] * \} ) * \} ) ) * \} ) | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | ( \[ ( [ ^ \[ \] ] | ( \[ ( [ ^ \[ \] ] | \[ [ ^ \[ \] ] * \] ) * \] ) ) * \] ) | ( \' ( [ ^ \' \\ ] | \\ .) * \' ) | ( \" ( [ ^ \" \\ ] | \\ .) * \" ) | ( \` ( [ ^ \` \\ ] | \\ .) * \` ) ) (? = \s * ( [ \< \> \, \. \[ ] | = > | & (? ! & ) | \| (? ! \| ) ) ) ) ) ( [ ^ < > \( ] | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | (?< = = ) \> | \< \s * ( ( ( k e y o f | i n f e r | t y p e o f | r e a d o n l y ) \s + ) | ( ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * | ( \{ ( [ ^ \{ \} ] | ( \{ ( [ ^ \{ \} ] | \{ [ ^ \{ \} ] * \} ) * \} ) ) * \} ) | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | ( \[ ( [ ^ \[ \] ] | ( \[ ( [ ^ \[ \] ] | \[ [ ^ \[ \] ] * \] ) * \] ) ) * \] ) | ( \' ( [ ^ \' \\ ] | \\ .) * \' ) | ( \" ( [ ^ \" \\ ] | \\ .) * \" ) | ( \` ( [ ^ \` \\ ] | \\ .) * \` ) ) (? = \s * ( [ \< \> \, \. \[ ] | = > | & (? ! & ) | \| (? ! \| ) ) ) ) ) ( ( [ ^ < > \( ] | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | (?< = = ) \> | \< \s * ( ( ( k e y o f | i n f e r | t y p e o f | r e a d o n l y ) \s + ) | ( ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * | ( \{ ( [ ^ \{ \} ] | ( \{ ( [ ^ \{ \} ] | \{ [ ^ \{ \} ] * \} ) * \} ) ) * \} ) | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | ( \[ ( [ ^ \[ \] ] | ( \[ ( [ ^ \[ \] ] | \[ [ ^ \[ \] ] * \] ) * \] ) ) * \] ) | ( \' ( [ ^ \' \\ ] | \\ .) * \' ) | ( \" ( [ ^ \" \\ ] | \\ .) * \" ) | ( \` ( [ ^ \` \\ ] | \\ .) * \` ) ) (? = \s * ( [ \< \> \, \. \[ ] | = > | & (? ! & ) | \| (? ! \| ) ) ) ) ) ( [ ^ < > \( ] | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | (?< = = ) \> ) * (?< ! = ) \> ) ) * (?< ! = ) \> ) * (?< ! = ) > \s * ) ? ` ) / ,
619+ end : / (? = ` ) / ,
620+ patterns : [
621+ {
622+ begin :
623+ / (? = ( ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * \s * \? ? \. \s * ) * | ( \? ? \. \s * ) ? ) ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * ) ) / ,
624+ end : / (? = ( < \s * ( ( ( k e y o f | i n f e r | t y p e o f | r e a d o n l y ) \s + ) | ( ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * | ( \{ ( [ ^ \{ \} ] | ( \{ ( [ ^ \{ \} ] | \{ [ ^ \{ \} ] * \} ) * \} ) ) * \} ) | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | ( \[ ( [ ^ \[ \] ] | ( \[ ( [ ^ \[ \] ] | \[ [ ^ \[ \] ] * \] ) * \] ) ) * \] ) | ( \' ( [ ^ \' \\ ] | \\ .) * \' ) | ( \" ( [ ^ \" \\ ] | \\ .) * \" ) | ( \` ( [ ^ \` \\ ] | \\ .) * \` ) ) (? = \s * ( [ \< \> \, \. \[ ] | = > | & (? ! & ) | \| (? ! \| ) ) ) ) ) ( [ ^ < > \( ] | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | (?< = = ) \> | \< \s * ( ( ( k e y o f | i n f e r | t y p e o f | r e a d o n l y ) \s + ) | ( ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * | ( \{ ( [ ^ \{ \} ] | ( \{ ( [ ^ \{ \} ] | \{ [ ^ \{ \} ] * \} ) * \} ) ) * \} ) | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | ( \[ ( [ ^ \[ \] ] | ( \[ ( [ ^ \[ \] ] | \[ [ ^ \[ \] ] * \] ) * \] ) ) * \] ) | ( \' ( [ ^ \' \\ ] | \\ .) * \' ) | ( \" ( [ ^ \" \\ ] | \\ .) * \" ) | ( \` ( [ ^ \` \\ ] | \\ .) * \` ) ) (? = \s * ( [ \< \> \, \. \[ ] | = > | & (? ! & ) | \| (? ! \| ) ) ) ) ) ( ( [ ^ < > \( ] | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | (?< = = ) \> | \< \s * ( ( ( k e y o f | i n f e r | t y p e o f | r e a d o n l y ) \s + ) | ( ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * | ( \{ ( [ ^ \{ \} ] | ( \{ ( [ ^ \{ \} ] | \{ [ ^ \{ \} ] * \} ) * \} ) ) * \} ) | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | ( \[ ( [ ^ \[ \] ] | ( \[ ( [ ^ \[ \] ] | \[ [ ^ \[ \] ] * \] ) * \] ) ) * \] ) | ( \' ( [ ^ \' \\ ] | \\ .) * \' ) | ( \" ( [ ^ \" \\ ] | \\ .) * \" ) | ( \` ( [ ^ \` \\ ] | \\ .) * \` ) ) (? = \s * ( [ \< \> \, \. \[ ] | = > | & (? ! & ) | \| (? ! \| ) ) ) ) ) ( [ ^ < > \( ] | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | (?< = = ) \> ) * (?< ! = ) \> ) ) * (?< ! = ) \> ) * (?< ! = ) > \s * ) ? ` ) / ,
625+ patterns : [
626+ { include : '#support-function-call-identifiers' } ,
627+ {
628+ name : 'entity.name.function.tagged-template.ts' ,
629+ match : / ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * ) / ,
630+ } ,
631+ ] ,
632+ } ,
633+ { include : '#typeArguments' } ,
634+ ] ,
635+ } ,
636+ {
637+ begin :
638+ / ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * ) ? \s * (? = ( < \s * ( ( ( k e y o f | i n f e r | t y p e o f | r e a d o n l y ) \s + ) | ( ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * | ( \{ ( [ ^ \{ \} ] | ( \{ ( [ ^ \{ \} ] | \{ [ ^ \{ \} ] * \} ) * \} ) ) * \} ) | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | ( \[ ( [ ^ \[ \] ] | ( \[ ( [ ^ \[ \] ] | \[ [ ^ \[ \] ] * \] ) * \] ) ) * \] ) | ( \' ( [ ^ \' \\ ] | \\ .) * \' ) | ( \" ( [ ^ \" \\ ] | \\ .) * \" ) | ( \` ( [ ^ \` \\ ] | \\ .) * \` ) ) (? = \s * ( [ \< \> \, \. \[ ] | = > | & (? ! & ) | \| (? ! \| ) ) ) ) ) ( [ ^ < > \( ] | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | (?< = = ) \> | \< \s * ( ( ( k e y o f | i n f e r | t y p e o f | r e a d o n l y ) \s + ) | ( ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * | ( \{ ( [ ^ \{ \} ] | ( \{ ( [ ^ \{ \} ] | \{ [ ^ \{ \} ] * \} ) * \} ) ) * \} ) | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | ( \[ ( [ ^ \[ \] ] | ( \[ ( [ ^ \[ \] ] | \[ [ ^ \[ \] ] * \] ) * \] ) ) * \] ) | ( \' ( [ ^ \' \\ ] | \\ .) * \' ) | ( \" ( [ ^ \" \\ ] | \\ .) * \" ) | ( \` ( [ ^ \` \\ ] | \\ .) * \` ) ) (? = \s * ( [ \< \> \, \. \[ ] | = > | & (? ! & ) | \| (? ! \| ) ) ) ) ) ( ( [ ^ < > \( ] | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | (?< = = ) \> | \< \s * ( ( ( k e y o f | i n f e r | t y p e o f | r e a d o n l y ) \s + ) | ( ( [ _ $ [: alpha :] ] [ _ $ [: alnum :] ] * | ( \{ ( [ ^ \{ \} ] | ( \{ ( [ ^ \{ \} ] | \{ [ ^ \{ \} ] * \} ) * \} ) ) * \} ) | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | ( \[ ( [ ^ \[ \] ] | ( \[ ( [ ^ \[ \] ] | \[ [ ^ \[ \] ] * \] ) * \] ) ) * \] ) | ( \' ( [ ^ \' \\ ] | \\ .) * \' ) | ( \" ( [ ^ \" \\ ] | \\ .) * \" ) | ( \` ( [ ^ \` \\ ] | \\ .) * \` ) ) (? = \s * ( [ \< \> \, \. \[ ] | = > | & (? ! & ) | \| (? ! \| ) ) ) ) ) ( [ ^ < > \( ] | ( \( ( [ ^ \( \) ] | ( \( ( [ ^ \( \) ] | \( [ ^ \( \) ] * \) ) * \) ) ) * \) ) | (?< = = ) \> ) * (?< ! = ) \> ) ) * (?< ! = ) \> ) * (?< ! = ) > \s * ) ` ) / ,
639+ beginCaptures : { 1 : { name : 'entity.name.function.tagged-template.ts' } } ,
640+ end : / (? = ` ) / ,
641+ patterns : [ { include : '#typeArguments' } ] ,
642+ } ,
643+ ] ,
644+ } ,
645+
646+ templateLiteralSubstitutionElement : {
647+ name : 'meta.template.expression.ts' ,
648+ begin : / \$ { / ,
649+ beginCaptures : { 0 : { name : 'punctuation.definition.template-expression.begin.ts' } } ,
650+ end : / } / ,
651+ endCaptures : { 0 : { name : 'punctuation.definition.template-expression.end.ts' } } ,
652+ patterns : [ { include : '#ngExpression' } ] ,
653+ contentName : 'meta.embedded.line.ts' ,
654+ } ,
655+
656+ typeArguments : {
657+ name : 'meta.type.parameters.ts' ,
658+ begin : / < / ,
659+ beginCaptures : { 0 : { name : 'punctuation.definition.typeparameters.begin.ts' } } ,
660+ end : / > / ,
661+ endCaptures : { 0 : { name : 'punctuation.definition.typeparameters.end.ts' } } ,
662+ patterns : [ { include : '#typeArgumentsBody' } ] ,
663+ } ,
664+
591665 stringCharacterEscape : {
592666 name : 'constant.character.escape.ts' ,
593667 match : / \\ ( x \h { 2 } | [ 0 - 2 ] [ 0 - 7 ] { 0 , 2 } | 3 [ 0 - 6 ] [ 0 - 7 ] ? | 3 7 [ 0 - 7 ] ? | [ 4 - 7 ] [ 0 - 7 ] ? | .| $ ) / ,
@@ -631,6 +705,9 @@ export const Expression: GrammarDefinition = {
631705 {
632706 include : '#qstringDouble' ,
633707 } ,
708+ {
709+ include : '#templateLiteral' ,
710+ }
634711 ] ,
635712 } ,
636713
@@ -824,6 +901,17 @@ export const Expression: GrammarDefinition = {
824901 ] ,
825902 } ,
826903
904+ typeArgumentsBody : {
905+ patterns : [
906+ {
907+ match : / (?< ! [ _ $ [: alnum :] ] ) (?: (?< = \. \. \. ) | (?< ! \. ) ) ( _ ) (? ! [ _ $ [: alnum :] ] ) (?: (? = \. \. \. ) | (? ! \. ) ) / ,
908+ captures : { 0 : { name : 'keyword.operator.type.ts' } } ,
909+ } ,
910+ { include : '#type' } ,
911+ { include : '#punctuationComma' } ,
912+ ] ,
913+ } ,
914+
827915 type : {
828916 name : 'meta.type.ts' ,
829917 patterns : [
0 commit comments