From c2d0bf82c4727bd7ac632f295e0f6b3a66aa3de1 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Sun, 4 Jan 2015 14:47:18 +0100 Subject: [PATCH] Emit tagged templates when targeting ES3 or 5 --- src/compiler/emitter.ts | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 237f3ab509a..54683c5e393 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2059,8 +2059,26 @@ module ts { return; } - Debug.assert(node.parent.kind !== SyntaxKind.TaggedTemplateExpression); - + if (node.parent.kind === SyntaxKind.TaggedTemplateExpression) { + // Emit should like: + // foo(["a", "b", "c"], expressions0, expression1) + // First we emit the string literal array + write("["); + emitLiteral(node.head); + forEach(node.templateSpans, templateSpan => { + write(", "); + emitLiteral(templateSpan.literal); + }); + write("]"); + + // Now we emit the expressions + forEach(node.templateSpans, templateSpan => { + write(", "); + emit(templateSpan.expression); + }); + return; + } + var emitOuterParens = isExpression(node.parent) && templateNeedsParens(node, node.parent); @@ -2487,10 +2505,15 @@ module ts { } function emitTaggedTemplateExpression(node: TaggedTemplateExpression): void { - Debug.assert(compilerOptions.target >= ScriptTarget.ES6, "Trying to emit a tagged template in pre-ES6 mode."); emit(node.tag); - write(" "); - emit(node.template); + if (compilerOptions.target >= ScriptTarget.ES6) { + write(" "); + emit(node.template); + } else { + write("("); + emit(node.template); + write(")"); + } } function emitParenExpression(node: ParenthesizedExpression) {