193 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			193 lines
		
	
	
		
			6.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * @fileoverview Comma spacing - validates spacing before and after comma
 | |
|  * @author Vignesh Anand aka vegetableman.
 | |
|  * @deprecated in ESLint v8.53.0
 | |
|  */
 | |
| "use strict";
 | |
| 
 | |
| const astUtils = require("./utils/ast-utils");
 | |
| 
 | |
| //------------------------------------------------------------------------------
 | |
| // Rule Definition
 | |
| //------------------------------------------------------------------------------
 | |
| 
 | |
| /** @type {import('../shared/types').Rule} */
 | |
| module.exports = {
 | |
|     meta: {
 | |
|         deprecated: true,
 | |
|         replacedBy: [],
 | |
|         type: "layout",
 | |
| 
 | |
|         docs: {
 | |
|             description: "Enforce consistent spacing before and after commas",
 | |
|             recommended: false,
 | |
|             url: "https://eslint.org/docs/latest/rules/comma-spacing"
 | |
|         },
 | |
| 
 | |
|         fixable: "whitespace",
 | |
| 
 | |
|         schema: [
 | |
|             {
 | |
|                 type: "object",
 | |
|                 properties: {
 | |
|                     before: {
 | |
|                         type: "boolean",
 | |
|                         default: false
 | |
|                     },
 | |
|                     after: {
 | |
|                         type: "boolean",
 | |
|                         default: true
 | |
|                     }
 | |
|                 },
 | |
|                 additionalProperties: false
 | |
|             }
 | |
|         ],
 | |
| 
 | |
|         messages: {
 | |
|             missing: "A space is required {{loc}} ','.",
 | |
|             unexpected: "There should be no space {{loc}} ','."
 | |
|         }
 | |
|     },
 | |
| 
 | |
|     create(context) {
 | |
| 
 | |
|         const sourceCode = context.sourceCode;
 | |
|         const tokensAndComments = sourceCode.tokensAndComments;
 | |
| 
 | |
|         const options = {
 | |
|             before: context.options[0] ? context.options[0].before : false,
 | |
|             after: context.options[0] ? context.options[0].after : true
 | |
|         };
 | |
| 
 | |
|         //--------------------------------------------------------------------------
 | |
|         // Helpers
 | |
|         //--------------------------------------------------------------------------
 | |
| 
 | |
|         // list of comma tokens to ignore for the check of leading whitespace
 | |
|         const commaTokensToIgnore = [];
 | |
| 
 | |
|         /**
 | |
|          * Reports a spacing error with an appropriate message.
 | |
|          * @param {ASTNode} node The binary expression node to report.
 | |
|          * @param {string} loc Is the error "before" or "after" the comma?
 | |
|          * @param {ASTNode} otherNode The node at the left or right of `node`
 | |
|          * @returns {void}
 | |
|          * @private
 | |
|          */
 | |
|         function report(node, loc, otherNode) {
 | |
|             context.report({
 | |
|                 node,
 | |
|                 fix(fixer) {
 | |
|                     if (options[loc]) {
 | |
|                         if (loc === "before") {
 | |
|                             return fixer.insertTextBefore(node, " ");
 | |
|                         }
 | |
|                         return fixer.insertTextAfter(node, " ");
 | |
| 
 | |
|                     }
 | |
|                     let start, end;
 | |
|                     const newText = "";
 | |
| 
 | |
|                     if (loc === "before") {
 | |
|                         start = otherNode.range[1];
 | |
|                         end = node.range[0];
 | |
|                     } else {
 | |
|                         start = node.range[1];
 | |
|                         end = otherNode.range[0];
 | |
|                     }
 | |
| 
 | |
|                     return fixer.replaceTextRange([start, end], newText);
 | |
| 
 | |
|                 },
 | |
|                 messageId: options[loc] ? "missing" : "unexpected",
 | |
|                 data: {
 | |
|                     loc
 | |
|                 }
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         /**
 | |
|          * Adds null elements of the given ArrayExpression or ArrayPattern node to the ignore list.
 | |
|          * @param {ASTNode} node An ArrayExpression or ArrayPattern node.
 | |
|          * @returns {void}
 | |
|          */
 | |
|         function addNullElementsToIgnoreList(node) {
 | |
|             let previousToken = sourceCode.getFirstToken(node);
 | |
| 
 | |
|             node.elements.forEach(element => {
 | |
|                 let token;
 | |
| 
 | |
|                 if (element === null) {
 | |
|                     token = sourceCode.getTokenAfter(previousToken);
 | |
| 
 | |
|                     if (astUtils.isCommaToken(token)) {
 | |
|                         commaTokensToIgnore.push(token);
 | |
|                     }
 | |
|                 } else {
 | |
|                     token = sourceCode.getTokenAfter(element);
 | |
|                 }
 | |
| 
 | |
|                 previousToken = token;
 | |
|             });
 | |
|         }
 | |
| 
 | |
|         //--------------------------------------------------------------------------
 | |
|         // Public
 | |
|         //--------------------------------------------------------------------------
 | |
| 
 | |
|         return {
 | |
|             "Program:exit"() {
 | |
|                 tokensAndComments.forEach((token, i) => {
 | |
| 
 | |
|                     if (!astUtils.isCommaToken(token)) {
 | |
|                         return;
 | |
|                     }
 | |
| 
 | |
|                     const previousToken = tokensAndComments[i - 1];
 | |
|                     const nextToken = tokensAndComments[i + 1];
 | |
| 
 | |
|                     if (
 | |
|                         previousToken &&
 | |
|                         !astUtils.isCommaToken(previousToken) && // ignore spacing between two commas
 | |
| 
 | |
|                         /*
 | |
|                          * `commaTokensToIgnore` are ending commas of `null` elements (array holes/elisions).
 | |
|                          * In addition to spacing between two commas, this can also ignore:
 | |
|                          *
 | |
|                          *   - Spacing after `[` (controlled by array-bracket-spacing)
 | |
|                          *       Example: [ , ]
 | |
|                          *                 ^
 | |
|                          *   - Spacing after a comment (for backwards compatibility, this was possibly unintentional)
 | |
|                          *       Example: [a, /* * / ,]
 | |
|                          *                          ^
 | |
|                          */
 | |
|                         !commaTokensToIgnore.includes(token) &&
 | |
| 
 | |
|                         astUtils.isTokenOnSameLine(previousToken, token) &&
 | |
|                         options.before !== sourceCode.isSpaceBetweenTokens(previousToken, token)
 | |
|                     ) {
 | |
|                         report(token, "before", previousToken);
 | |
|                     }
 | |
| 
 | |
|                     if (
 | |
|                         nextToken &&
 | |
|                         !astUtils.isCommaToken(nextToken) && // ignore spacing between two commas
 | |
|                         !astUtils.isClosingParenToken(nextToken) && // controlled by space-in-parens
 | |
|                         !astUtils.isClosingBracketToken(nextToken) && // controlled by array-bracket-spacing
 | |
|                         !astUtils.isClosingBraceToken(nextToken) && // controlled by object-curly-spacing
 | |
|                         !(!options.after && nextToken.type === "Line") && // special case, allow space before line comment
 | |
|                         astUtils.isTokenOnSameLine(token, nextToken) &&
 | |
|                         options.after !== sourceCode.isSpaceBetweenTokens(token, nextToken)
 | |
|                     ) {
 | |
|                         report(token, "after", nextToken);
 | |
|                     }
 | |
|                 });
 | |
|             },
 | |
|             ArrayExpression: addNullElementsToIgnoreList,
 | |
|             ArrayPattern: addNullElementsToIgnoreList
 | |
| 
 | |
|         };
 | |
| 
 | |
|     }
 | |
| };
 |