From 92c067e0ea31d9b288dc7c6c1edc3e468fd5fe17 Mon Sep 17 00:00:00 2001 From: sanex Date: Thu, 20 Aug 2020 13:43:53 +0300 Subject: [PATCH] Added support for BigInt and Numeric Separators --- escodegen.js | 10 ++ package.json | 2 +- test/compare-acorn-es2020/bigint.expected.js | 6 ++ .../bigint.expected.min.js | 1 + test/compare-acorn-es2020/bigint.js | 6 ++ test/compare-acorn-es2021.js | 95 +++++++++++++++++++ .../numeric-separators.expected.js | 7 ++ .../numeric-separators.expected.min.js | 1 + .../numeric-separators.js | 7 ++ 9 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 test/compare-acorn-es2020/bigint.expected.js create mode 100644 test/compare-acorn-es2020/bigint.expected.min.js create mode 100644 test/compare-acorn-es2020/bigint.js create mode 100644 test/compare-acorn-es2021.js create mode 100644 test/compare-acorn-es2021/numeric-separators.expected.js create mode 100644 test/compare-acorn-es2021/numeric-separators.expected.min.js create mode 100644 test/compare-acorn-es2021/numeric-separators.js diff --git a/escodegen.js b/escodegen.js index 847fc370..33cfad76 100644 --- a/escodegen.js +++ b/escodegen.js @@ -2356,7 +2356,17 @@ return escapeString(expr.value); } + // BigInt, eg: 1n + if (typeof expr.bigint === 'string' && expr.raw) { + return expr.raw; + } + if (typeof expr.value === 'number') { + // Has Numeric Separator + if (expr.raw && expr.raw.indexOf('_') !== -1) { + return expr.raw; + } + return generateNumber(expr.value); } diff --git a/package.json b/package.json index 73307cc0..d20f37d8 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "source-map": "~0.6.1" }, "devDependencies": { - "acorn": "^7.3.1", + "acorn": "^8.0.1", "bluebird": "^3.4.7", "bower-registry-client": "^1.0.0", "chai": "^4.2.0", diff --git a/test/compare-acorn-es2020/bigint.expected.js b/test/compare-acorn-es2020/bigint.expected.js new file mode 100644 index 00000000..a1e82e15 --- /dev/null +++ b/test/compare-acorn-es2020/bigint.expected.js @@ -0,0 +1,6 @@ +0n; +2n; +0x2n; +0o2n; +0b10n; +-0xbf2ed51ff75d380fd3be813ec6185780n; \ No newline at end of file diff --git a/test/compare-acorn-es2020/bigint.expected.min.js b/test/compare-acorn-es2020/bigint.expected.min.js new file mode 100644 index 00000000..d6878e9b --- /dev/null +++ b/test/compare-acorn-es2020/bigint.expected.min.js @@ -0,0 +1 @@ +0n;2n;0x2n;0o2n;0b10n;-0xbf2ed51ff75d380fd3be813ec6185780n diff --git a/test/compare-acorn-es2020/bigint.js b/test/compare-acorn-es2020/bigint.js new file mode 100644 index 00000000..bb797d58 --- /dev/null +++ b/test/compare-acorn-es2020/bigint.js @@ -0,0 +1,6 @@ +0n; +2n; +0x2n; +0o2n; +0b10n; +-0xbf2ed51ff75d380fd3be813ec6185780n; diff --git a/test/compare-acorn-es2021.js b/test/compare-acorn-es2021.js new file mode 100644 index 00000000..3c801ad8 --- /dev/null +++ b/test/compare-acorn-es2021.js @@ -0,0 +1,95 @@ +/* + Copyright (C) 2012-2013 Yusuke Suzuki + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + +'use strict'; + +var fs = require('fs'), + acorn = require('acorn'), + escodegen = require('./loader'), + chai = require('chai'), + chaiExclude = require('chai-exclude'), + expect = chai.expect; + +chai.use(chaiExclude); + +function test(code, expected) { + var tree, actual, actualTree, options; + + options = { + ranges: false, + locations: false, + ecmaVersion: 12 + }; + + tree = acorn.parse(code, options); + + // for UNIX text comment + actual = escodegen.generate(tree); + actualTree = acorn.parse(actual, options); + + expect(actual).to.be.equal(expected); + expect(tree).excludingEvery(['start', 'end']).to.deep.equal(actualTree); +} + +function testMin(code, expected) { + var tree, actual, actualTree, options; + + options = { + ranges: false, + locations: false, + ecmaVersion: 12 + }; + + tree = acorn.parse(code, options); + + // for UNIX text comment + actual = escodegen.generate(tree, { + format: escodegen.FORMAT_MINIFY, + raw: false + }).replace(/[\n\r]$/, '') + '\n'; + actualTree = acorn.parse(actual, options); + + expect(actual).to.be.equal(expected); + expect(tree).excludingEvery(['start', 'end']).to.deep.equal(actualTree); +} + +describe('compare acorn es2021 test', function () { + fs.readdirSync(__dirname + '/compare-acorn-es2021').sort().forEach(function(file) { + var code, expected, exp, min; + if (/\.js$/.test(file) && !/expected\.js$/.test(file) && !/expected\.min\.js$/.test(file)) { + it(file, function () { + exp = file.replace(/\.js$/, '.expected.js'); + min = file.replace(/\.js$/, '.expected.min.js'); + code = fs.readFileSync(__dirname + '/compare-acorn-es2021/' + file, 'utf-8'); + expected = fs.readFileSync(__dirname + '/compare-acorn-es2021/' + exp, 'utf-8'); + test(code, expected); + if (fs.existsSync(__dirname + '/compare-acorn-es2021/' + min)) { + expected = fs.readFileSync(__dirname + '/compare-acorn-es2021/' + min, 'utf-8'); + testMin(code, expected); + } + }); + } + }); +}); +/* vim: set sw=4 ts=4 et tw=80 : */ \ No newline at end of file diff --git a/test/compare-acorn-es2021/numeric-separators.expected.js b/test/compare-acorn-es2021/numeric-separators.expected.js new file mode 100644 index 00000000..0bf243e7 --- /dev/null +++ b/test/compare-acorn-es2021/numeric-separators.expected.js @@ -0,0 +1,7 @@ +123_456; +123_456.123_456e+123_456; +0b1010_0001; +0xDEAD_BEAF; +0o755_666; +123_456n; +.012_345; \ No newline at end of file diff --git a/test/compare-acorn-es2021/numeric-separators.expected.min.js b/test/compare-acorn-es2021/numeric-separators.expected.min.js new file mode 100644 index 00000000..6ee38311 --- /dev/null +++ b/test/compare-acorn-es2021/numeric-separators.expected.min.js @@ -0,0 +1 @@ +123_456;123_456.123_456e+123_456;0b1010_0001;0xDEAD_BEAF;0o755_666;123_456n;.012_345 diff --git a/test/compare-acorn-es2021/numeric-separators.js b/test/compare-acorn-es2021/numeric-separators.js new file mode 100644 index 00000000..d43e25aa --- /dev/null +++ b/test/compare-acorn-es2021/numeric-separators.js @@ -0,0 +1,7 @@ +123_456; +123_456.123_456e+123_456; +0b1010_0001; +0xDEAD_BEAF; +0o755_666; +123_456n; +.012_345;