From 8379c21939ae6b33f5582c0bf6b72a0c58e58989 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Tue, 5 Jul 2016 21:14:30 -0700 Subject: [PATCH 01/12] Drop unneeded condition in SourceMap class. --- packages/babel-generator/src/source-map.js | 40 +++++++--------------- 1 file changed, 13 insertions(+), 27 deletions(-) diff --git a/packages/babel-generator/src/source-map.js b/packages/babel-generator/src/source-map.js index 36bfe89097..050c0f960c 100644 --- a/packages/babel-generator/src/source-map.js +++ b/packages/babel-generator/src/source-map.js @@ -7,24 +7,18 @@ import type Position from "./position"; export default class SourceMap { constructor(opts, code) { - this.opts = opts; - this.last = {generated: {}, original: {}}; + this._opts = opts; + this._map = new sourceMap.SourceMapGenerator({ + file: opts.sourceMapTarget, + sourceRoot: opts.sourceRoot + }); - if (opts.sourceMaps) { - this.map = new sourceMap.SourceMapGenerator({ - file: opts.sourceMapTarget, - sourceRoot: opts.sourceRoot + if (typeof code === "string") { + this._map.setSourceContent(opts.sourceFileName, code); + } else if (typeof code === "object") { + Object.keys(code).forEach((sourceFileName) => { + this._map.setSourceContent(sourceFileName, code[sourceFileName]); }); - - if (typeof code === "string") { - this.map.setSourceContent(opts.sourceFileName, code); - } else if (typeof code === "object") { - Object.keys(code).forEach((sourceFileName) => { - this.map.setSourceContent(sourceFileName, code[sourceFileName]); - }); - } - } else { - this.map = null; } } @@ -33,12 +27,7 @@ export default class SourceMap { */ get() { - let map = this.map; - if (map) { - return map.toJSON(); - } else { - return map; - } + return this._map.toJSON(); } /** @@ -47,9 +36,6 @@ export default class SourceMap { */ mark(position: Position, line: number, column: number, filename: ?string) { - let map = this.map; - if (!map) return; // no source map - // Adding an empty mapping at the start of a generated line just clutters the map. if (this._lastGenLine !== position.line && line === null) return; @@ -64,12 +50,12 @@ export default class SourceMap { this._lastSourceLine = line; this._lastSourceColumn = column; - map.addMapping({ + this._map.addMapping({ generated: { line: position.line, column: position.column }, - source: line == null ? null : filename || this.opts.sourceFileName, + source: line == null ? null : filename || this._opts.sourceFileName, original: line == null ? null : { line: line, column: column, From 475581dc66bace2769ea07a16f2bab8c3ae931ab Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Thu, 7 Jul 2016 19:19:09 -0700 Subject: [PATCH 02/12] Ditch the tiny Position class. --- packages/babel-generator/src/buffer.js | 20 ++++++++++++---- packages/babel-generator/src/position.js | 28 ---------------------- packages/babel-generator/src/source-map.js | 13 +++++----- 3 files changed, 22 insertions(+), 39 deletions(-) delete mode 100644 packages/babel-generator/src/position.js diff --git a/packages/babel-generator/src/buffer.js b/packages/babel-generator/src/buffer.js index d4803d4a87..7e5e7c8970 100644 --- a/packages/babel-generator/src/buffer.js +++ b/packages/babel-generator/src/buffer.js @@ -1,4 +1,3 @@ -import Position from "./position"; import type SourceMap from "./source-map"; import trimEnd from "lodash/trimEnd"; @@ -21,7 +20,10 @@ export default class Buffer { _last: string = ""; _queue: Array = []; - _position: Position = new Position; + _position: Object = { + line: 1, + column: 0, + }; _sourcePosition: Object = { line: null, column: null, @@ -67,11 +69,21 @@ export default class Buffer { _append(str: string, line: number, column: number, filename: ?string): void { // If there the line is ending, adding a new mapping marker is redundant - if (this._map && str[0] !== "\n") this._map.mark(this._position, line, column, filename); + if (this._map && str[0] !== "\n") { + this._map.mark(this._position.line, this._position.column, line, column, filename); + } this._buf += str; this._last = str[str.length - 1]; - this._position.push(str); + + for (let i = 0; i < str.length; i++) { + if (str[i] === "\n") { + this._position.line++; + this._position.column = 0; + } else { + this._position.column++; + } + } } removeTrailingSpaces(): void { diff --git a/packages/babel-generator/src/position.js b/packages/babel-generator/src/position.js deleted file mode 100644 index 09283868d5..0000000000 --- a/packages/babel-generator/src/position.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * Track current position in code generation. - */ - -export default class Position { - column: number; - line: number; - - constructor() { - this.line = 1; - this.column = 0; - } - - /** - * Push a string to the current position, mantaining the current line and column. - */ - - push(str: string): void { - for (let i = 0; i < str.length; i++) { - if (str[i] === "\n") { - this.line++; - this.column = 0; - } else { - this.column++; - } - } - } -} diff --git a/packages/babel-generator/src/source-map.js b/packages/babel-generator/src/source-map.js index 050c0f960c..4486bbf737 100644 --- a/packages/babel-generator/src/source-map.js +++ b/packages/babel-generator/src/source-map.js @@ -1,5 +1,4 @@ import sourceMap from "source-map"; -import type Position from "./position"; /** * Build a sourcemap. @@ -35,25 +34,25 @@ export default class SourceMap { * values to insert a mapping to nothing. */ - mark(position: Position, line: number, column: number, filename: ?string) { + mark(generatedLine: number, generatedColumn: number, line: number, column: number, filename: ?string) { // Adding an empty mapping at the start of a generated line just clutters the map. - if (this._lastGenLine !== position.line && line === null) return; + if (this._lastGenLine !== generatedLine && line === null) return; // If this mapping points to the same source location as the last one, we can ignore it since // the previous one covers it. - if (this._lastGenLine === position.line && this._lastSourceLine === line && + if (this._lastGenLine === generatedLine && this._lastSourceLine === line && this._lastSourceColumn === column) { return; } - this._lastGenLine = position.line; + this._lastGenLine = generatedLine; this._lastSourceLine = line; this._lastSourceColumn = column; this._map.addMapping({ generated: { - line: position.line, - column: position.column + line: generatedLine, + column: generatedColumn, }, source: line == null ? null : filename || this._opts.sourceFileName, original: line == null ? null : { From 6b7f3cc4cdc151904bfef5498cb9c2f05d614949 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Thu, 7 Jul 2016 19:40:35 -0700 Subject: [PATCH 03/12] Inline comment generation function. --- packages/babel-generator/src/printer.js | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index f8ec23ebe7..b11cabd5f3 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -398,16 +398,6 @@ export default class Printer { this.print(node, parent); } - generateComment(comment) { - let val = comment.value; - if (comment.type === "CommentLine") { - val = `//${val}`; - } else { - val = `/*${val}*/`; - } - return val; - } - printTrailingComments(node, parent) { this.printComments(this.getComments(false, node, parent)); } @@ -513,7 +503,7 @@ export default class Printer { if (!this.endsWith("[") && !this.endsWith("{")) this.space(); - let val = this.generateComment(comment); + let val = comment.type === "CommentLine" ? `//${comment.value}` : `/*${comment.value}*/`; // if (comment.type === "CommentBlock" && this._format.indent.adjustMultilineComment) { From 55a1ffd266aaa0ba81a52d4d1b29934db381caf5 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Thu, 7 Jul 2016 19:51:55 -0700 Subject: [PATCH 04/12] Mark a bunch of methods private. --- packages/babel-generator/src/printer.js | 52 +++++++++++----------- packages/babel-generator/src/whitespace.js | 6 +-- 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index b11cabd5f3..bba06a365f 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -12,13 +12,13 @@ export default class Printer { this.insideAux = false; this.printAuxAfterOnNextUserNode = false; this._printStack = []; - this.printedCommentStarts = {}; - this.parenPushNewlineState = null; + this._printedCommentStarts = {}; + this._parenPushNewlineState = null; this._indent = 0; } - printedCommentStarts: Object; - parenPushNewlineState: ?Object; + _printedCommentStarts: Object; + _parenPushNewlineState: ?Object; /** * Get the current indent. @@ -195,9 +195,9 @@ export default class Printer { _maybeAddParen(str: string): void { // see startTerminatorless() instance method - let parenPushNewlineState = this.parenPushNewlineState; + let parenPushNewlineState = this._parenPushNewlineState; if (!parenPushNewlineState) return; - this.parenPushNewlineState = null; + this._parenPushNewlineState = null; let i; for (i = 0; i < str.length && str[i] === " "; i++) continue; @@ -241,7 +241,7 @@ export default class Printer { */ startTerminatorless(): Object { - return this.parenPushNewlineState = { + return this._parenPushNewlineState = { printed: false }; } @@ -283,12 +283,12 @@ export default class Printer { this._printStack.push(node); if (node.loc) this.printAuxAfterComment(); - this.printAuxBeforeComment(oldInAux); + this._printAuxBeforeComment(oldInAux); let needsParens = n.needsParens(node, parent, this._printStack); if (needsParens) this.token("("); - this.printLeadingComments(node, parent); + this._printLeadingComments(node, parent); this._printNewline(true, node, parent, opts); @@ -302,7 +302,7 @@ export default class Printer { // Check again if any of our children may have left an aux comment on the stack if (node.loc) this.printAuxAfterComment(); - this.printTrailingComments(node, parent); + this._printTrailingComments(node, parent); if (needsParens) this.token(")"); @@ -316,11 +316,11 @@ export default class Printer { this._printNewline(false, node, parent, opts); } - printAuxBeforeComment(wasInAux) { + _printAuxBeforeComment(wasInAux) { let comment = this._format.auxiliaryCommentBefore; if (!wasInAux && this.insideAux && !this.printAuxAfterOnNextUserNode) { this.printAuxAfterOnNextUserNode = true; - if (comment) this.printComment({ + if (comment) this._printComment({ type: "CommentBlock", value: comment }); @@ -331,7 +331,7 @@ export default class Printer { if (this.printAuxAfterOnNextUserNode) { this.printAuxAfterOnNextUserNode = false; let comment = this._format.auxiliaryCommentAfter; - if (comment) this.printComment({ + if (comment) this._printComment({ type: "CommentBlock", value: comment }); @@ -398,18 +398,18 @@ export default class Printer { this.print(node, parent); } - printTrailingComments(node, parent) { - this.printComments(this.getComments(false, node, parent)); + _printTrailingComments(node, parent) { + this._printComments(this._getComments(false, node, parent)); } - printLeadingComments(node, parent) { - this.printComments(this.getComments(true, node, parent)); + _printLeadingComments(node, parent) { + this._printComments(this._getComments(true, node, parent)); } printInnerComments(node, indent = true) { if (!node.innerComments) return; if (indent) this.indent(); - this.printComments(node.innerComments); + this._printComments(node.innerComments); if (indent) this.dedent(); } @@ -466,13 +466,13 @@ export default class Printer { this.newline(lines); } - getComments(leading, node) { + _getComments(leading, node) { // Note, we use a boolean flag here instead of passing in the attribute name as it is faster // because this is called extremely frequently. return (node && (leading ? node.leadingComments : node.trailingComments)) || []; } - shouldPrintComment(comment) { + _shouldPrintComment(comment) { if (this._format.shouldPrintComment) { return this._format.shouldPrintComment(comment.value); } else { @@ -485,15 +485,15 @@ export default class Printer { } } - printComment(comment) { - if (!this.shouldPrintComment(comment)) return; + _printComment(comment) { + if (!this._shouldPrintComment(comment)) return; if (comment.ignore) return; comment.ignore = true; if (comment.start != null) { - if (this.printedCommentStarts[comment.start]) return; - this.printedCommentStarts[comment.start] = true; + if (this._printedCommentStarts[comment.start]) return; + this._printedCommentStarts[comment.start] = true; } // Exclude comments from source mappings since they will only clutter things. @@ -532,11 +532,11 @@ export default class Printer { }); } - printComments(comments?: Array) { + _printComments(comments?: Array) { if (!comments || !comments.length) return; for (let comment of comments) { - this.printComment(comment); + this._printComment(comment); } } } diff --git a/packages/babel-generator/src/whitespace.js b/packages/babel-generator/src/whitespace.js index 035f5bb272..250b882f5b 100644 --- a/packages/babel-generator/src/whitespace.js +++ b/packages/babel-generator/src/whitespace.js @@ -24,7 +24,7 @@ export default class Whitespace { endToken = tokens[index]; } - return this.getNewlinesBetween(startToken, endToken); + return this._getNewlinesBetween(startToken, endToken); } /** @@ -47,7 +47,7 @@ export default class Whitespace { if (endToken && endToken.type.label === "eof") { return 1; } else { - let lines = this.getNewlinesBetween(startToken, endToken); + let lines = this._getNewlinesBetween(startToken, endToken); if (node.type === "CommentLine" && !lines) { // line comment return 1; @@ -61,7 +61,7 @@ export default class Whitespace { * Count all the newlines between two tokens. */ - getNewlinesBetween(startToken, endToken) { + _getNewlinesBetween(startToken, endToken) { if (!endToken || !endToken.loc) return 0; let start = startToken ? startToken.loc.end.line : 1; From 6a74731c6b06db1e98f6f921b3263e8ed71b745b Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Thu, 7 Jul 2016 20:08:49 -0700 Subject: [PATCH 05/12] Drop the private version of ._format --- packages/babel-generator/src/index.js | 1 - packages/babel-generator/src/printer.js | 46 ++++++++++++------------- 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/packages/babel-generator/src/index.js b/packages/babel-generator/src/index.js index aa3a6150cb..c755f38eff 100644 --- a/packages/babel-generator/src/index.js +++ b/packages/babel-generator/src/index.js @@ -23,7 +23,6 @@ class Generator extends Printer { this.comments = comments; this.tokens = tokens; - this.format = format; this.opts = opts; this.ast = ast; this._inForStatementInitCounter = 0; diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index bba06a365f..d26867e7cf 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -7,7 +7,7 @@ import * as t from "babel-types"; export default class Printer { constructor(format, map) { - this._format = format || {}; + this.format = format || {}; this._buf = new Buffer(map); this.insideAux = false; this.printAuxAfterOnNextUserNode = false; @@ -25,10 +25,10 @@ export default class Printer { */ _getIndent(): string { - if (this._format.compact || this._format.concise) { + if (this.format.compact || this.format.concise) { return ""; } else { - return repeat(this._format.indent.style, this._indent); + return repeat(this.format.indent.style, this._indent); } } @@ -63,7 +63,7 @@ export default class Printer { rightBrace(): void { if (!this.endsWith("\n")) this.newline(); - if (this._format.minified && !this._lastPrintedIsEmptyStatement) { + if (this.format.minified && !this._lastPrintedIsEmptyStatement) { this._buf.removeLastSemicolon(); } this.token("}"); @@ -83,7 +83,7 @@ export default class Printer { */ space(force: boolean = false): void { - if (this._format.compact) return; + if (this.format.compact) return; if ((this._buf.hasContent() && !this.endsWith(" ") && !this.endsWith("\n")) || force) { this._space(); @@ -126,9 +126,9 @@ export default class Printer { */ newline(i?: number): void { - if (this._format.retainLines || this._format.compact) return; + if (this.format.retainLines || this.format.compact) return; - if (this._format.concise) { + if (this.format.concise) { this.space(); return; } @@ -188,7 +188,7 @@ export default class Printer { _maybeIndent(str: string): void { // we've got a newline before us so prepend on the indentation - if (!this._format.compact && this._indent && this.endsWith("\n") && str[0] !== "\n") { + if (!this.format.compact && this._indent && this.endsWith("\n") && str[0] !== "\n") { this._buf.queue(this._getIndent()); } } @@ -213,7 +213,7 @@ export default class Printer { } _catchUp(prop: string, loc: Object) { - if (!this._format.retainLines) return; + if (!this.format.retainLines) return; // catch up to this nodes newline if we're behind const pos = loc ? loc[prop] : null; @@ -270,9 +270,9 @@ export default class Printer { let oldInAux = this.insideAux; this.insideAux = !node.loc; - let oldConcise = this._format.concise; + let oldConcise = this.format.concise; if (node._compact) { - this._format.concise = true; + this.format.concise = true; } let printMethod = this[node.type]; @@ -310,14 +310,14 @@ export default class Printer { this._printStack.pop(); if (opts.after) opts.after(); - this._format.concise = oldConcise; + this.format.concise = oldConcise; this.insideAux = oldInAux; this._printNewline(false, node, parent, opts); } _printAuxBeforeComment(wasInAux) { - let comment = this._format.auxiliaryCommentBefore; + let comment = this.format.auxiliaryCommentBefore; if (!wasInAux && this.insideAux && !this.printAuxAfterOnNextUserNode) { this.printAuxAfterOnNextUserNode = true; if (comment) this._printComment({ @@ -330,7 +330,7 @@ export default class Printer { printAuxAfterComment() { if (this.printAuxAfterOnNextUserNode) { this.printAuxAfterOnNextUserNode = false; - let comment = this._format.auxiliaryCommentAfter; + let comment = this.format.auxiliaryCommentAfter; if (comment) this._printComment({ type: "CommentBlock", value: comment @@ -339,7 +339,7 @@ export default class Printer { } getPossibleRaw(node) { - if (this._format.minified) return; + if (this.format.minified) return; let extra = node.extra; if (extra && extra.raw != null && extra.rawValue != null && node.value === extra.rawValue) { @@ -428,7 +428,7 @@ export default class Printer { _printNewline(leading, node, parent, opts) { // Fast path since 'this.newline' does nothing when not tracking lines. - if (this._format.retainLines || this._format.compact) return; + if (this.format.retainLines || this.format.compact) return; if (!opts.statement && !n.isUserWhitespacable(node, parent)) { return; @@ -436,7 +436,7 @@ export default class Printer { // Fast path for concise since 'this.newline' just inserts a space when // concise formatting is in use. - if (this._format.concise) { + if (this.format.concise) { this.space(); return; } @@ -473,14 +473,14 @@ export default class Printer { } _shouldPrintComment(comment) { - if (this._format.shouldPrintComment) { - return this._format.shouldPrintComment(comment.value); + if (this.format.shouldPrintComment) { + return this.format.shouldPrintComment(comment.value); } else { - if (!this._format.minified && + if (!this.format.minified && (comment.value.indexOf("@license") >= 0 || comment.value.indexOf("@preserve") >= 0)) { return true; } else { - return this._format.comments; + return this.format.comments; } } } @@ -506,7 +506,7 @@ export default class Printer { let val = comment.type === "CommentLine" ? `//${comment.value}` : `/*${comment.value}*/`; // - if (comment.type === "CommentBlock" && this._format.indent.adjustMultilineComment) { + if (comment.type === "CommentBlock" && this.format.indent.adjustMultilineComment) { let offset = comment.loc && comment.loc.start.column; if (offset) { let newlineRegex = new RegExp("\\n\\s{1," + offset + "}", "g"); @@ -519,7 +519,7 @@ export default class Printer { // force a newline for line comments when retainLines is set in case the next printed node // doesn't catch up - if ((this._format.compact || this._format.concise || this._format.retainLines) && + if ((this.format.compact || this.format.concise || this.format.retainLines) && comment.type === "CommentLine") { val += "\n"; } From e056c0b9d646bb46563d85df38aeacfed49d665c Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Thu, 7 Jul 2016 19:59:28 -0700 Subject: [PATCH 06/12] Use the presence of _whitespace to toggle its use. --- packages/babel-generator/src/index.js | 11 +++-------- packages/babel-generator/src/printer.js | 11 ++++++----- packages/babel-generator/src/whitespace.js | 8 +------- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/packages/babel-generator/src/index.js b/packages/babel-generator/src/index.js index c755f38eff..11eb3409c6 100644 --- a/packages/babel-generator/src/index.js +++ b/packages/babel-generator/src/index.js @@ -13,21 +13,18 @@ class Generator extends Printer { constructor(ast, opts, code) { opts = opts || {}; - let comments = ast.comments || []; - let tokens = ast.tokens || []; + const tokens = ast.tokens || []; let format = Generator.normalizeOptions(code, opts, tokens); let map = opts.sourceMaps ? new SourceMap(opts, code) : null; super(format, map); - this.comments = comments; - this.tokens = tokens; this.opts = opts; this.ast = ast; this._inForStatementInitCounter = 0; - this.whitespace = new Whitespace(tokens); + this._whitespace = tokens.length > 0 ? new Whitespace(tokens) : null; } format: { @@ -49,9 +46,7 @@ class Generator extends Printer { auxiliaryCommentBefore: string; auxiliaryCommentAfter: string; - whitespace: Whitespace; - comments: Array; - tokens: Array; + _whitespace: Whitespace; opts: Object; ast: Object; diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index d26867e7cf..e99d9cf8dd 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -443,12 +443,12 @@ export default class Printer { let lines = 0; - if (node.start != null && !node._ignoreUserWhitespace && this.tokens.length) { + if (node.start != null && !node._ignoreUserWhitespace && this._whitespace) { // user node if (leading) { - lines = this.whitespace.getNewlinesBefore(node); + lines = this._whitespace.getNewlinesBefore(node); } else { - lines = this.whitespace.getNewlinesAfter(node); + lines = this._whitespace.getNewlinesAfter(node); } } else { // generated node @@ -499,7 +499,7 @@ export default class Printer { // Exclude comments from source mappings since they will only clutter things. this.withSource("start", comment.loc, () => { // whitespace before - this.newline(this.whitespace.getNewlinesBefore(comment)); + this.newline(this._whitespace ? this._whitespace.getNewlinesBefore(comment) : 0); if (!this.endsWith("[") && !this.endsWith("{")) this.space(); @@ -528,7 +528,8 @@ export default class Printer { this.token(val); // whitespace after - this.newline(this.whitespace.getNewlinesAfter(comment)); + this.newline((this._whitespace ? this._whitespace.getNewlinesAfter(comment) : 0) || + (comment.type === "CommentLine" ? 1 : 0)); }); } diff --git a/packages/babel-generator/src/whitespace.js b/packages/babel-generator/src/whitespace.js index 250b882f5b..2eb4f9b308 100644 --- a/packages/babel-generator/src/whitespace.js +++ b/packages/babel-generator/src/whitespace.js @@ -47,13 +47,7 @@ export default class Whitespace { if (endToken && endToken.type.label === "eof") { return 1; } else { - let lines = this._getNewlinesBetween(startToken, endToken); - if (node.type === "CommentLine" && !lines) { - // line comment - return 1; - } else { - return lines; - } + return this._getNewlinesBetween(startToken, endToken); } } From b841d12c9e37f155ee4048e2b323ac896cf6e921 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Thu, 7 Jul 2016 20:11:09 -0700 Subject: [PATCH 07/12] Initialize inForStatementInitCounter as a public var. --- packages/babel-generator/src/generators/expressions.js | 2 +- packages/babel-generator/src/generators/statements.js | 4 ++-- packages/babel-generator/src/index.js | 1 - packages/babel-generator/src/printer.js | 1 + 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index 36f0485a91..048c5e2adb 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -157,7 +157,7 @@ export function AssignmentPattern(node: Object) { export function AssignmentExpression(node: Object, parent: Object) { // Somewhere inside a for statement `init` node but doesn't usually // needs a paren except for `in` expressions: `for (a in b ? a : b;;)` - let parens = this._inForStatementInitCounter && node.operator === "in" && + let parens = this.inForStatementInitCounter && node.operator === "in" && !n.needsParens(node, parent); if (parens) { diff --git a/packages/babel-generator/src/generators/statements.js b/packages/babel-generator/src/generators/statements.js index e4aa15fd50..c3229db035 100644 --- a/packages/babel-generator/src/generators/statements.js +++ b/packages/babel-generator/src/generators/statements.js @@ -48,9 +48,9 @@ export function ForStatement(node: Object) { this.keyword("for"); this.token("("); - this._inForStatementInitCounter++; + this.inForStatementInitCounter++; this.print(node.init, node); - this._inForStatementInitCounter--; + this.inForStatementInitCounter--; this.token(";"); if (node.test) { diff --git a/packages/babel-generator/src/index.js b/packages/babel-generator/src/index.js index 11eb3409c6..d45137d187 100644 --- a/packages/babel-generator/src/index.js +++ b/packages/babel-generator/src/index.js @@ -22,7 +22,6 @@ class Generator extends Printer { this.opts = opts; this.ast = ast; - this._inForStatementInitCounter = 0; this._whitespace = tokens.length > 0 ? new Whitespace(tokens) : null; } diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index e99d9cf8dd..0662eb30ce 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -15,6 +15,7 @@ export default class Printer { this._printedCommentStarts = {}; this._parenPushNewlineState = null; this._indent = 0; + this.inForStatementInitCounter = 0; } _printedCommentStarts: Object; From 9483f4bd949c3df4ad764e5c33885ac5adcecc25 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Thu, 7 Jul 2016 20:11:48 -0700 Subject: [PATCH 08/12] Drop old stale code. --- packages/babel-generator/src/index.js | 4 ---- packages/babel-generator/src/printer.js | 2 -- 2 files changed, 6 deletions(-) diff --git a/packages/babel-generator/src/index.js b/packages/babel-generator/src/index.js index d45137d187..f660233c6e 100644 --- a/packages/babel-generator/src/index.js +++ b/packages/babel-generator/src/index.js @@ -20,7 +20,6 @@ class Generator extends Printer { super(format, map); - this.opts = opts; this.ast = ast; this._whitespace = tokens.length > 0 ? new Whitespace(tokens) : null; @@ -43,10 +42,7 @@ class Generator extends Printer { } }; - auxiliaryCommentBefore: string; - auxiliaryCommentAfter: string; _whitespace: Whitespace; - opts: Object; ast: Object; /** diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index 0662eb30ce..24d43d27f0 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -293,8 +293,6 @@ export default class Printer { this._printNewline(true, node, parent, opts); - if (opts.before) opts.before(); - let loc = (t.isProgram(node) || t.isFile(node)) ? null : node.loc; this.withSource("start", loc, () => { this[node.type](node, parent); From bd9bb053c3647e91fa51db864e54b542b5e342db Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Sun, 10 Jul 2016 09:04:06 -0700 Subject: [PATCH 09/12] Flatten aux comment logic. --- packages/babel-generator/src/printer.js | 35 ++++++++++++++----------- 1 file changed, 19 insertions(+), 16 deletions(-) diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index 24d43d27f0..71bee2e517 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -10,7 +10,7 @@ export default class Printer { this.format = format || {}; this._buf = new Buffer(map); this.insideAux = false; - this.printAuxAfterOnNextUserNode = false; + this._printAuxAfterOnNextUserNode = false; this._printStack = []; this._printedCommentStarts = {}; this._parenPushNewlineState = null; @@ -268,9 +268,6 @@ export default class Printer { node._compact = true; } - let oldInAux = this.insideAux; - this.insideAux = !node.loc; - let oldConcise = this.format.concise; if (node._compact) { this.format.concise = true; @@ -283,8 +280,10 @@ export default class Printer { this._printStack.push(node); - if (node.loc) this.printAuxAfterComment(); - this._printAuxBeforeComment(oldInAux); + let oldInAux = this.insideAux; + this.insideAux = !node.loc; + if (!this.insideAux) this.printAuxAfterComment(); + else if (!oldInAux) this._printAuxBeforeComment(); let needsParens = n.needsParens(node, parent, this._printStack); if (needsParens) this.token("("); @@ -299,7 +298,7 @@ export default class Printer { }); // Check again if any of our children may have left an aux comment on the stack - if (node.loc) this.printAuxAfterComment(); + if (!this.insideAux) this.printAuxAfterComment(); this._printTrailingComments(node, parent); @@ -315,11 +314,13 @@ export default class Printer { this._printNewline(false, node, parent, opts); } - _printAuxBeforeComment(wasInAux) { - let comment = this.format.auxiliaryCommentBefore; - if (!wasInAux && this.insideAux && !this.printAuxAfterOnNextUserNode) { - this.printAuxAfterOnNextUserNode = true; - if (comment) this._printComment({ + _printAuxBeforeComment() { + if (this._printAuxAfterOnNextUserNode) return; + this._printAuxAfterOnNextUserNode = true; + + const comment = this.format.auxiliaryCommentBefore; + if (comment) { + this._printComment({ type: "CommentBlock", value: comment }); @@ -327,10 +328,12 @@ export default class Printer { } printAuxAfterComment() { - if (this.printAuxAfterOnNextUserNode) { - this.printAuxAfterOnNextUserNode = false; - let comment = this.format.auxiliaryCommentAfter; - if (comment) this._printComment({ + if (!this._printAuxAfterOnNextUserNode) return; + this._printAuxAfterOnNextUserNode = false; + + const comment = this.format.auxiliaryCommentAfter; + if (comment) { + this._printComment({ type: "CommentBlock", value: comment }); From 1bf76b0f335b71d9843f7bbceb2e00815f79e9ee Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Thu, 14 Jul 2016 22:07:40 -0700 Subject: [PATCH 10/12] Use .append to force-commit semicolons for empty statements. --- packages/babel-generator/src/generators/expressions.js | 3 +-- packages/babel-generator/src/printer.js | 8 +++----- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/packages/babel-generator/src/generators/expressions.js b/packages/babel-generator/src/generators/expressions.js index 048c5e2adb..38f4973665 100644 --- a/packages/babel-generator/src/generators/expressions.js +++ b/packages/babel-generator/src/generators/expressions.js @@ -137,8 +137,7 @@ export let YieldExpression = buildYieldAwait("yield"); export let AwaitExpression = buildYieldAwait("await"); export function EmptyStatement() { - this._lastPrintedIsEmptyStatement = true; - this.semicolon(); + this.semicolon(true /* force */); } export function ExpressionStatement(node: Object) { diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index 71bee2e517..e0c10132a9 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -53,8 +53,8 @@ export default class Printer { * Add a semicolon to the buffer. */ - semicolon(): void { - this._append(";", true /* queue */); + semicolon(force: boolean = false): void { + this._append(";", !force /* queue */); } /** @@ -64,7 +64,7 @@ export default class Printer { rightBrace(): void { if (!this.endsWith("\n")) this.newline(); - if (this.format.minified && !this._lastPrintedIsEmptyStatement) { + if (this.format.minified) { this._buf.removeLastSemicolon(); } this.token("}"); @@ -262,8 +262,6 @@ export default class Printer { print(node, parent, opts = {}) { if (!node) return; - this._lastPrintedIsEmptyStatement = false; - if (parent && parent._compact) { node._compact = true; } From 9b8b5112dff2f08439320a857c3582c7d459fb17 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Mon, 11 Jul 2016 19:28:03 -0700 Subject: [PATCH 11/12] Remove unneeded _compact assignment. --- packages/babel-generator/src/printer.js | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index e0c10132a9..232cf0108d 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -262,10 +262,6 @@ export default class Printer { print(node, parent, opts = {}) { if (!node) return; - if (parent && parent._compact) { - node._compact = true; - } - let oldConcise = this.format.concise; if (node._compact) { this.format.concise = true; From 44282e4579a775f5519aae76f8de7c1d336d1745 Mon Sep 17 00:00:00 2001 From: Logan Smyth Date: Thu, 14 Jul 2016 22:58:11 -0700 Subject: [PATCH 12/12] Disable indent and inc/dec time. --- packages/babel-generator/src/printer.js | 26 ++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index 232cf0108d..6ecd82530d 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -21,23 +21,13 @@ export default class Printer { _printedCommentStarts: Object; _parenPushNewlineState: ?Object; - /** - * Get the current indent. - */ - - _getIndent(): string { - if (this.format.compact || this.format.concise) { - return ""; - } else { - return repeat(this.format.indent.style, this._indent); - } - } - /** * Increment indent size. */ indent(): void { + if (this.format.compact || this.format.concise) return; + this._indent++; } @@ -46,6 +36,8 @@ export default class Printer { */ dedent(): void { + if (this.format.compact || this.format.concise) return; + this._indent--; } @@ -189,7 +181,7 @@ export default class Printer { _maybeIndent(str: string): void { // we've got a newline before us so prepend on the indentation - if (!this.format.compact && this._indent && this.endsWith("\n") && str[0] !== "\n") { + if (this._indent && this.endsWith("\n") && str[0] !== "\n") { this._buf.queue(this._getIndent()); } } @@ -225,6 +217,14 @@ export default class Printer { } } + /** + * Get the current indent. + */ + + _getIndent(): string { + return repeat(this.format.indent.style, this._indent); + } + /** * Set some state that will be modified if a newline has been inserted before any * non-space characters.