From 518be067e440b6df58b2814bdce3bfadef071545 Mon Sep 17 00:00:00 2001 From: Oleksandr T Date: Fri, 6 Nov 2020 15:43:22 +0200 Subject: [PATCH] fix(41240): allow emitting numeric with underscored separators as-is in esnext target --- src/compiler/emitter.ts | 3 ++- src/compiler/utilities.ts | 18 ++++++++++++++---- ...mericUnderscoredSeparator(target=es2015).js | 12 ++++++++++++ ...UnderscoredSeparator(target=es2015).symbols | 7 +++++++ ...icUnderscoredSeparator(target=es2015).types | 13 +++++++++++++ ...mericUnderscoredSeparator(target=es2016).js | 12 ++++++++++++ ...UnderscoredSeparator(target=es2016).symbols | 7 +++++++ ...icUnderscoredSeparator(target=es2016).types | 13 +++++++++++++ ...mericUnderscoredSeparator(target=es2017).js | 12 ++++++++++++ ...UnderscoredSeparator(target=es2017).symbols | 7 +++++++ ...icUnderscoredSeparator(target=es2017).types | 13 +++++++++++++ ...mericUnderscoredSeparator(target=es2018).js | 12 ++++++++++++ ...UnderscoredSeparator(target=es2018).symbols | 7 +++++++ ...icUnderscoredSeparator(target=es2018).types | 13 +++++++++++++ ...mericUnderscoredSeparator(target=es2019).js | 12 ++++++++++++ ...UnderscoredSeparator(target=es2019).symbols | 7 +++++++ ...icUnderscoredSeparator(target=es2019).types | 13 +++++++++++++ .../numericUnderscoredSeparator(target=es3).js | 12 ++++++++++++ ...ricUnderscoredSeparator(target=es3).symbols | 7 +++++++ ...mericUnderscoredSeparator(target=es3).types | 13 +++++++++++++ .../numericUnderscoredSeparator(target=es5).js | 12 ++++++++++++ ...ricUnderscoredSeparator(target=es5).symbols | 7 +++++++ ...mericUnderscoredSeparator(target=es5).types | 13 +++++++++++++ ...mericUnderscoredSeparator(target=esnext).js | 12 ++++++++++++ ...UnderscoredSeparator(target=esnext).symbols | 7 +++++++ ...icUnderscoredSeparator(target=esnext).types | 13 +++++++++++++ .../compiler/numericUnderscoredSeparator.ts | 6 ++++++ 27 files changed, 278 insertions(+), 5 deletions(-) create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2015).js create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2015).symbols create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2015).types create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2016).js create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2016).symbols create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2016).types create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2017).js create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2017).symbols create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2017).types create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2018).js create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2018).symbols create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2018).types create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2019).js create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2019).symbols create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es2019).types create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es3).js create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es3).symbols create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es3).types create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es5).js create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es5).symbols create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=es5).types create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=esnext).js create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=esnext).symbols create mode 100644 tests/baselines/reference/numericUnderscoredSeparator(target=esnext).types create mode 100644 tests/cases/compiler/numericUnderscoredSeparator.ts 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