Store ranges instead of line indexes for performance

This commit is contained in:
Dan Abramov
2015-01-14 19:08:33 +03:00
parent c6f3a55c03
commit c7c90acf3f
2 changed files with 64 additions and 12 deletions

View File

@@ -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);
};

View File

@@ -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 || []);