123456789_123456789_123456789_123456789_123456789_

Class: RuboCop::Cop::Style::RedundantArgument

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, ::RuboCop::Cop::AutoCorrector, ::RuboCop::Cop::Base, ::RuboCop::ExcludeLimit, NodePattern::Macros, RuboCop::AST::Sexp
Instance Chain:
Inherits: RuboCop::Cop::Base
Defined in: lib/rubocop/cop/style/redundant_argument.rb

Overview

Checks for a redundant argument passed to certain methods.

Note
This cop is limited to methods with single parameter.

Method names and their redundant arguments can be configured like this:

Methods:
  join: ''
  sum: 0
  split: ' '
  chomp: "\n"
  chomp!: "\n"
  foo: 2

Examples:

# bad
array.join('')
[1, 2, 3].join("")
array.sum(0)
exit(true)
exit!(false)
string.split(" ")
"first\nsecond".split(" ")
string.chomp("\n")
string.chomp!("\n")
A.foo(2)

# good
array.join
[1, 2, 3].join
array.sum
exit
exit!
string.split
"first second".split
string.chomp
string.chomp!
A.foo

Cop Safety Information:

  • This cop is unsafe because of the following limitations:

    1. This cop matches by method names only and hence cannot tell apart methods with same name in different classes.

    2. This cop may be unsafe if certain special global variables (e.g. $;, $/) are set. That depends on the nature of the target methods, of course. For example, the default argument to join is $OUTPUT_FIELD_SEPARATOR (or $,) rather than '', and if that global is changed, '' is no longer a redundant argument.

Constant Summary

::RuboCop::Cop::Base - Inherited

EMPTY_OFFENSES, RESTRICT_ON_SEND

::RuboCop::Cop::RangeHelp - Included

BYTE_ORDER_MARK, NOT_GIVEN

Class Attribute Summary

::RuboCop::Cop::AutoCorrector - Extended

::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 on_new_investigation and on_investigation_end, the result of processed_source will remain constant.

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

Instance Method Summary

::RuboCop::Cop::RangeHelp - Included

#add_range, #column_offset_between,
#contents_range

A range containing only the contents of a literal with delimiters (e.g.

#directions,
#effective_column

Returns the column attribute of the range, except if the range is on the first line and there’s a byte order mark at the beginning of that line, in which case 1 is subtracted from the column value.

#final_pos, #move_pos, #move_pos_str, #range_between, #range_by_whole_lines, #range_with_comments, #range_with_comments_and_lines, #range_with_surrounding_comma, #range_with_surrounding_space, #source_range

::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 add_offense or add_global_offense Cops are discouraged to override this; instead pass your message directly.

#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_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

::RuboCop::Cop::IgnoredNode - Included

Constructor Details

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

Instance Method Details

#argument_matched?(target_argument, redundant_argument) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/style/redundant_argument.rb', line 108

def argument_matched?(target_argument, redundant_argument)
  argument = if target_argument.is_a?(AST::Node)
               target_argument.source
             elsif exclude_cntrl_character?(target_argument, redundant_argument)
               target_argument.inspect
             else
               target_argument.to_s
             end

  argument == redundant_argument
end

#argument_range(node) (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/style/redundant_argument.rb', line 100

def argument_range(node)
  if node.parenthesized?
    range_between(node.loc.begin.begin_pos, node.loc.end.end_pos)
  else
    range_with_surrounding_space(node.first_argument.source_range, newlines: false)
  end
end

#exclude_cntrl_character?(target_argument, redundant_argument) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/style/redundant_argument.rb', line 120

def exclude_cntrl_character?(target_argument, redundant_argument)
  return true unless (target_argument_string = target_argument.to_s).valid_encoding?

  !target_argument_string.sub(/\A'/, '"').sub(/'\z/, '"').match?(/[[:cntrl:]]/) ||
    !redundant_argument.match?(/[[:cntrl:]]/)
end

#on_csend(node)

Alias for #on_send.

[ GitHub ]

  
# File 'lib/rubocop/cop/style/redundant_argument.rb', line 76

alias on_csend on_send

#on_send(node) Also known as: #on_csend

[ GitHub ]

  
# File 'lib/rubocop/cop/style/redundant_argument.rb', line 64

def on_send(node)
  return if !NO_RECEIVER_METHODS.include?(node.method_name) && node.receiver.nil?
  return if node.arguments.count != 1
  return unless redundant_argument?(node)

  offense_range = argument_range(node)
  message = format(MSG, arg: node.first_argument.source)

  add_offense(offense_range, message: message) do |corrector|
    corrector.remove(offense_range)
  end
end

#redundant_arg_for_method(method_name) (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/style/redundant_argument.rb', line 93

def redundant_arg_for_method(method_name)
  arg = cop_config['Methods'].fetch(method_name) { return }

  @mem ||= {}
  @mem[method_name] ||= arg.inspect
end

#redundant_argument?(node) ⇒ Boolean (private)

[ GitHub ]

  
# File 'lib/rubocop/cop/style/redundant_argument.rb', line 80

def redundant_argument?(node)
  redundant_argument = redundant_arg_for_method(node.method_name.to_s)
  return false if redundant_argument.nil?

  target_argument = if node.first_argument.respond_to?(:value)
                      node.first_argument.value
                    else
                      node.first_argument
                    end

  argument_matched?(target_argument, redundant_argument)
end