class RuboCop::Cop::Lint::Void

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

@example CheckForMethodsWithNoSideEffects: false (default)

# bad
def some_method
  some_num * 10
  do_something
end

def some_method(some_var)
  some_var
  do_something
end

@example 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

Constants

BINARY_OPERATORS
DEFINED_MSG
LIT_MSG
NONMUTATING_METHODS
NONMUTATING_MSG
OPERATORS
OP_MSG
SELF_MSG
UNARY_OPERATORS
VAR_MSG
VOID_CONTEXT_TYPES

Public Instance Methods

on_begin(node) click to toggle source
# File lib/rubocop/cop/lint/void.rb, line 72
def on_begin(node)
  check_begin(node)
end
Also aliased as: on_kwbegin
on_block(node) click to toggle source
# File lib/rubocop/cop/lint/void.rb, line 63
def on_block(node)
  return unless node.body && !node.body.begin_type?
  return unless in_void_context?(node.body)

  check_expression(node.body)
end
Also aliased as: on_numblock
on_kwbegin(node)
Alias for: on_begin
on_numblock(node)
Alias for: on_block

Private Instance Methods

check_begin(node) click to toggle source
# File lib/rubocop/cop/lint/void.rb, line 79
def check_begin(node)
  expressions = *node
  expressions.pop unless in_void_context?(node)
  expressions.each { |expr| check_expression(expr) }
end
check_defined(node) click to toggle source
# File lib/rubocop/cop/lint/void.rb, line 120
def check_defined(node)
  return unless node.defined_type?

  add_offense(node, message: format(DEFINED_MSG, defined: node.source))
end
check_expression(expr) click to toggle source
# File lib/rubocop/cop/lint/void.rb, line 85
def check_expression(expr)
  check_void_op(expr)
  check_literal(expr)
  check_var(expr)
  check_self(expr)
  check_defined(expr)
  return unless cop_config['CheckForMethodsWithNoSideEffects']

  check_nonmutating(expr)
end
check_literal(node) click to toggle source
# File lib/rubocop/cop/lint/void.rb, line 108
def check_literal(node)
  return if !node.literal? || node.xstr_type? || node.range_type?

  add_offense(node, message: format(LIT_MSG, lit: node.source))
end
check_nonmutating(node) click to toggle source
# File lib/rubocop/cop/lint/void.rb, line 126
def check_nonmutating(node)
  return unless node.send_type? && NONMUTATING_METHODS.include?(node.method_name)

  add_offense(node, message: format(NONMUTATING_MSG, method: node.method_name))
end
check_self(node) click to toggle source
# File lib/rubocop/cop/lint/void.rb, line 114
def check_self(node)
  return unless node.self_type?

  add_offense(node, message: SELF_MSG)
end
check_var(node) click to toggle source
# File lib/rubocop/cop/lint/void.rb, line 102
def check_var(node)
  return unless node.variable? || node.const_type?

  add_offense(node.loc.name, message: format(VAR_MSG, var: node.loc.name.source))
end
check_void_op(node) click to toggle source
# File lib/rubocop/cop/lint/void.rb, line 96
def check_void_op(node)
  return unless node.send_type? && OPERATORS.include?(node.method_name)

  add_offense(node.loc.selector, message: format(OP_MSG, op: node.method_name))
end
in_void_context?(node) click to toggle source
# File lib/rubocop/cop/lint/void.rb, line 132
def in_void_context?(node)
  parent = node.parent

  return false unless parent && parent.children.last == node

  VOID_CONTEXT_TYPES.include?(parent.type) && parent.void_context?
end