• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/**
2 * @fileoverview Rule to flag duplicate arguments
3 * @author Jamund Ferguson
4 */
5
6"use strict";
7
8//------------------------------------------------------------------------------
9// Rule Definition
10//------------------------------------------------------------------------------
11
12module.exports = {
13    meta: {
14        type: "problem",
15
16        docs: {
17            description: "disallow duplicate arguments in `function` definitions",
18            category: "Possible Errors",
19            recommended: true,
20            url: "https://eslint.org/docs/rules/no-dupe-args"
21        },
22
23        schema: [],
24
25        messages: {
26            unexpected: "Duplicate param '{{name}}'."
27        }
28    },
29
30    create(context) {
31
32        //--------------------------------------------------------------------------
33        // Helpers
34        //--------------------------------------------------------------------------
35
36        /**
37         * Checks whether or not a given definition is a parameter's.
38         * @param {eslint-scope.DefEntry} def A definition to check.
39         * @returns {boolean} `true` if the definition is a parameter's.
40         */
41        function isParameter(def) {
42            return def.type === "Parameter";
43        }
44
45        /**
46         * Determines if a given node has duplicate parameters.
47         * @param {ASTNode} node The node to check.
48         * @returns {void}
49         * @private
50         */
51        function checkParams(node) {
52            const variables = context.getDeclaredVariables(node);
53
54            for (let i = 0; i < variables.length; ++i) {
55                const variable = variables[i];
56
57                // Checks and reports duplications.
58                const defs = variable.defs.filter(isParameter);
59
60                if (defs.length >= 2) {
61                    context.report({
62                        node,
63                        messageId: "unexpected",
64                        data: { name: variable.name }
65                    });
66                }
67            }
68        }
69
70        //--------------------------------------------------------------------------
71        // Public API
72        //--------------------------------------------------------------------------
73
74        return {
75            FunctionDeclaration: checkParams,
76            FunctionExpression: checkParams
77        };
78
79    }
80};
81