diff --git a/CHANGELOG.md b/CHANGELOG.md index 18d9c5ef38..5b1ee2a5c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ # 1.11.13 * Update regenerator-6to5 + * Add support for most escodegen formatting options diff --git a/lib/6to5/generation/generator.js b/lib/6to5/generation/generator.js index 73cdfc9ab3..8ff296d141 100644 --- a/lib/6to5/generation/generator.js +++ b/lib/6to5/generation/generator.js @@ -16,29 +16,38 @@ var _ = require("lodash"); function CodeGenerator(ast, opts, code) { opts = opts || {}; - this.style = { - semicolons: true, - comments: true, - compact: false, - indent: { - char: " ", - width: 2 - } - }; - this.comments = ast.comments || []; this.tokens = ast.tokens || []; this.opts = opts; this.ast = ast; this.buf = ""; - this._indent = 0; + this.format = CodeGenerator.normaliseOptions(opts); + this._indent = this.format.indent.base; this.whitespace = new Whitespace(this.tokens, this.comments); this.position = new Position; this.map = new SourceMap(this.position, opts, code); } +CodeGenerator.normaliseOptions = function (opts) { + opts = opts.format || {}; + + opts = _.merge({ + parentheses: true, + semicolons: true, + comments: true, + compact: false, + indent: { + adjustMultilineComment: true, + style: " ", + base: 0 + } + }, opts); + + return opts; +}; + CodeGenerator.generators = { arrayComprehensions: require("./generators/array-comprehensions"), templateLiterals: require("./generators/template-literals"), @@ -58,7 +67,7 @@ _.each(CodeGenerator.generators, function (generator) { CodeGenerator.prototype.newline = function (i, removeLast) { if (!this.buf) return; - if (this.style.compact) return; + if (this.format.compact) return; if (this.endsWith("{\n")) return; if (_.isBoolean(i)) { @@ -89,7 +98,7 @@ CodeGenerator.prototype.removeLast = function (cha) { }; CodeGenerator.prototype.semicolon = function () { - if (this.style.semicolons) this.push(";"); + if (this.format.semicolons) this.push(";"); }; CodeGenerator.prototype.ensureSemicolon = function () { @@ -145,15 +154,15 @@ CodeGenerator.prototype.isLast = function (cha, trimRight) { }; CodeGenerator.prototype.getIndent = function () { - if (this.style.compact) { + if (this.format.compact) { return ""; } else { - return util.repeat(this.indentSize(), this.style.indent.char); + return util.repeat(this._indent, this.format.indent.style); } }; CodeGenerator.prototype.indentSize = function () { - return this._indent * this.style.indent.width; + return this.getIndent().length; }; CodeGenerator.prototype.indent = function () { @@ -353,8 +362,8 @@ CodeGenerator.prototype._getComments = function (key, node) { }; CodeGenerator.prototype._printComments = function (comments) { - if (this.style.compact) return; - if (!this.style.comments) return; + if (this.format.compact) return; + if (!this.format.comments) return; if (!comments || !comments.length) return; var self = this; @@ -373,14 +382,16 @@ CodeGenerator.prototype._printComments = function (comments) { // - var offset = comment.loc.start.column; - if (offset) { - var newlineRegex = new RegExp("\\n\\s{1," + offset + "}", "g"); - val = val.replace(newlineRegex, "\n"); - } + if (comment.type === "Block" && self.format.indent.adjustMultilineComment) { + var offset = comment.loc.start.column; + if (offset) { + var newlineRegex = new RegExp("\\n\\s{1," + offset + "}", "g"); + val = val.replace(newlineRegex, "\n"); + } - var indent = Math.max(self.indentSize(), column); - val = val.replace(/\n/g, "\n" + util.repeat(indent)); + var indent = Math.max(self.indentSize(), column); + val = val.replace(/\n/g, "\n" + util.repeat(indent)); + } if (column === 0) { val = self.getIndent() + val; diff --git a/lib/6to5/generation/generators/expressions.js b/lib/6to5/generation/generators/expressions.js index 1b07d2dd67..c0bb19e01f 100644 --- a/lib/6to5/generation/generators/expressions.js +++ b/lib/6to5/generation/generators/expressions.js @@ -44,9 +44,11 @@ exports.ConditionalExpression = function (node, print) { exports.NewExpression = function (node, print) { this.push("new "); print(node.callee); - this.push("("); - print.join(node.arguments, { separator: ", " }); - this.push(")"); + if (node.arguments.length || this.format.parentheses) { + this.push("("); + print.join(node.arguments, { separator: ", " }); + this.push(")"); + } }; exports.SequenceExpression = function (node, print) {