You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
192 lines
6.9 KiB
192 lines
6.9 KiB
/** |
|
* @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 |
|
|
|
}; |
|
|
|
} |
|
};
|
|
|