| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 | /** * @fileoverview Rule to disallow empty functions. * @author Toru Nagashima */"use strict";//------------------------------------------------------------------------------// Requirements//------------------------------------------------------------------------------const astUtils = require("../ast-utils");//------------------------------------------------------------------------------// Helpers//------------------------------------------------------------------------------const ALLOW_OPTIONS = Object.freeze([    "functions",    "arrowFunctions",    "generatorFunctions",    "methods",    "generatorMethods",    "getters",    "setters",    "constructors"]);/** * Gets the kind of a given function node. * * @param {ASTNode} node - A function node to get. This is one of *      an ArrowFunctionExpression, a FunctionDeclaration, or a *      FunctionExpression. * @returns {string} The kind of the function. This is one of "functions", *      "arrowFunctions", "generatorFunctions", "asyncFunctions", "methods", *      "generatorMethods", "asyncMethods", "getters", "setters", and *      "constructors". */function getKind(node) {    const parent = node.parent;    let kind = "";    if (node.type === "ArrowFunctionExpression") {        return "arrowFunctions";    }    // Detects main kind.    if (parent.type === "Property") {        if (parent.kind === "get") {            return "getters";        }        if (parent.kind === "set") {            return "setters";        }        kind = parent.method ? "methods" : "functions";    } else if (parent.type === "MethodDefinition") {        if (parent.kind === "get") {            return "getters";        }        if (parent.kind === "set") {            return "setters";        }        if (parent.kind === "constructor") {            return "constructors";        }        kind = "methods";    } else {        kind = "functions";    }    // Detects prefix.    let prefix = "";    if (node.generator) {        prefix = "generator";    } else if (node.async) {        prefix = "async";    } else {        return kind;    }    return prefix + kind[0].toUpperCase() + kind.slice(1);}//------------------------------------------------------------------------------// Rule Definition//------------------------------------------------------------------------------module.exports = {    meta: {        docs: {            description: "disallow empty functions",            category: "Best Practices",            recommended: false,            url: "https://eslint.org/docs/rules/no-empty-function"        },        schema: [            {                type: "object",                properties: {                    allow: {                        type: "array",                        items: { enum: ALLOW_OPTIONS },                        uniqueItems: true                    }                },                additionalProperties: false            }        ],        messages: {            unexpected: "Unexpected empty {{name}}."        }    },    create(context) {        const options = context.options[0] || {};        const allowed = options.allow || [];        const sourceCode = context.getSourceCode();        /**         * Reports a given function node if the node matches the following patterns.         *         * - Not allowed by options.         * - The body is empty.         * - The body doesn't have any comments.         *         * @param {ASTNode} node - A function node to report. This is one of         *      an ArrowFunctionExpression, a FunctionDeclaration, or a         *      FunctionExpression.         * @returns {void}         */        function reportIfEmpty(node) {            const kind = getKind(node);            const name = astUtils.getFunctionNameWithKind(node);            const innerComments = sourceCode.getTokens(node.body, {                includeComments: true,                filter: astUtils.isCommentToken            });            if (allowed.indexOf(kind) === -1 &&                node.body.type === "BlockStatement" &&                node.body.body.length === 0 &&                innerComments.length === 0            ) {                context.report({                    node,                    loc: node.body.loc.start,                    messageId: "unexpected",                    data: { name }                });            }        }        return {            ArrowFunctionExpression: reportIfEmpty,            FunctionDeclaration: reportIfEmpty,            FunctionExpression: reportIfEmpty        };    }};
 |