Use object lookup instead of array
This commit is contained in:
parent
a452f781b8
commit
a1b326a0ab
@ -1,7 +1,6 @@
|
|||||||
module.exports = Whitespace;
|
module.exports = Whitespace;
|
||||||
|
|
||||||
var _ = require("lodash");
|
var _ = require("lodash");
|
||||||
var util = require("../util");
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns `i`th number from `base`, continuing from 0 when `max` is reached.
|
* Returns `i`th number from `base`, continuing from 0 when `max` is reached.
|
||||||
@ -23,7 +22,7 @@ function getLookupIndex(i, base, max) {
|
|||||||
|
|
||||||
function Whitespace(tokens, comments) {
|
function Whitespace(tokens, comments) {
|
||||||
this.tokens = _.sortBy(tokens.concat(comments), "start");
|
this.tokens = _.sortBy(tokens.concat(comments), "start");
|
||||||
this.used = [];
|
this.used = {};
|
||||||
|
|
||||||
// Profiling this code shows that while generator passes over it, indexes
|
// Profiling this code shows that while generator passes over it, indexes
|
||||||
// returned by `getNewlinesBefore` and `getNewlinesAfter` are always increasing.
|
// returned by `getNewlinesBefore` and `getNewlinesAfter` are always increasing.
|
||||||
@ -97,6 +96,14 @@ Whitespace.prototype.getNewlinesAfter = function (node) {
|
|||||||
Whitespace.prototype.getNewlinesBetween = function (startToken, endToken) {
|
Whitespace.prototype.getNewlinesBetween = function (startToken, endToken) {
|
||||||
var start = startToken ? startToken.loc.end.line : 1;
|
var start = startToken ? startToken.loc.end.line : 1;
|
||||||
var end = endToken.loc.start.line;
|
var end = endToken.loc.start.line;
|
||||||
|
var lines = 0;
|
||||||
|
|
||||||
return util.mergeIntegerRange(this.used, start, end);
|
for (var line = start; line < end; line++) {
|
||||||
|
if (typeof this.used[line] === 'undefined') {
|
||||||
|
this.used[line] = true;
|
||||||
|
lines++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return lines;
|
||||||
};
|
};
|
||||||
@ -204,84 +204,6 @@ exports.repeat = function (width, cha) {
|
|||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* Merges a range of integers defined by `start` and `end` into an existing
|
|
||||||
* array of `ranges`, optimizing for common cases and attempting to keep them
|
|
||||||
* sorted. Returns the count of integers that have been added to `ranges` during
|
|
||||||
* the call.
|
|
||||||
*
|
|
||||||
* @example
|
|
||||||
* > var ranges = [{ start: 1, end: 3}, { start: 8, end : 10 }];
|
|
||||||
* > mergeIntegerRange(ranges, 6, 9);
|
|
||||||
* 2
|
|
||||||
* > ranges
|
|
||||||
* [{ start: 1, end: 3}, { start: 6, end : 10 }];
|
|
||||||
*
|
|
||||||
* @param {Array} ranges An array of ranges that function will mutate
|
|
||||||
* @param {Number} start Beginning of range being added
|
|
||||||
* @param {Number} end End of range being added
|
|
||||||
* @returns {Number} pointsAdded How many new integers have been added
|
|
||||||
*/
|
|
||||||
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) {
|
exports.normaliseAst = function (ast, comments, tokens) {
|
||||||
if (ast && ast.type === "Program") {
|
if (ast && ast.type === "Program") {
|
||||||
return t.file(ast, comments || [], tokens || []);
|
return t.file(ast, comments || [], tokens || []);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user