diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index ebfb7ff3e49a6..94d0fb3933a56 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -4600,7 +4600,8 @@ namespace ts { const flags = (neverAsciiEscape ? GetLiteralTextFlags.NeverAsciiEscape : 0) | (jsxAttributeEscape ? GetLiteralTextFlags.JsxAttributeEscape : 0) - | (printerOptions.terminateUnterminatedLiterals ? GetLiteralTextFlags.TerminateUnterminatedLiterals : 0); + | (printerOptions.terminateUnterminatedLiterals ? GetLiteralTextFlags.TerminateUnterminatedLiterals : 0) + | (printerOptions.target && printerOptions.target === ScriptTarget.ESNext ? GetLiteralTextFlags.AllowNumericSeparator : 0); return getLiteralText(node, currentSourceFile!, flags); } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 4d23dcdac294f..e9686b23c1a69 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -616,15 +616,13 @@ namespace ts { NeverAsciiEscape = 1 << 0, JsxAttributeEscape = 1 << 1, TerminateUnterminatedLiterals = 1 << 2, + AllowNumericSeparator = 1 << 3 } export function getLiteralText(node: LiteralLikeNode, sourceFile: SourceFile, flags: GetLiteralTextFlags) { // If we don't need to downlevel and we can reach the original source text using // the node's parent reference, then simply get the text as it was originally written. - if (!nodeIsSynthesized(node) && node.parent && !(flags & GetLiteralTextFlags.TerminateUnterminatedLiterals && node.isUnterminated) && !( - (isNumericLiteral(node) && node.numericLiteralFlags & TokenFlags.ContainsSeparator) || - isBigIntLiteral(node) - )) { + if (canUseOriginalText(node, flags)) { return getSourceTextOfNodeFromSourceFile(sourceFile, node); } @@ -677,6 +675,18 @@ namespace ts { return Debug.fail(`Literal kind '${node.kind}' not accounted for.`); } + function canUseOriginalText(node: LiteralLikeNode, flags: GetLiteralTextFlags): boolean { + if (nodeIsSynthesized(node) || !node.parent || (flags & GetLiteralTextFlags.TerminateUnterminatedLiterals && node.isUnterminated)) { + return false; + } + + if (isNumericLiteral(node) && node.numericLiteralFlags & TokenFlags.ContainsSeparator) { + return !!(flags & GetLiteralTextFlags.AllowNumericSeparator); + } + + return !isBigIntLiteral(node); + } + export function getTextOfConstantValue(value: string | number) { return isString(value) ? '"' + escapeNonAsciiString(value) + '"' : "" + value; } diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2015).js b/tests/baselines/reference/numericUnderscoredSeparator(target=es2015).js new file mode 100644 index 0000000000000..786e7e245dce4 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2015).js @@ -0,0 +1,12 @@ +//// [numericUnderscoredSeparator.ts] +1_000_000_000_000 +0b1010_0001_1000_0101 +0b1010_0001_1000_0101 +0xA0_B0_C0 + + +//// [numericUnderscoredSeparator.js] +1000000000000; +41349; +41349; +10531008; diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2015).symbols b/tests/baselines/reference/numericUnderscoredSeparator(target=es2015).symbols new file mode 100644 index 0000000000000..d0ffc9942d074 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2015).symbols @@ -0,0 +1,7 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0xA0_B0_C0 +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2015).types b/tests/baselines/reference/numericUnderscoredSeparator(target=es2015).types new file mode 100644 index 0000000000000..8526fc01a4cc3 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2015).types @@ -0,0 +1,13 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +>1_000_000_000_000 : 1000000000000 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0xA0_B0_C0 +>0xA0_B0_C0 : 10531008 + diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2016).js b/tests/baselines/reference/numericUnderscoredSeparator(target=es2016).js new file mode 100644 index 0000000000000..786e7e245dce4 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2016).js @@ -0,0 +1,12 @@ +//// [numericUnderscoredSeparator.ts] +1_000_000_000_000 +0b1010_0001_1000_0101 +0b1010_0001_1000_0101 +0xA0_B0_C0 + + +//// [numericUnderscoredSeparator.js] +1000000000000; +41349; +41349; +10531008; diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2016).symbols b/tests/baselines/reference/numericUnderscoredSeparator(target=es2016).symbols new file mode 100644 index 0000000000000..d0ffc9942d074 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2016).symbols @@ -0,0 +1,7 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0xA0_B0_C0 +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2016).types b/tests/baselines/reference/numericUnderscoredSeparator(target=es2016).types new file mode 100644 index 0000000000000..8526fc01a4cc3 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2016).types @@ -0,0 +1,13 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +>1_000_000_000_000 : 1000000000000 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0xA0_B0_C0 +>0xA0_B0_C0 : 10531008 + diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2017).js b/tests/baselines/reference/numericUnderscoredSeparator(target=es2017).js new file mode 100644 index 0000000000000..786e7e245dce4 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2017).js @@ -0,0 +1,12 @@ +//// [numericUnderscoredSeparator.ts] +1_000_000_000_000 +0b1010_0001_1000_0101 +0b1010_0001_1000_0101 +0xA0_B0_C0 + + +//// [numericUnderscoredSeparator.js] +1000000000000; +41349; +41349; +10531008; diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2017).symbols b/tests/baselines/reference/numericUnderscoredSeparator(target=es2017).symbols new file mode 100644 index 0000000000000..d0ffc9942d074 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2017).symbols @@ -0,0 +1,7 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0xA0_B0_C0 +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2017).types b/tests/baselines/reference/numericUnderscoredSeparator(target=es2017).types new file mode 100644 index 0000000000000..8526fc01a4cc3 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2017).types @@ -0,0 +1,13 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +>1_000_000_000_000 : 1000000000000 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0xA0_B0_C0 +>0xA0_B0_C0 : 10531008 + diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2018).js b/tests/baselines/reference/numericUnderscoredSeparator(target=es2018).js new file mode 100644 index 0000000000000..786e7e245dce4 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2018).js @@ -0,0 +1,12 @@ +//// [numericUnderscoredSeparator.ts] +1_000_000_000_000 +0b1010_0001_1000_0101 +0b1010_0001_1000_0101 +0xA0_B0_C0 + + +//// [numericUnderscoredSeparator.js] +1000000000000; +41349; +41349; +10531008; diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2018).symbols b/tests/baselines/reference/numericUnderscoredSeparator(target=es2018).symbols new file mode 100644 index 0000000000000..d0ffc9942d074 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2018).symbols @@ -0,0 +1,7 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0xA0_B0_C0 +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2018).types b/tests/baselines/reference/numericUnderscoredSeparator(target=es2018).types new file mode 100644 index 0000000000000..8526fc01a4cc3 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2018).types @@ -0,0 +1,13 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +>1_000_000_000_000 : 1000000000000 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0xA0_B0_C0 +>0xA0_B0_C0 : 10531008 + diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2019).js b/tests/baselines/reference/numericUnderscoredSeparator(target=es2019).js new file mode 100644 index 0000000000000..786e7e245dce4 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2019).js @@ -0,0 +1,12 @@ +//// [numericUnderscoredSeparator.ts] +1_000_000_000_000 +0b1010_0001_1000_0101 +0b1010_0001_1000_0101 +0xA0_B0_C0 + + +//// [numericUnderscoredSeparator.js] +1000000000000; +41349; +41349; +10531008; diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2019).symbols b/tests/baselines/reference/numericUnderscoredSeparator(target=es2019).symbols new file mode 100644 index 0000000000000..d0ffc9942d074 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2019).symbols @@ -0,0 +1,7 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0xA0_B0_C0 +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es2019).types b/tests/baselines/reference/numericUnderscoredSeparator(target=es2019).types new file mode 100644 index 0000000000000..8526fc01a4cc3 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es2019).types @@ -0,0 +1,13 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +>1_000_000_000_000 : 1000000000000 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0xA0_B0_C0 +>0xA0_B0_C0 : 10531008 + diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es3).js b/tests/baselines/reference/numericUnderscoredSeparator(target=es3).js new file mode 100644 index 0000000000000..786e7e245dce4 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es3).js @@ -0,0 +1,12 @@ +//// [numericUnderscoredSeparator.ts] +1_000_000_000_000 +0b1010_0001_1000_0101 +0b1010_0001_1000_0101 +0xA0_B0_C0 + + +//// [numericUnderscoredSeparator.js] +1000000000000; +41349; +41349; +10531008; diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es3).symbols b/tests/baselines/reference/numericUnderscoredSeparator(target=es3).symbols new file mode 100644 index 0000000000000..d0ffc9942d074 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es3).symbols @@ -0,0 +1,7 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0xA0_B0_C0 +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es3).types b/tests/baselines/reference/numericUnderscoredSeparator(target=es3).types new file mode 100644 index 0000000000000..8526fc01a4cc3 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es3).types @@ -0,0 +1,13 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +>1_000_000_000_000 : 1000000000000 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0xA0_B0_C0 +>0xA0_B0_C0 : 10531008 + diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es5).js b/tests/baselines/reference/numericUnderscoredSeparator(target=es5).js new file mode 100644 index 0000000000000..786e7e245dce4 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es5).js @@ -0,0 +1,12 @@ +//// [numericUnderscoredSeparator.ts] +1_000_000_000_000 +0b1010_0001_1000_0101 +0b1010_0001_1000_0101 +0xA0_B0_C0 + + +//// [numericUnderscoredSeparator.js] +1000000000000; +41349; +41349; +10531008; diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es5).symbols b/tests/baselines/reference/numericUnderscoredSeparator(target=es5).symbols new file mode 100644 index 0000000000000..d0ffc9942d074 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es5).symbols @@ -0,0 +1,7 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0xA0_B0_C0 +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=es5).types b/tests/baselines/reference/numericUnderscoredSeparator(target=es5).types new file mode 100644 index 0000000000000..8526fc01a4cc3 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=es5).types @@ -0,0 +1,13 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +>1_000_000_000_000 : 1000000000000 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0xA0_B0_C0 +>0xA0_B0_C0 : 10531008 + diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=esnext).js b/tests/baselines/reference/numericUnderscoredSeparator(target=esnext).js new file mode 100644 index 0000000000000..6d0e5b102c5ea --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=esnext).js @@ -0,0 +1,12 @@ +//// [numericUnderscoredSeparator.ts] +1_000_000_000_000 +0b1010_0001_1000_0101 +0b1010_0001_1000_0101 +0xA0_B0_C0 + + +//// [numericUnderscoredSeparator.js] +1_000_000_000_000; +0b1010_0001_1000_0101; +0b1010_0001_1000_0101; +0xA0_B0_C0; diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=esnext).symbols b/tests/baselines/reference/numericUnderscoredSeparator(target=esnext).symbols new file mode 100644 index 0000000000000..d0ffc9942d074 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=esnext).symbols @@ -0,0 +1,7 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0b1010_0001_1000_0101 +No type information for this code.0xA0_B0_C0 +No type information for this code. +No type information for this code. \ No newline at end of file diff --git a/tests/baselines/reference/numericUnderscoredSeparator(target=esnext).types b/tests/baselines/reference/numericUnderscoredSeparator(target=esnext).types new file mode 100644 index 0000000000000..8526fc01a4cc3 --- /dev/null +++ b/tests/baselines/reference/numericUnderscoredSeparator(target=esnext).types @@ -0,0 +1,13 @@ +=== tests/cases/compiler/numericUnderscoredSeparator.ts === +1_000_000_000_000 +>1_000_000_000_000 : 1000000000000 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0b1010_0001_1000_0101 +>0b1010_0001_1000_0101 : 41349 + +0xA0_B0_C0 +>0xA0_B0_C0 : 10531008 + diff --git a/tests/cases/compiler/numericUnderscoredSeparator.ts b/tests/cases/compiler/numericUnderscoredSeparator.ts new file mode 100644 index 0000000000000..3b532de43880a --- /dev/null +++ b/tests/cases/compiler/numericUnderscoredSeparator.ts @@ -0,0 +1,6 @@ +// @target: es3,es5,es2015,es2016,es2017,es2018,es2019,esnext + +1_000_000_000_000 +0b1010_0001_1000_0101 +0b1010_0001_1000_0101 +0xA0_B0_C0