class RuboCop::Cop::Lint::Void

This cop checks for operators, variables, literals, and nonmutating methods used in void context.

@example

# bad

def some_method
  some_num * 10
  do_something
end

@example

# bad

def some_method(some_var)
  some_var
  do_something
end

@example

# bad, when CheckForMethodsWithNoSideEffects is set true

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

@example

# good

def some_method
  do_something
  some_num * 10
end

@example

# good

def some_method(some_var)
  do_something
  some_var
end

@example

# good, when CheckForMethodsWithNoSideEffects is set true

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 90
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 83
def on_block(node)
  return unless node.body && !node.body.begin_type?
  return unless in_void_context?(node.body)

  check_expression(node.body)
end
on_kwbegin(node)
Alias for: on_begin

Private Instance Methods

check_begin(node) click to toggle source
# File lib/rubocop/cop/lint/void.rb, line 97
def check_begin(node)
  expressions = *node
  expressions.pop unless in_void_context?(node)
  expressions.each do |expr|
    check_expression(expr)
  end
end
check_defined(node) click to toggle source
# File lib/rubocop/cop/lint/void.rb, line 144
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 105
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 132
def check_literal(node)
  return if !node.literal? || node.xstr_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 150
def check_nonmutating(node)
  unless node.send_type? &&
         NONMUTATING_METHODS.include?(node.method_name)
    return
  end

  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 138
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 124
def check_var(node)
  return unless node.variable? || node.const_type?

  add_offense(node,
              location: :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 116
def check_void_op(node)
  return unless node.send_type? && OPERATORS.include?(node.method_name)

  add_offense(node,
              location: :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 160
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