TypeScript Version: 3.9.x, 4.0.x-dev
Search Terms: template string emit
Code
From ~/tests/cases/conformance/es2018/invalidTaggedTemplateEscapeSequences.ts:
constx=tag`\u{hello}${100} \xtraordinary${200} wonderful ${300} \uworld`;Expected behavior:
ES5/ES3 emit:
constx=tag(__makeTemplateObject([void0,void0," wonderful ",void0],["\\u{hello} "," \\xtraordinary "," wonderful "," \\uworld"]),100,200,300);Actual behavior:
ES5/ES3 emit:
constx=tag(__makeTemplateObject([undefined,undefined," wonderful ",undefined],["\\u{hello} "," \\xtraordinary "," wonderful "," \\uworld"]),100,200,300);In ES5, undefined is an identifier and not a keyword and can be redeclared. In ES3, undefined isn't declared. In general we emit void 0 in these cases.
This can be easily addressed by changing createTemplateCooked in ~/src/compiler/transformers/taggedTemplate.ts to return createVoidZero() instead of createIdentifier("undefined") when a template contains an invalid escape sequence..
Playground Link:link
Related Issues:#23801, #12700
TypeScript Version: 3.9.x, 4.0.x-dev
Search Terms: template string emit
Code
From
~/tests/cases/conformance/es2018/invalidTaggedTemplateEscapeSequences.ts:Expected behavior:
ES5/ES3 emit:
Actual behavior:
ES5/ES3 emit:
In ES5,
undefinedis an identifier and not a keyword and can be redeclared. In ES3,undefinedisn't declared. In general we emitvoid 0in these cases.This can be easily addressed by changing
createTemplateCookedin~/src/compiler/transformers/taggedTemplate.tsto returncreateVoidZero()instead ofcreateIdentifier("undefined")when a template contains an invalid escape sequence..Playground Link:link
Related Issues:#23801, #12700