From 28ca3f7f3a0230b18f6685d88375e3d43cf22bb6 Mon Sep 17 00:00:00 2001 From: Jason Date: Sun, 14 Feb 2016 13:42:12 +0800 Subject: [PATCH] [generator] bug fix - Fix Whitespace with empty token list - Force a newline for line comments in concise mode --- .../babel-generator/src/generators/base.js | 2 +- packages/babel-generator/src/printer.js | 2 +- packages/babel-generator/src/whitespace.js | 5 +++-- .../actual.js | 4 ++++ .../expected.js | 2 ++ .../options.json | 3 +++ packages/babel-generator/test/index.js | 21 +++++++++++++------ 7 files changed, 29 insertions(+), 10 deletions(-) create mode 100644 packages/babel-generator/test/fixtures/comments/block-line-comment-with-concise-format/actual.js create mode 100644 packages/babel-generator/test/fixtures/comments/block-line-comment-with-concise-format/expected.js create mode 100644 packages/babel-generator/test/fixtures/comments/block-line-comment-with-concise-format/options.json diff --git a/packages/babel-generator/src/generators/base.js b/packages/babel-generator/src/generators/base.js index d9f9ea2664..9868dfe7f5 100644 --- a/packages/babel-generator/src/generators/base.js +++ b/packages/babel-generator/src/generators/base.js @@ -23,7 +23,7 @@ export function BlockStatement(node: Object) { if (node.directives && node.directives.length) this.newline(); this.printSequence(node.body, node, { indent: true }); - if (!this.format.retainLines) this.removeLast("\n"); + if (!this.format.retainLines && !this.format.concise) this.removeLast("\n"); this.rightBrace(); } else { this.push("}"); diff --git a/packages/babel-generator/src/printer.js b/packages/babel-generator/src/printer.js index 90c0501db5..a8c843d82c 100644 --- a/packages/babel-generator/src/printer.js +++ b/packages/babel-generator/src/printer.js @@ -299,7 +299,7 @@ export default class Printer extends Buffer { // 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.retainLines) && comment.type === "CommentLine") { + if ((this.format.compact || this.format.concise || this.format.retainLines) && comment.type === "CommentLine") { val += "\n"; } diff --git a/packages/babel-generator/src/whitespace.js b/packages/babel-generator/src/whitespace.js index 9432bb1acc..035f5bb272 100644 --- a/packages/babel-generator/src/whitespace.js +++ b/packages/babel-generator/src/whitespace.js @@ -83,11 +83,12 @@ export default class Whitespace { */ _findToken(test: Function, start: number, end: number): number { + if (start >= end) return -1; const middle = (start + end) >>> 1; const match: number = test(this.tokens[middle]); - if (match < 0 && end > middle) { + if (match < 0) { return this._findToken(test, middle + 1, end); - } else if (match > 0 && start < middle) { + } else if (match > 0) { return this._findToken(test, start, middle); } else if (match === 0) { return middle; diff --git a/packages/babel-generator/test/fixtures/comments/block-line-comment-with-concise-format/actual.js b/packages/babel-generator/test/fixtures/comments/block-line-comment-with-concise-format/actual.js new file mode 100644 index 0000000000..5c85ac0e06 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/block-line-comment-with-concise-format/actual.js @@ -0,0 +1,4 @@ +{ + print("hello"); + // comment +} diff --git a/packages/babel-generator/test/fixtures/comments/block-line-comment-with-concise-format/expected.js b/packages/babel-generator/test/fixtures/comments/block-line-comment-with-concise-format/expected.js new file mode 100644 index 0000000000..08f80d43e4 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/block-line-comment-with-concise-format/expected.js @@ -0,0 +1,2 @@ +{ print("hello"); // comment +} diff --git a/packages/babel-generator/test/fixtures/comments/block-line-comment-with-concise-format/options.json b/packages/babel-generator/test/fixtures/comments/block-line-comment-with-concise-format/options.json new file mode 100644 index 0000000000..8a7b145b41 --- /dev/null +++ b/packages/babel-generator/test/fixtures/comments/block-line-comment-with-concise-format/options.json @@ -0,0 +1,3 @@ +{ + "concise": true +} diff --git a/packages/babel-generator/test/index.js b/packages/babel-generator/test/index.js index c0e3326136..e6cfc39827 100644 --- a/packages/babel-generator/test/index.js +++ b/packages/babel-generator/test/index.js @@ -1,9 +1,10 @@ -var generate = require("../lib"); -var assert = require("assert"); -var parse = require("babylon").parse; -var chai = require("chai"); -var t = require("babel-types"); -var _ = require("lodash"); +var Whitespace = require("../lib/whitespace"); +var generate = require("../lib"); +var assert = require("assert"); +var parse = require("babylon").parse; +var chai = require("chai"); +var t = require("babel-types"); +var _ = require("lodash"); suite("generation", function () { test("completeness", function () { @@ -44,6 +45,14 @@ suite("programmatic generation", function() { }); }); + +suite("whitespace", function () { + test("empty token list", function () { + var w = new Whitespace([]); + assert.equal(w.getNewlinesBefore(t.stringLiteral('1')), 0); + }); +}); + var suites = require("babel-helper-fixtures").default(__dirname + "/fixtures"); suites.forEach(function (testSuite) {