Store ranges instead of line indexes for performance
This commit is contained in:
@@ -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);
|
||||
};
|
||||
@@ -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 || []);
|
||||
|
||||
Reference in New Issue
Block a user