diff --git a/packages/babel-generator/src/buffer.js b/packages/babel-generator/src/buffer.js index ed294897c0..a1390c1762 100644 --- a/packages/babel-generator/src/buffer.js +++ b/packages/babel-generator/src/buffer.js @@ -97,10 +97,23 @@ export default class Buffer { if (this._queue.length > 0 && this._queue[0][0] === ";") this._queue.shift(); } - endsWith(str: string): boolean { + endsWith(suffix: string): boolean { + // Fast path to avoid iterating over this._queue. + if (suffix.length === 1) { + let last; + if (this._queue.length > 0) { + const str = this._queue[0][0]; + last = str[str.length - 1]; + } else { + last = this._last; + } + + return last === suffix; + } + const end = this._last + this._queue.reduce((acc, item) => item[0] + acc, ""); - if (str.length <= end.length) { - return end.slice(-str.length) === str; + if (suffix.length <= end.length) { + return end.slice(-suffix.length) === suffix; } // We assume that everything being matched is at most a single token plus some whitespace, @@ -108,15 +121,6 @@ export default class Buffer { return false; } - getLast(): string { - if (this._queue.length > 0) { - const last = this._queue[0][0]; - return last[last.length - 1]; - } - - return this._last; - } - hasContent(): boolean { return this._queue.length > 0 || !!this._last; } diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index f0f791871a..ad3884e617 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -131,14 +131,13 @@ export default class Printer { */ token(str: string): void { - const last = this._buf.getLast(); // space is mandatory to avoid outputting