123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- /**
- * @fileoverview Rule to define spacing before/after arrow function's arrow.
- * @author Jxck
- */
- "use strict";
-
- //------------------------------------------------------------------------------
- // Requirements
- //------------------------------------------------------------------------------
-
- const astUtils = require("../util/ast-utils");
-
- //------------------------------------------------------------------------------
- // Rule Definition
- //------------------------------------------------------------------------------
-
- module.exports = {
- meta: {
- type: "layout",
-
- docs: {
- description: "enforce consistent spacing before and after the arrow in arrow functions",
- category: "ECMAScript 6",
- recommended: false,
- url: "https://eslint.org/docs/rules/arrow-spacing"
- },
-
- fixable: "whitespace",
-
- schema: [
- {
- type: "object",
- properties: {
- before: {
- type: "boolean"
- },
- after: {
- type: "boolean"
- }
- },
- additionalProperties: false
- }
- ],
-
- messages: {
- expectedBefore: "Missing space before =>.",
- unexpectedBefore: "Unexpected space before =>.",
-
- expectedAfter: "Missing space after =>.",
- unexpectedAfter: "Unexpected space after =>."
- }
- },
-
- create(context) {
-
- // merge rules with default
- const rule = { before: true, after: true },
- option = context.options[0] || {};
-
- rule.before = option.before !== false;
- rule.after = option.after !== false;
-
- const sourceCode = context.getSourceCode();
-
- /**
- * Get tokens of arrow(`=>`) and before/after arrow.
- * @param {ASTNode} node The arrow function node.
- * @returns {Object} Tokens of arrow and before/after arrow.
- */
- function getTokens(node) {
- const arrow = sourceCode.getTokenBefore(node.body, astUtils.isArrowToken);
-
- return {
- before: sourceCode.getTokenBefore(arrow),
- arrow,
- after: sourceCode.getTokenAfter(arrow)
- };
- }
-
- /**
- * Count spaces before/after arrow(`=>`) token.
- * @param {Object} tokens Tokens before/after arrow.
- * @returns {Object} count of space before/after arrow.
- */
- function countSpaces(tokens) {
- const before = tokens.arrow.range[0] - tokens.before.range[1];
- const after = tokens.after.range[0] - tokens.arrow.range[1];
-
- return { before, after };
- }
-
- /**
- * Determines whether space(s) before after arrow(`=>`) is satisfy rule.
- * if before/after value is `true`, there should be space(s).
- * if before/after value is `false`, there should be no space.
- * @param {ASTNode} node The arrow function node.
- * @returns {void}
- */
- function spaces(node) {
- const tokens = getTokens(node);
- const countSpace = countSpaces(tokens);
-
- if (rule.before) {
-
- // should be space(s) before arrow
- if (countSpace.before === 0) {
- context.report({
- node: tokens.before,
- messageId: "expectedBefore",
- fix(fixer) {
- return fixer.insertTextBefore(tokens.arrow, " ");
- }
- });
- }
- } else {
-
- // should be no space before arrow
- if (countSpace.before > 0) {
- context.report({
- node: tokens.before,
- messageId: "unexpectedBefore",
- fix(fixer) {
- return fixer.removeRange([tokens.before.range[1], tokens.arrow.range[0]]);
- }
- });
- }
- }
-
- if (rule.after) {
-
- // should be space(s) after arrow
- if (countSpace.after === 0) {
- context.report({
- node: tokens.after,
- messageId: "expectedAfter",
- fix(fixer) {
- return fixer.insertTextAfter(tokens.arrow, " ");
- }
- });
- }
- } else {
-
- // should be no space after arrow
- if (countSpace.after > 0) {
- context.report({
- node: tokens.after,
- messageId: "unexpectedAfter",
- fix(fixer) {
- return fixer.removeRange([tokens.arrow.range[1], tokens.after.range[0]]);
- }
- });
- }
- }
- }
-
- return {
- ArrowFunctionExpression: spaces
- };
- }
- };
|