Class: RuboCop::Cop::Metrics::ParameterLists

Inherits:
Base
  • Object
show all
Defined in:
lib/rubocop/cop/metrics/parameter_lists.rb

Overview

This cop checks for methods with too many parameters.

The maximum number of parameters is configurable. Keyword arguments can optionally be excluded from the total count, as they add less complexity than positional or optional parameters.

This cop also checks for the maximum number of optional parameters. This can be configured using the `MaxOptionalParameters` config option.

Examples:

Max: 3

# good
def foo(a, b, c = 1)
end

Max: 2

# bad
def foo(a, b, c = 1)
end

CountKeywordArgs: true (default)

# counts keyword args towards the maximum

# bad (assuming Max is 3)
def foo(a, b, c, d: 1)
end

# good (assuming Max is 3)
def foo(a, b, c: 1)
end

CountKeywordArgs: false

# don't count keyword args towards the maximum

# good (assuming Max is 3)
def foo(a, b, c, d: 1)
end

MaxOptionalParameters: 3 (default)

# good
def foo(a = 1, b = 2, c = 3)
end

MaxOptionalParameters: 2

# bad
def foo(a = 1, b = 2, c = 3)
end

Constant Summary collapse

MSG =
'Avoid parameter lists longer than %<max>d parameters. [%<count>d/%<max>d]'
OPTIONAL_PARAMETERS_MSG =
'Method has too many optional parameters. [%<count>d/%<max>d]'

Constants inherited from Base

Base::RESTRICT_ON_SEND

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

Methods inherited from Base

#add_global_offense, #add_offense, autocorrect_incompatible_with, badge, #callbacks_needed, callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #cop_config, #cop_name, cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #initialize, joining_forces, lint?, match?, #message, #offenses, #on_investigation_end, #on_new_investigation, #on_other_file, #parse, #ready, #relevant_file?, support_autocorrect?, support_multiple_source?, #target_rails_version, #target_ruby_version

Methods included from ExcludeLimit

#exclude_limit

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #correctable?, #disable_uncorrectable?, #safe_autocorrect?

Methods included from IgnoredNode

#ignore_node, #ignored_node?, #part_of_ignored_node?

Methods included from Util

silence_warnings

Constructor Details

This class inherits a constructor from RuboCop::Cop::Base

Instance Method Details

#on_args(node) ⇒ Object


77
78
79
80
81
82
83
84
85
86
# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 77

def on_args(node)
  count = args_count(node)
  return unless count > max_params

  return if argument_to_lambda_or_proc?(node)

  add_offense(node, message: format(MSG, max: max_params, count: args_count(node))) do
    self.max = count
  end
end

#on_def(node) ⇒ Object Also known as: on_defs


63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 63

def on_def(node)
  optargs = node.arguments.select(&:optarg_type?)
  return if optargs.count <= max_optional_parameters

  message = format(
    OPTIONAL_PARAMETERS_MSG,
    max: max_optional_parameters,
    count: optargs.count
  )

  add_offense(node, message: message) { self.max_optional_parameters = optargs.count }
end