class RuboCop::Cop::Lint::UselessSetterCall::MethodVariableTracker
the method.
and if a variable contains object passed as argument at the end of
This class tracks variable assignments in a method body
def constructor?(node)
def constructor?(node) return true if node.literal? return false unless node.send_type? node.method?(:new) end
def contain_local_object?(variable_name)
def contain_local_object?(variable_name) return @local[variable_name] if @local @local = {} scan(@body_node) { |node| process_assignment_node(node) } @local[variable_name] end
def initialize(body_node)
def initialize(body_node) @body_node = body_node @local = nil end
def process_assignment(asgn_node, rhs_node)
def process_assignment(asgn_node, rhs_node) lhs_variable_name, = *asgn_node @local[lhs_variable_name] = if rhs_node.variable? rhs_variable_name, = *rhs_node @local[rhs_variable_name] else constructor?(rhs_node) end end
def process_assignment_node(node)
def process_assignment_node(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) if rhs_node end end
def process_binary_operator_assignment(op_asgn_node)
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 @local[lhs_variable_name] = true throw :skip_children end
def process_logical_operator_assignment(asgn_node)
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
def process_multiple_assignment(masgn_node)
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.array_type? && rhs_node process_assignment(lhs_variable_name, rhs_node) else @local[lhs_variable_name] = true end end throw :skip_children end
def scan(node, &block)
def scan(node, &block) catch(:skip_children) do yield node node.each_child_node { |child_node| scan(child_node, &block) } end end