Class: RuboCop::Cop::Metrics::ParameterLists
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
::RuboCop::Cop::Base ,
::RuboCop::ExcludeLimit ,
NodePattern::Macros,
RuboCop::AST::Sexp
|
|
Instance Chain:
self,
::RuboCop::Cop::Base ,
::RuboCop::Cop::AutocorrectLogic ,
::RuboCop::Cop::IgnoredNode ,
::RuboCop::Util ,
RuboCop::AST::Sexp
|
|
Inherits: |
RuboCop::Cop::Base
|
Defined in: | lib/rubocop/cop/metrics/parameter_lists.rb |
Overview
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.
Any number of arguments for initialize
method inside a block of
Struct.new
and Data.define
like this is always allowed:
Struct.new(:one, :two, :three, :four, :five, keyword_init: true) do
def initialize(one:, two:, three:, four:, five:)
end
end
This is because checking the number of arguments of the initialize
method
does not make sense.
Note
|
Explicit block argument &block is not counted to prevent
erroneous change that is avoided by making block argument implicit.
|
This cop also checks for the maximum number of optional parameters.
This can be configured using the MaxOptionalParameters
config option.
Constant Summary
-
MSG =
# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 74'Avoid parameter lists longer than %<max>d parameters. [%<count>d/%<max>d]'
-
NAMED_KEYWORD_TYPES =
private
# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 77%i[kwoptarg kwarg].freeze
-
OPTIONAL_PARAMETERS_MSG =
# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 75'Method has too many optional parameters. [%<count>d/%<max>d]'
::RuboCop::Cop::Base
- Inherited
Class Attribute Summary
::RuboCop::Cop::Base
- Inherited
.gem_requirements, .lint?, | |
.support_autocorrect? | Returns if class supports autocorrect. |
.support_multiple_source? | Override if your cop should be called repeatedly for multiple investigations Between calls to |
Class Method Summary
::RuboCop::Cop::Base
- Inherited
.autocorrect_incompatible_with | List of cops that should not try to autocorrect at the same time as this cop. |
.badge | Naming. |
.callbacks_needed, .cop_name, .department, | |
.documentation_url | Returns a url to view this cops documentation online. |
.exclude_from_registry | Call for abstract Cop classes. |
.inherited, | |
.joining_forces | Override and return the Force class(es) you need to join. |
.match? | Returns true if the cop name or the cop namespace matches any of the given names. |
.new, | |
.requires_gem | Register a version requirement for the given gem name. |
.restrict_on_send |
::RuboCop::ExcludeLimit
- Extended
exclude_limit | Sets up a configuration option to have an exclude limit tracked. |
transform |
Instance Attribute Summary
- #count_keyword_args? ⇒ Boolean readonly private
::RuboCop::Cop::Base
- Inherited
::RuboCop::Cop::AutocorrectLogic
- Included
Instance Method Summary
- #on_args(node)
- #on_def(node) (also: #on_defs)
-
#on_defs(node)
Alias for #on_def.
- #struct_new_or_data_define_block?(node)
- #args_count(node) private
- #argument_to_lambda_or_proc?(node) private
- #max_optional_parameters private
- #max_params private
::RuboCop::Cop::Base
- Inherited
#add_global_offense | Adds an offense that has no particular location. |
#add_offense | Adds an offense on the specified range (or node with an expression) Unless that offense is disabled for this range, a corrector will be yielded to provide the cop the opportunity to autocorrect the offense. |
#begin_investigation | Called before any investigation. |
#callbacks_needed, | |
#cop_config | Configuration Helpers. |
#cop_name, #excluded_file?, | |
#external_dependency_checksum | This method should be overridden when a cop’s behavior depends on state that lives outside of these locations: |
#inspect, | |
#message | Gets called if no message is specified when calling |
#name | Alias for Base#cop_name. |
#offenses, | |
#on_investigation_end | Called after all on_… |
#on_new_investigation | Called before all on_… |
#on_other_file | Called instead of all on_… |
#parse | There should be very limited reasons for a Cop to do it’s own parsing. |
#parser_engine, | |
#ready | Called between investigations. |
#relevant_file?, | |
#target_gem_version | Returns a gems locked versions (i.e. |
#target_rails_version, #target_ruby_version, #annotate, #apply_correction, #attempt_correction, | |
#callback_argument | Reserved for Cop::Cop. |
#complete_investigation | Called to complete an investigation. |
#correct, #current_corrector, | |
#current_offense_locations | Reserved for Commissioner: |
#current_offenses, #currently_disabled_lines, #custom_severity, #default_severity, #disable_uncorrectable, #enabled_line?, #file_name_matches_any?, #find_message, #find_severity, #range_for_original, #range_from_node_or_range, | |
#reset_investigation | Actually private methods. |
#use_corrector |
::RuboCop::Cop::AutocorrectLogic
- Included
#disable_offense, #disable_offense_at_end_of_line, #disable_offense_before_and_after, #disable_offense_with_eol_or_surround_comment, #heredoc_range, #max_line_length, #multiline_ranges, #multiline_string?, | |
#range_by_lines | Expand the given range to include all of any lines it covers. |
#range_of_first_line, #range_overlaps_offense?, #string_continuation?, #surrounding_heredoc?, #surrounding_percent_array? |
::RuboCop::Cop::IgnoredNode
- Included
Constructor Details
This class inherits a constructor from RuboCop::Cop::Base
Instance Attribute Details
#count_keyword_args? ⇒ Boolean
(readonly, private)
[ GitHub ]
# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 141
def count_keyword_args? cop_config['CountKeywordArgs'] end
Instance Method Details
#args_count(node) (private)
[ GitHub ]# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 125
def args_count(node) if count_keyword_args? node.children.count { |a| !a.blockarg_type? } else node.children.count { |a| !NAMED_KEYWORD_TYPES.include?(a.type) && !a.blockarg_type? } end end
#argument_to_lambda_or_proc?(node) (private)
[ GitHub ]# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 121
def_node_matcher :argument_to_lambda_or_proc?, <<~PATTERN ^lambda_or_proc? PATTERN
#max_optional_parameters (private)
[ GitHub ]# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 137
def max_optional_parameters cop_config['MaxOptionalParameters'] end
#max_params (private)
[ GitHub ]# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 133
def max_params cop_config['Max'] end
#on_args(node)
[ GitHub ]# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 104
def on_args(node) parent = node.parent return if parent.method?(:initialize) && struct_new_or_data_define_block?(parent.parent) 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) Also known as: #on_defs
[ GitHub ]# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 90
def on_def(node) optargs = node.arguments.select(&:optarg_type?) return if optargs.count <= max_optional_parameters = format( OPTIONAL_PARAMETERS_MSG, max: max_optional_parameters, count: optargs.count ) add_offense(node, message: ) { self.max_optional_parameters = optargs.count } end
#on_defs(node)
Alias for #on_def.
# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 102
alias on_defs on_def
#struct_new_or_data_define_block?(node)
[ GitHub ]# File 'lib/rubocop/cop/metrics/parameter_lists.rb', line 81
def_node_matcher :struct_new_or_data_define_block?, <<~PATTERN (block { (send (const {nil? cbase} :Struct) :new ...) (send (const {nil? cbase} :Data) :define ...) } (args) ...) PATTERN