| 1 | /**
|
|---|
| 2 | * @fileoverview Define 2 token factories; forward and backward.
|
|---|
| 3 | * @author Toru Nagashima
|
|---|
| 4 | */
|
|---|
| 5 | "use strict";
|
|---|
| 6 |
|
|---|
| 7 | //------------------------------------------------------------------------------
|
|---|
| 8 | // Requirements
|
|---|
| 9 | //------------------------------------------------------------------------------
|
|---|
| 10 |
|
|---|
| 11 | const BackwardTokenCommentCursor = require("./backward-token-comment-cursor");
|
|---|
| 12 | const BackwardTokenCursor = require("./backward-token-cursor");
|
|---|
| 13 | const FilterCursor = require("./filter-cursor");
|
|---|
| 14 | const ForwardTokenCommentCursor = require("./forward-token-comment-cursor");
|
|---|
| 15 | const ForwardTokenCursor = require("./forward-token-cursor");
|
|---|
| 16 | const LimitCursor = require("./limit-cursor");
|
|---|
| 17 | const SkipCursor = require("./skip-cursor");
|
|---|
| 18 |
|
|---|
| 19 | //------------------------------------------------------------------------------
|
|---|
| 20 | // Helpers
|
|---|
| 21 | //------------------------------------------------------------------------------
|
|---|
| 22 |
|
|---|
| 23 | /**
|
|---|
| 24 | * The cursor factory.
|
|---|
| 25 | * @private
|
|---|
| 26 | */
|
|---|
| 27 | class CursorFactory {
|
|---|
| 28 |
|
|---|
| 29 | /**
|
|---|
| 30 | * Initializes this cursor.
|
|---|
| 31 | * @param {Function} TokenCursor The class of the cursor which iterates tokens only.
|
|---|
| 32 | * @param {Function} TokenCommentCursor The class of the cursor which iterates the mix of tokens and comments.
|
|---|
| 33 | */
|
|---|
| 34 | constructor(TokenCursor, TokenCommentCursor) {
|
|---|
| 35 | this.TokenCursor = TokenCursor;
|
|---|
| 36 | this.TokenCommentCursor = TokenCommentCursor;
|
|---|
| 37 | }
|
|---|
| 38 |
|
|---|
| 39 | /**
|
|---|
| 40 | * Creates a base cursor instance that can be decorated by createCursor.
|
|---|
| 41 | * @param {Token[]} tokens The array of tokens.
|
|---|
| 42 | * @param {Comment[]} comments The array of comments.
|
|---|
| 43 | * @param {Object} indexMap The map from locations to indices in `tokens`.
|
|---|
| 44 | * @param {number} startLoc The start location of the iteration range.
|
|---|
| 45 | * @param {number} endLoc The end location of the iteration range.
|
|---|
| 46 | * @param {boolean} includeComments The flag to iterate comments as well.
|
|---|
| 47 | * @returns {Cursor} The created base cursor.
|
|---|
| 48 | */
|
|---|
| 49 | createBaseCursor(tokens, comments, indexMap, startLoc, endLoc, includeComments) {
|
|---|
| 50 | const Cursor = includeComments ? this.TokenCommentCursor : this.TokenCursor;
|
|---|
| 51 |
|
|---|
| 52 | return new Cursor(tokens, comments, indexMap, startLoc, endLoc);
|
|---|
| 53 | }
|
|---|
| 54 |
|
|---|
| 55 | /**
|
|---|
| 56 | * Creates a cursor that iterates tokens with normalized options.
|
|---|
| 57 | * @param {Token[]} tokens The array of tokens.
|
|---|
| 58 | * @param {Comment[]} comments The array of comments.
|
|---|
| 59 | * @param {Object} indexMap The map from locations to indices in `tokens`.
|
|---|
| 60 | * @param {number} startLoc The start location of the iteration range.
|
|---|
| 61 | * @param {number} endLoc The end location of the iteration range.
|
|---|
| 62 | * @param {boolean} includeComments The flag to iterate comments as well.
|
|---|
| 63 | * @param {Function|null} filter The predicate function to choose tokens.
|
|---|
| 64 | * @param {number} skip The count of tokens the cursor skips.
|
|---|
| 65 | * @param {number} count The maximum count of tokens the cursor iterates. Zero is no iteration for backward compatibility.
|
|---|
| 66 | * @returns {Cursor} The created cursor.
|
|---|
| 67 | */
|
|---|
| 68 | createCursor(tokens, comments, indexMap, startLoc, endLoc, includeComments, filter, skip, count) {
|
|---|
| 69 | let cursor = this.createBaseCursor(tokens, comments, indexMap, startLoc, endLoc, includeComments);
|
|---|
| 70 |
|
|---|
| 71 | if (filter) {
|
|---|
| 72 | cursor = new FilterCursor(cursor, filter);
|
|---|
| 73 | }
|
|---|
| 74 | if (skip >= 1) {
|
|---|
| 75 | cursor = new SkipCursor(cursor, skip);
|
|---|
| 76 | }
|
|---|
| 77 | if (count >= 0) {
|
|---|
| 78 | cursor = new LimitCursor(cursor, count);
|
|---|
| 79 | }
|
|---|
| 80 |
|
|---|
| 81 | return cursor;
|
|---|
| 82 | }
|
|---|
| 83 | }
|
|---|
| 84 |
|
|---|
| 85 | //------------------------------------------------------------------------------
|
|---|
| 86 | // Exports
|
|---|
| 87 | //------------------------------------------------------------------------------
|
|---|
| 88 |
|
|---|
| 89 | exports.forward = new CursorFactory(ForwardTokenCursor, ForwardTokenCommentCursor);
|
|---|
| 90 | exports.backward = new CursorFactory(BackwardTokenCursor, BackwardTokenCommentCursor);
|
|---|