You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
57 lines
2.0 KiB
57 lines
2.0 KiB
/** |
|
* @fileoverview Define the cursor which iterates tokens and comments in reverse. |
|
* @author Toru Nagashima |
|
*/ |
|
"use strict"; |
|
|
|
//------------------------------------------------------------------------------ |
|
// Requirements |
|
//------------------------------------------------------------------------------ |
|
|
|
const Cursor = require("./cursor"); |
|
const utils = require("./utils"); |
|
|
|
//------------------------------------------------------------------------------ |
|
// Exports |
|
//------------------------------------------------------------------------------ |
|
|
|
/** |
|
* The cursor which iterates tokens and comments in reverse. |
|
*/ |
|
module.exports = class BackwardTokenCommentCursor extends Cursor { |
|
|
|
/** |
|
* Initializes this cursor. |
|
* @param {Token[]} tokens The array of tokens. |
|
* @param {Comment[]} comments The array of comments. |
|
* @param {Object} indexMap The map from locations to indices in `tokens`. |
|
* @param {number} startLoc The start location of the iteration range. |
|
* @param {number} endLoc The end location of the iteration range. |
|
*/ |
|
constructor(tokens, comments, indexMap, startLoc, endLoc) { |
|
super(); |
|
this.tokens = tokens; |
|
this.comments = comments; |
|
this.tokenIndex = utils.getLastIndex(tokens, indexMap, endLoc); |
|
this.commentIndex = utils.search(comments, endLoc) - 1; |
|
this.border = startLoc; |
|
} |
|
|
|
/** @inheritdoc */ |
|
moveNext() { |
|
const token = (this.tokenIndex >= 0) ? this.tokens[this.tokenIndex] : null; |
|
const comment = (this.commentIndex >= 0) ? this.comments[this.commentIndex] : null; |
|
|
|
if (token && (!comment || token.range[1] > comment.range[1])) { |
|
this.current = token; |
|
this.tokenIndex -= 1; |
|
} else if (comment) { |
|
this.current = comment; |
|
this.commentIndex -= 1; |
|
} else { |
|
this.current = null; |
|
} |
|
|
|
return Boolean(this.current) && (this.border === -1 || this.current.range[0] >= this.border); |
|
} |
|
};
|
|
|