From c7c90acf3fb5863010c608bda3f9dc2106a3d3dd Mon Sep 17 00:00:00 2001 From: Dan Abramov Date: Wed, 14 Jan 2015 19:08:33 +0300 Subject: [PATCH] Store ranges instead of line indexes for performance --- lib/6to5/generation/whitespace.js | 16 +++------ lib/6to5/util.js | 60 +++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 12 deletions(-) diff --git a/lib/6to5/generation/whitespace.js b/lib/6to5/generation/whitespace.js index c7dda860da..6d16536f26 100644 --- a/lib/6to5/generation/whitespace.js +++ b/lib/6to5/generation/whitespace.js @@ -1,6 +1,7 @@ module.exports = Whitespace; -var _ = require("lodash"); +var _ = require("lodash"); +var util = require("../util"); function Whitespace(tokens, comments) { this.tokens = _.sortBy(tokens.concat(comments), "start"); @@ -61,14 +62,5 @@ Whitespace.prototype.getNewlinesBetween = function (startToken, endToken) { var start = startToken ? startToken.loc.end.line : 1; var end = endToken.loc.start.line; - var lines = 0; - - for (var line = start; line < end; line++) { - if (!_.contains(this.used, line)) { - this.used.push(line); - lines++; - } - } - - return lines; -}; + return util.mergeIntegerRange(this.used, start, end); +}; \ No newline at end of file diff --git a/lib/6to5/util.js b/lib/6to5/util.js index 66af587e4f..23d9ec9227 100644 --- a/lib/6to5/util.js +++ b/lib/6to5/util.js @@ -204,6 +204,66 @@ exports.repeat = function (width, cha) { return result; }; +exports.mergeIntegerRange = function (ranges, start, end) { + var pointsAdded = 0; + var insertIndex; + var rangeIndex; + var point; + var range; + var matchingRange; + var rangeImmediatelyToLeft; + var rangeImmediatelyToRight; + + for (point = start; point < end; point++) { + matchingRange = null; + rangeImmediatelyToLeft = null; + rangeImmediatelyToRight = null; + insertIndex = ranges.length; + + for (rangeIndex = 0; rangeIndex < ranges.length; rangeIndex++) { + range = ranges[rangeIndex]; + + if (point >= range.start && point <= range.end) { + matchingRange = range; + break; + } + + if (point < range.start) { + insertIndex = rangeIndex; + } + + if (point === range.end + 1) { + rangeImmediatelyToLeft = range; + } + + if (point === range.start - 1) { + rangeImmediatelyToRight = range; + } + } + + if (matchingRange) + continue; + + pointsAdded++; + + if (rangeImmediatelyToLeft && rangeImmediatelyToRight) { + ranges.splice(ranges.indexOf(rangeImmediatelyToRight), 1); + rangeImmediatelyToLeft.end = rangeImmediatelyToRight.end; + } else if (rangeImmediatelyToLeft) { + rangeImmediatelyToLeft.end = point; + } else if (rangeImmediatelyToRight) { + rangeImmediatelyToRight.start = point; + } else { + ranges.splice(insertIndex, 0, { + start: point, + end: point + }); + } + } + + return pointsAdded; +}; + exports.normaliseAst = function (ast, comments, tokens) { if (ast && ast.type === "Program") { return t.file(ast, comments || [], tokens || []);