no-dupe-args.js 2.3 KB

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