141 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @fileoverview An object that creates fix commands for rules.
 | |
|  * @author Nicholas C. Zakas
 | |
|  */
 | |
| "use strict";
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // Requirements
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| // none!
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // Helpers
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| /**
 | |
|  * Creates a fix command that inserts text at the specified index in the source text.
 | |
|  * @param {int} index The 0-based index at which to insert the new text.
 | |
|  * @param {string} text The text to insert.
 | |
|  * @returns {Object} The fix command.
 | |
|  * @private
 | |
|  */
 | |
| function insertTextAt(index, text) {
 | |
|     return {
 | |
|         range: [index, index],
 | |
|         text
 | |
|     };
 | |
| }
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // Public Interface
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| /**
 | |
|  * Creates code fixing commands for rules.
 | |
|  */
 | |
| 
 | |
| const ruleFixer = Object.freeze({
 | |
| 
 | |
|     /**
 | |
|      * Creates a fix command that inserts text after the given node or token.
 | |
|      * The fix is not applied until applyFixes() is called.
 | |
|      * @param {ASTNode|Token} nodeOrToken The node or token to insert after.
 | |
|      * @param {string} text The text to insert.
 | |
|      * @returns {Object} The fix command.
 | |
|      */
 | |
|     insertTextAfter(nodeOrToken, text) {
 | |
|         return this.insertTextAfterRange(nodeOrToken.range, text);
 | |
|     },
 | |
| 
 | |
|     /**
 | |
|      * Creates a fix command that inserts text after the specified range in the source text.
 | |
|      * The fix is not applied until applyFixes() is called.
 | |
|      * @param {int[]} range The range to replace, first item is start of range, second
 | |
|      *      is end of range.
 | |
|      * @param {string} text The text to insert.
 | |
|      * @returns {Object} The fix command.
 | |
|      */
 | |
|     insertTextAfterRange(range, text) {
 | |
|         return insertTextAt(range[1], text);
 | |
|     },
 | |
| 
 | |
|     /**
 | |
|      * Creates a fix command that inserts text before the given node or token.
 | |
|      * The fix is not applied until applyFixes() is called.
 | |
|      * @param {ASTNode|Token} nodeOrToken The node or token to insert before.
 | |
|      * @param {string} text The text to insert.
 | |
|      * @returns {Object} The fix command.
 | |
|      */
 | |
|     insertTextBefore(nodeOrToken, text) {
 | |
|         return this.insertTextBeforeRange(nodeOrToken.range, text);
 | |
|     },
 | |
| 
 | |
|     /**
 | |
|      * Creates a fix command that inserts text before the specified range in the source text.
 | |
|      * The fix is not applied until applyFixes() is called.
 | |
|      * @param {int[]} range The range to replace, first item is start of range, second
 | |
|      *      is end of range.
 | |
|      * @param {string} text The text to insert.
 | |
|      * @returns {Object} The fix command.
 | |
|      */
 | |
|     insertTextBeforeRange(range, text) {
 | |
|         return insertTextAt(range[0], text);
 | |
|     },
 | |
| 
 | |
|     /**
 | |
|      * Creates a fix command that replaces text at the node or token.
 | |
|      * The fix is not applied until applyFixes() is called.
 | |
|      * @param {ASTNode|Token} nodeOrToken The node or token to remove.
 | |
|      * @param {string} text The text to insert.
 | |
|      * @returns {Object} The fix command.
 | |
|      */
 | |
|     replaceText(nodeOrToken, text) {
 | |
|         return this.replaceTextRange(nodeOrToken.range, text);
 | |
|     },
 | |
| 
 | |
|     /**
 | |
|      * Creates a fix command that replaces text at the specified range in the source text.
 | |
|      * The fix is not applied until applyFixes() is called.
 | |
|      * @param {int[]} range The range to replace, first item is start of range, second
 | |
|      *      is end of range.
 | |
|      * @param {string} text The text to insert.
 | |
|      * @returns {Object} The fix command.
 | |
|      */
 | |
|     replaceTextRange(range, text) {
 | |
|         return {
 | |
|             range,
 | |
|             text
 | |
|         };
 | |
|     },
 | |
| 
 | |
|     /**
 | |
|      * Creates a fix command that removes the node or token from the source.
 | |
|      * The fix is not applied until applyFixes() is called.
 | |
|      * @param {ASTNode|Token} nodeOrToken The node or token to remove.
 | |
|      * @returns {Object} The fix command.
 | |
|      */
 | |
|     remove(nodeOrToken) {
 | |
|         return this.removeRange(nodeOrToken.range);
 | |
|     },
 | |
| 
 | |
|     /**
 | |
|      * Creates a fix command that removes the specified range of text from the source.
 | |
|      * The fix is not applied until applyFixes() is called.
 | |
|      * @param {int[]} range The range to remove, first item is start of range, second
 | |
|      *      is end of range.
 | |
|      * @returns {Object} The fix command.
 | |
|      */
 | |
|     removeRange(range) {
 | |
|         return {
 | |
|             range,
 | |
|             text: ""
 | |
|         };
 | |
|     }
 | |
| 
 | |
| });
 | |
| 
 | |
| 
 | |
| module.exports = ruleFixer;
 |