Parent

Files

Class/Module Index [+]

Quicksearch

RuboCop::Cop::Lint::UselessSetterCall::MethodVariableTracker

This class tracks variable assignments in a method body and if a variable contains object passed as argument at the end of the method.

Public Class Methods

new(args_node, body_node) click to toggle source
# File lib/rubocop/cop/lint/useless_setter_call.rb, line 56
def initialize(args_node, body_node)
  @args_node = args_node
  @body_node = body_node
end

Public Instance Methods

contain_object_passed_as_argument?(variable_name) click to toggle source
# File lib/rubocop/cop/lint/useless_setter_call.rb, line 61
def contain_object_passed_as_argument?(variable_name)
  return @table[variable_name] if @table

  @table = {}

  @args_node.children.each do |arg_node|
    arg_name, = *arg_node
    @table[arg_name] = true
  end

  scan(@body_node) do |node|
    case node.type
    when :masgn
      process_multiple_assignment(node)
    when :or_asgn, :and_asgn
      process_logical_operator_assignment(node)
    when :op_asgn
      process_binary_operator_assignment(node)
    when *ASSIGNMENT_TYPES
      _, rhs_node = *node
      process_assignment(node, rhs_node)
    end
  end

  @table[variable_name]
end
process_assignment(asgn_node, rhs_node) click to toggle source
# File lib/rubocop/cop/lint/useless_setter_call.rb, line 135
def process_assignment(asgn_node, rhs_node)
  lhs_variable_name, = *asgn_node

  if [:lvar, :ivar, :cvar, :gvar].include?(rhs_node.type)
    rhs_variable_name, = *rhs_node
    @table[lhs_variable_name] = @table[rhs_variable_name]
  else
    @table[lhs_variable_name] = false
  end
end
process_binary_operator_assignment(op_asgn_node) click to toggle source
# File lib/rubocop/cop/lint/useless_setter_call.rb, line 126
def process_binary_operator_assignment(op_asgn_node)
  lhs_node, = *op_asgn_node
  return unless ASSIGNMENT_TYPES.include?(lhs_node.type)
  lhs_variable_name, = *lhs_node
  @table[lhs_variable_name] = false

  throw :skip_children
end
process_logical_operator_assignment(asgn_node) click to toggle source
# File lib/rubocop/cop/lint/useless_setter_call.rb, line 118
def process_logical_operator_assignment(asgn_node)
  lhs_node, rhs_node = *asgn_node
  return unless ASSIGNMENT_TYPES.include?(lhs_node.type)
  process_assignment(lhs_node, rhs_node)

  throw :skip_children
end
process_multiple_assignment(masgn_node) click to toggle source
# File lib/rubocop/cop/lint/useless_setter_call.rb, line 99
def process_multiple_assignment(masgn_node)
  mlhs_node, mrhs_node = *masgn_node

  mlhs_node.children.each_with_index do |lhs_node, index|
    next unless ASSIGNMENT_TYPES.include?(lhs_node.type)

    lhs_variable_name, = *lhs_node
    rhs_node = mrhs_node.children[index]

    if mrhs_node.type == :array && rhs_node
      process_assignment(lhs_variable_name, rhs_node)
    else
      @table[lhs_variable_name] = false
    end
  end

  throw :skip_children
end
scan(node, &block) click to toggle source
# File lib/rubocop/cop/lint/useless_setter_call.rb, line 88
def scan(node, &block)
  catch(:skip_children) do
    yield node

    node.children.each do |child|
      next unless child.is_a?(Parser::AST::Node)
      scan(child, &block)
    end
  end
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.