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]


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



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

def on_begin(node)
  check_begin(node)
end

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



81
82
83
84
85
86
87
# File 'lib/rubocop/cop/lint/void.rb', line 81

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



95
96
97
# File 'lib/rubocop/cop/lint/void.rb', line 95

def on_ensure(node)
  check_ensure(node)
end