• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/**
2 * @fileoverview An object that creates fix commands for rules.
3 * @author Nicholas C. Zakas
4 */
5"use strict";
6
7//------------------------------------------------------------------------------
8// Requirements
9//------------------------------------------------------------------------------
10
11// none!
12
13//------------------------------------------------------------------------------
14// Helpers
15//------------------------------------------------------------------------------
16
17/**
18 * Creates a fix command that inserts text at the specified index in the source text.
19 * @param {int} index The 0-based index at which to insert the new text.
20 * @param {string} text The text to insert.
21 * @returns {Object} The fix command.
22 * @private
23 */
24function insertTextAt(index, text) {
25    return {
26        range: [index, index],
27        text
28    };
29}
30
31//------------------------------------------------------------------------------
32// Public Interface
33//------------------------------------------------------------------------------
34
35/**
36 * Creates code fixing commands for rules.
37 */
38
39const ruleFixer = Object.freeze({
40
41    /**
42     * Creates a fix command that inserts text after the given node or token.
43     * The fix is not applied until applyFixes() is called.
44     * @param {ASTNode|Token} nodeOrToken The node or token to insert after.
45     * @param {string} text The text to insert.
46     * @returns {Object} The fix command.
47     */
48    insertTextAfter(nodeOrToken, text) {
49        return this.insertTextAfterRange(nodeOrToken.range, text);
50    },
51
52    /**
53     * Creates a fix command that inserts text after the specified range in the source text.
54     * The fix is not applied until applyFixes() is called.
55     * @param {int[]} range The range to replace, first item is start of range, second
56     *      is end of range.
57     * @param {string} text The text to insert.
58     * @returns {Object} The fix command.
59     */
60    insertTextAfterRange(range, text) {
61        return insertTextAt(range[1], text);
62    },
63
64    /**
65     * Creates a fix command that inserts text before the given node or token.
66     * The fix is not applied until applyFixes() is called.
67     * @param {ASTNode|Token} nodeOrToken The node or token to insert before.
68     * @param {string} text The text to insert.
69     * @returns {Object} The fix command.
70     */
71    insertTextBefore(nodeOrToken, text) {
72        return this.insertTextBeforeRange(nodeOrToken.range, text);
73    },
74
75    /**
76     * Creates a fix command that inserts text before the specified range in the source text.
77     * The fix is not applied until applyFixes() is called.
78     * @param {int[]} range The range to replace, first item is start of range, second
79     *      is end of range.
80     * @param {string} text The text to insert.
81     * @returns {Object} The fix command.
82     */
83    insertTextBeforeRange(range, text) {
84        return insertTextAt(range[0], text);
85    },
86
87    /**
88     * Creates a fix command that replaces text at the node or token.
89     * The fix is not applied until applyFixes() is called.
90     * @param {ASTNode|Token} nodeOrToken The node or token to remove.
91     * @param {string} text The text to insert.
92     * @returns {Object} The fix command.
93     */
94    replaceText(nodeOrToken, text) {
95        return this.replaceTextRange(nodeOrToken.range, text);
96    },
97
98    /**
99     * Creates a fix command that replaces text at the specified range in the source text.
100     * The fix is not applied until applyFixes() is called.
101     * @param {int[]} range The range to replace, first item is start of range, second
102     *      is end of range.
103     * @param {string} text The text to insert.
104     * @returns {Object} The fix command.
105     */
106    replaceTextRange(range, text) {
107        return {
108            range,
109            text
110        };
111    },
112
113    /**
114     * Creates a fix command that removes the node or token from the source.
115     * The fix is not applied until applyFixes() is called.
116     * @param {ASTNode|Token} nodeOrToken The node or token to remove.
117     * @returns {Object} The fix command.
118     */
119    remove(nodeOrToken) {
120        return this.removeRange(nodeOrToken.range);
121    },
122
123    /**
124     * Creates a fix command that removes the specified range of text from the source.
125     * The fix is not applied until applyFixes() is called.
126     * @param {int[]} range The range to remove, first item is start of range, second
127     *      is end of range.
128     * @returns {Object} The fix command.
129     */
130    removeRange(range) {
131        return {
132            range,
133            text: ""
134        };
135    }
136
137});
138
139
140module.exports = ruleFixer;
141