Class: RuboCop::Cop::Lint::Void

Inherits:
Base
  • Object
show all
Extended by:
AutoCorrector
Includes:
RangeHelp
Defined in:
lib/rubocop/cop/lint/void.rb

Overview

Checks for operators, variables, literals, lambda, proc and nonmutating methods used in void context.

‘each` blocks are allowed to prevent false positives. For example, the expression inside the `each` block below. It’s not void, especially when the receiver is an ‘Enumerator`:

source,ruby

enumerator = [1, 2, 3].filter enumerator.each { |item| item >= 2 } #=> [2, 3]


NOTE: Return values in assignment method definitions such as ‘def foo=(arg)` are detected because they are in a void context. However, autocorrection does not remove the return value, as that would change behavior. In such cases, whether to remove the return value or rename the method to something more appropriate should be left to the user.

Examples:

CheckForMethodsWithNoSideEffects: false (default)

# bad
def some_method
  some_num * 10
  do_something
end

def some_method(some_var)
  some_var
  do_something
end

CheckForMethodsWithNoSideEffects: true

# bad
def some_method(some_array)
  some_array.sort
  do_something(some_array)
end

# good
def some_method
  do_something
  some_num * 10
end

def some_method(some_var)
  do_something
  some_var
end

def some_method(some_array)
  some_array.sort!
  do_something(some_array)
end

Constant Summary collapse

OP_MSG =
'Operator `%<op>s` used in void context.'
VAR_MSG =
'Variable `%<var>s` used in void context.'
CONST_MSG =
'Constant `%<var>s` used in void context.'
LIT_MSG =
'Literal `%<lit>s` used in void context.'
SELF_MSG =
'`self` used in void context.'
EXPRESSION_MSG =
'`%<expression>s` used in void context.'
NONMUTATING_MSG =
'Method `#%<method>s` used in void context. Did you mean `#%<suggest>s`?'
BINARY_OPERATORS =
%i[* / % + - == === != < > <= >= <=>].freeze
UNARY_OPERATORS =
%i[+@ -@ ~ !].freeze
OPERATORS =
(BINARY_OPERATORS + UNARY_OPERATORS).freeze
NONMUTATING_METHODS_WITH_BANG_VERSION =
%i[capitalize chomp chop compact
delete_prefix delete_suffix downcase
encode flatten gsub lstrip merge next
reject reverse rotate rstrip scrub select
shuffle slice sort sort_by squeeze strip sub
succ swapcase tr tr_s transform_values
unicode_normalize uniq upcase].freeze
METHODS_REPLACEABLE_BY_EACH =
%i[collect map].freeze
NONMUTATING_METHODS =
(NONMUTATING_METHODS_WITH_BANG_VERSION +
METHODS_REPLACEABLE_BY_EACH).freeze

Constants included from RangeHelp

RangeHelp::BYTE_ORDER_MARK, RangeHelp::NOT_GIVEN

Constants inherited from Base

Base::RESTRICT_ON_SEND

Instance Attribute Summary

Attributes inherited from Base

#config, #processed_source

Instance Method Summary collapse

Methods included from AutoCorrector

support_autocorrect?

Methods inherited from Base

#active_support_extensions_enabled?, #add_global_offense, #add_offense, #always_autocorrect?, autocorrect_incompatible_with, badge, #begin_investigation, #callbacks_needed, callbacks_needed, #config_to_allow_offenses, #config_to_allow_offenses=, #contextual_autocorrect?, #cop_config, #cop_name, cop_name, department, documentation_url, exclude_from_registry, #excluded_file?, #external_dependency_checksum, inherited, #initialize, #inspect, joining_forces, lint?, match?, #message, #offenses, #on_investigation_end, #on_new_investigation, #on_other_file, #parse, #parser_engine, #ready, #relevant_file?, requires_gem, #string_literals_frozen_by_default?, support_autocorrect?, support_multiple_source?, #target_gem_version, #target_rails_version, #target_ruby_version

Methods included from ExcludeLimit

#exclude_limit

Methods included from AutocorrectLogic

#autocorrect?, #autocorrect_enabled?, #autocorrect_requested?, #autocorrect_with_disable_uncorrectable?, #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_begin(node) ⇒ Object Also known as: on_kwbegin



97
98
99
# File 'lib/rubocop/cop/lint/void.rb', line 97

def on_begin(node)
  check_begin(node)
end

#on_block(node) ⇒ Object Also known as: on_numblock, on_itblock



87
88
89
90
91
92
93
# File 'lib/rubocop/cop/lint/void.rb', line 87

def on_block(node)
  return unless node.body && !node.body.begin_type?
  return unless in_void_context?(node.body)

  check_void_op(node.body) { node.method?(:each) }
  check_expression(node.body)
end

#on_ensure(node) ⇒ Object



102
103
104
# File 'lib/rubocop/cop/lint/void.rb', line 102

def on_ensure(node)
  check_ensure(node)
end