From 160a756335e6049a22b9fbc1c117081168ed2a18 Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Thu, 19 Apr 2018 16:03:22 -0700 Subject: [PATCH] Handle the generic tagged template Fixes #603 --- TypeScript.YAML-tmLanguage | 28 +++--- TypeScript.tmLanguage | 90 ++++++++++++------- TypeScriptReact.tmLanguage | 90 ++++++++++++------- .../genericTaggedTemplate.baseline.txt | 62 +++++++++++++ tests/cases/genericTaggedTemplate.ts | 1 + 5 files changed, 199 insertions(+), 72 deletions(-) create mode 100644 tests/baselines/genericTaggedTemplate.baseline.txt create mode 100644 tests/cases/genericTaggedTemplate.ts diff --git a/TypeScript.YAML-tmLanguage b/TypeScript.YAML-tmLanguage index 4f61438b..af55ec8c 100644 --- a/TypeScript.YAML-tmLanguage +++ b/TypeScript.YAML-tmLanguage @@ -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 diff --git a/TypeScript.tmLanguage b/TypeScript.tmLanguage index 4feec294..612e7c3a 100644 --- a/TypeScript.tmLanguage +++ b/TypeScript.tmLanguage @@ -5991,42 +5991,70 @@ template - name - string.template.ts - begin - ([_$[:alpha:]][_$[:alnum:]]*)?(`) - 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 + name + string.template.ts + begin + ([_$[:alpha:]][_$[:alnum:]]*)\s*(?=(<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?!=)\>)*(?!=)>\s*)`) + beginCaptures + + 1 + + name + entity.name.function.tagged-template.ts + + + end + (?=`) + patterns + + + include + #type-parameters + + - include - #string-character-escape + name + string.template.ts + begin + ([_$[:alpha:]][_$[:alnum:]]*)?(`) + 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 + + diff --git a/TypeScriptReact.tmLanguage b/TypeScriptReact.tmLanguage index 9a590a1f..8cf82794 100644 --- a/TypeScriptReact.tmLanguage +++ b/TypeScriptReact.tmLanguage @@ -5937,42 +5937,70 @@ template - name - string.template.tsx - begin - ([_$[:alpha:]][_$[:alnum:]]*)?(`) - beginCaptures - - 1 - - name - entity.name.function.tagged-template.tsx - - 2 - - name - punctuation.definition.string.template.begin.tsx - - - end - ` - endCaptures - - 0 - - name - punctuation.definition.string.template.end.tsx - - patterns - include - #template-substitution-element + name + string.template.tsx + begin + ([_$[:alpha:]][_$[:alnum:]]*)\s*(?=(<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>|\<\s*(((keyof|infer)\s+)|(([_$[:alpha:]][_$[:alnum:]]*|(\{([^\{\}]|(\{[^\{\}]*\}))*\})|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(\[([^\[\]]|(\[[^\[\]]*\]))*\])|(\'[^\']*\')|(\"[^\"]*\")|(\`[^\`]*\`))(?=\s*([\<\>\,\.\[]|=>|&(?!&)|\|(?!\|)))))([^<>\(]|(\(([^\(\)]|(\([^\(\)]*\)))*\))|(?<==)\>)*(?!=)\>)*(?!=)>\s*)`) + beginCaptures + + 1 + + name + entity.name.function.tagged-template.tsx + + + end + (?=`) + patterns + + + include + #type-parameters + + - include - #string-character-escape + name + string.template.tsx + begin + ([_$[:alpha:]][_$[:alnum:]]*)?(`) + beginCaptures + + 1 + + name + entity.name.function.tagged-template.tsx + + 2 + + name + punctuation.definition.string.template.begin.tsx + + + end + ` + endCaptures + + 0 + + name + punctuation.definition.string.template.end.tsx + + + patterns + + + include + #template-substitution-element + + + include + #string-character-escape + + diff --git a/tests/baselines/genericTaggedTemplate.baseline.txt b/tests/baselines/genericTaggedTemplate.baseline.txt new file mode 100644 index 00000000..8826179e --- /dev/null +++ b/tests/baselines/genericTaggedTemplate.baseline.txt @@ -0,0 +1,62 @@ +original file +----------------------------------- +let a = tag `${100} ${"hello"}`; +----------------------------------- + +Grammar: TypeScript.tmLanguage +----------------------------------- +>let a = tag `${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 \ No newline at end of file diff --git a/tests/cases/genericTaggedTemplate.ts b/tests/cases/genericTaggedTemplate.ts new file mode 100644 index 00000000..8fdf6b19 --- /dev/null +++ b/tests/cases/genericTaggedTemplate.ts @@ -0,0 +1 @@ +let a = tag `${100} ${"hello"}`; \ No newline at end of file