diff --git a/escodegen.js b/escodegen.js index 26e75385..8c96b247 100644 --- a/escodegen.js +++ b/escodegen.js @@ -1176,15 +1176,19 @@ withIndent(function () { var guard; - result = [ - 'catch' + space + '(', - that.generateExpression(stmt.param, Precedence.Sequence, E_TTT), - ')' - ]; + if (stmt.param) { + result = [ + 'catch' + space + '(', + that.generateExpression(stmt.param, Precedence.Sequence, E_TTT), + ')' + ]; - if (stmt.guard) { - guard = that.generateExpression(stmt.guard, Precedence.Sequence, E_TTT); - result.splice(2, 0, ' if ', guard); + if (stmt.guard) { + guard = that.generateExpression(stmt.guard, Precedence.Sequence, E_TTT); + result.splice(2, 0, ' if ', guard); + } + } else { + result = ['catch']; } }); result.push(this.maybeBlock(stmt.body, S_TFFF)); diff --git a/package.json b/package.json index eea60d44..73f97053 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "source-map": "~0.6.1" }, "devDependencies": { - "acorn": "^4.0.4", + "acorn": "^7.1.0", "bluebird": "^3.4.7", "bower-registry-client": "^1.0.0", "chai": "^3.5.0", diff --git a/test/compare-acorn-es2019.js b/test/compare-acorn-es2019.js new file mode 100644 index 00000000..cddce0d3 --- /dev/null +++ b/test/compare-acorn-es2019.js @@ -0,0 +1,92 @@ +/* + 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'), + expect = chai.expect; + +function test(code, expected) { + var tree, actual, options, StringObject; + + // alias, so that JSLint does not complain. + StringObject = String; + + options = { + ranges: true, + locations: false, + ecmaVersion: 10 + }; + + tree = acorn.parse(code, options); + + // for UNIX text comment + actual = escodegen.generate(tree).replace(/[\n\r]$/, '') + '\n'; + expect(actual).to.be.equal(expected); +} + +function testMin(code, expected) { + var tree, actual, options, StringObject; + + // alias, so that JSLint does not complain. + StringObject = String; + + options = { + ranges: true, + locations: false, + ecmaVersion: 10 + }; + + tree = acorn.parse(code, options); + + // for UNIX text comment + actual = escodegen.generate(tree, { + format: escodegen.FORMAT_MINIFY, + raw: false + }).replace(/[\n\r]$/, '') + '\n'; + expect(actual).to.be.equal(expected); +} + +describe('compare acorn es2019 test', function () { + fs.readdirSync(__dirname + '/compare-acorn-es2019').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-es2019/' + file, 'utf-8'); + expected = fs.readFileSync(__dirname + '/compare-acorn-es2019/' + exp, 'utf-8'); + test(code, expected); + if (fs.existsSync(__dirname + '/compare-acorn-es2019/' + min)) { + expected = fs.readFileSync(__dirname + '/compare-acorn-es2019/' + min, 'utf-8'); + testMin(code, expected); + } + }); + } + }); +}); +/* vim: set sw=4 ts=4 et tw=80 : */ diff --git a/test/compare-acorn-es2019/optional-catch-binding.expected.js b/test/compare-acorn-es2019/optional-catch-binding.expected.js new file mode 100644 index 00000000..8548a1c4 --- /dev/null +++ b/test/compare-acorn-es2019/optional-catch-binding.expected.js @@ -0,0 +1,3 @@ +try { +} catch { +} diff --git a/test/compare-acorn-es2019/optional-catch-binding.expected.min.js b/test/compare-acorn-es2019/optional-catch-binding.expected.min.js new file mode 100644 index 00000000..30fa5a42 --- /dev/null +++ b/test/compare-acorn-es2019/optional-catch-binding.expected.min.js @@ -0,0 +1 @@ +try{}catch{} diff --git a/test/compare-acorn-es2019/optional-catch-binding.js b/test/compare-acorn-es2019/optional-catch-binding.js new file mode 100644 index 00000000..8548a1c4 --- /dev/null +++ b/test/compare-acorn-es2019/optional-catch-binding.js @@ -0,0 +1,3 @@ +try { +} catch { +}