| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- /**
- * @fileoverview enforce the location of arrow function bodies
- * @author Sharmila Jesupaul
- */
- "use strict";
- //------------------------------------------------------------------------------
- // Rule Definition
- //------------------------------------------------------------------------------
- module.exports = {
- meta: {
- docs: {
- description: "enforce the location of arrow function bodies",
- category: "Stylistic Issues",
- recommended: false,
- url: "https://eslint.org/docs/rules/implicit-arrow-linebreak"
- },
- fixable: "whitespace",
- schema: [
- {
- enum: ["beside", "below"]
- }
- ]
- },
- create(context) {
- const sourceCode = context.getSourceCode();
- //----------------------------------------------------------------------
- // Helpers
- //----------------------------------------------------------------------
- /**
- * Gets the applicable preference for a particular keyword
- * @returns {string} The applicable option for the keyword, e.g. 'beside'
- */
- function getOption() {
- return context.options[0] || "beside";
- }
- /**
- * Validates the location of an arrow function body
- * @param {ASTNode} node The arrow function body
- * @param {string} keywordName The applicable keyword name for the arrow function body
- * @returns {void}
- */
- function validateExpression(node) {
- const option = getOption();
- let tokenBefore = sourceCode.getTokenBefore(node.body);
- const hasParens = tokenBefore.value === "(";
- if (node.type === "BlockStatement") {
- return;
- }
- let fixerTarget = node.body;
- if (hasParens) {
- // Gets the first token before the function body that is not an open paren
- tokenBefore = sourceCode.getTokenBefore(node.body, token => token.value !== "(");
- fixerTarget = sourceCode.getTokenAfter(tokenBefore);
- }
- if (tokenBefore.loc.end.line === fixerTarget.loc.start.line && option === "below") {
- context.report({
- node: fixerTarget,
- message: "Expected a linebreak before this expression.",
- fix: fixer => fixer.insertTextBefore(fixerTarget, "\n")
- });
- } else if (tokenBefore.loc.end.line !== fixerTarget.loc.start.line && option === "beside") {
- context.report({
- node: fixerTarget,
- message: "Expected no linebreak before this expression.",
- fix: fixer => fixer.replaceTextRange([tokenBefore.range[1], fixerTarget.range[0]], " ")
- });
- }
- }
- //----------------------------------------------------------------------
- // Public
- //----------------------------------------------------------------------
- return {
- ArrowFunctionExpression: node => validateExpression(node)
- };
- }
- };
|