93 lines
3.8 KiB
JavaScript
93 lines
3.8 KiB
JavaScript
/**
|
|
* @fileoverview Define 2 token factories; forward and backward.
|
|
* @author Toru Nagashima
|
|
*/
|
|
"use strict";
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Requirements
|
|
//------------------------------------------------------------------------------
|
|
|
|
const BackwardTokenCommentCursor = require("./backward-token-comment-cursor");
|
|
const BackwardTokenCursor = require("./backward-token-cursor");
|
|
const FilterCursor = require("./filter-cursor");
|
|
const ForwardTokenCommentCursor = require("./forward-token-comment-cursor");
|
|
const ForwardTokenCursor = require("./forward-token-cursor");
|
|
const LimitCursor = require("./limit-cursor");
|
|
const SkipCursor = require("./skip-cursor");
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Helpers
|
|
//------------------------------------------------------------------------------
|
|
|
|
/**
|
|
* The cursor factory.
|
|
* @private
|
|
*/
|
|
class CursorFactory {
|
|
|
|
/**
|
|
* Initializes this cursor.
|
|
* @param {Function} TokenCursor - The class of the cursor which iterates tokens only.
|
|
* @param {Function} TokenCommentCursor - The class of the cursor which iterates the mix of tokens and comments.
|
|
*/
|
|
constructor(TokenCursor, TokenCommentCursor) {
|
|
this.TokenCursor = TokenCursor;
|
|
this.TokenCommentCursor = TokenCommentCursor;
|
|
}
|
|
|
|
/**
|
|
* Creates a base cursor instance that can be decorated by createCursor.
|
|
*
|
|
* @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.
|
|
* @param {boolean} includeComments - The flag to iterate comments as well.
|
|
* @returns {Cursor} The created base cursor.
|
|
*/
|
|
createBaseCursor(tokens, comments, indexMap, startLoc, endLoc, includeComments) {
|
|
const Cursor = includeComments ? this.TokenCommentCursor : this.TokenCursor;
|
|
|
|
return new Cursor(tokens, comments, indexMap, startLoc, endLoc);
|
|
}
|
|
|
|
/**
|
|
* Creates a cursor that iterates tokens with normalized options.
|
|
*
|
|
* @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.
|
|
* @param {boolean} includeComments - The flag to iterate comments as well.
|
|
* @param {Function|null} filter - The predicate function to choose tokens.
|
|
* @param {number} skip - The count of tokens the cursor skips.
|
|
* @param {number} count - The maximum count of tokens the cursor iterates. Zero is no iteration for backward compatibility.
|
|
* @returns {Cursor} The created cursor.
|
|
*/
|
|
createCursor(tokens, comments, indexMap, startLoc, endLoc, includeComments, filter, skip, count) {
|
|
let cursor = this.createBaseCursor(tokens, comments, indexMap, startLoc, endLoc, includeComments);
|
|
|
|
if (filter) {
|
|
cursor = new FilterCursor(cursor, filter);
|
|
}
|
|
if (skip >= 1) {
|
|
cursor = new SkipCursor(cursor, skip);
|
|
}
|
|
if (count >= 0) {
|
|
cursor = new LimitCursor(cursor, count);
|
|
}
|
|
|
|
return cursor;
|
|
}
|
|
}
|
|
|
|
//------------------------------------------------------------------------------
|
|
// Exports
|
|
//------------------------------------------------------------------------------
|
|
|
|
exports.forward = new CursorFactory(ForwardTokenCursor, ForwardTokenCommentCursor);
|
|
exports.backward = new CursorFactory(BackwardTokenCursor, BackwardTokenCommentCursor);
|