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:

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
VOID_CONTEXT_TYPES =
%i[def for block].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, autocorrect_incompatible_with, badge, #begin_investigation, 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, #inspect, 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?, #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



92
93
94
# File 'lib/rubocop/cop/lint/void.rb', line 92

def on_begin(node)
  check_begin(node)
end

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



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

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