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);
|
---|