module RipperRubyParser::SexpHandlers::Assignment

Sexp handlers for assignments

Constants

ASSIGNMENT_IN_METHOD_SUB_TYPE_MAP
ASSIGNMENT_SUB_TYPE_MAP
OPERATOR_ASSIGNMENT_MAP

Public Instance Methods

process_assign(exp) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 7
def process_assign(exp)
  _, lvalue, value = exp.shift 3

  lvalue = process(lvalue)
  value = process(value)

  case value.sexp_type
  when :mrhs
    value.sexp_type = :svalue
  when :args
    value = s(:svalue, s(:array, *value.sexp_body))
  else
    value = unwrap_begin(value)
  end

  with_line_number(lvalue.line,
                   create_regular_assignment_sub_type(lvalue, value))
end
process_massign(exp) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 26
def process_massign(exp)
  _, left, right = exp.shift 3

  left = process(left).last
  right = process(right)

  case right.sexp_type
  when :args
    right.sexp_type = :array
  when :mrhs
    _, right = right
  else
    right = s(:to_ary, unwrap_begin(right))
  end

  s(:masgn, left, right)
end
process_mlhs(exp) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 88
def process_mlhs(exp)
  _, *rest = shift_all exp

  items = map_process_list(rest)
  s(:masgn, s(:array, *create_multiple_assignment_sub_types(items)))
end
process_mlhs_add_post(exp) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 70
def process_mlhs_add_post(exp)
  _, base, rest = exp.shift 3
  base = process(base)
  rest = process(rest)
  base.last.push(*rest.last.sexp_body)
  base
end
process_mlhs_add_star(exp) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 55
def process_mlhs_add_star(exp)
  _, base, splatarg = exp.shift 3
  masgn = process base

  splat = process(splatarg)
  splat_item = if splat.nil?
                 s(:splat)
               else
                 s(:splat, create_valueless_assignment_sub_type(splat))
               end

  masgn.last << splat_item
  masgn
end
process_mlhs_paren(exp) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 78
def process_mlhs_paren(exp)
  _, contents = exp.shift 2

  if contents.sexp_type == :mlhs_paren
    s(:masgn, s(:array, process(contents)))
  else
    process(contents)
  end
end
process_mrhs_add_star(exp) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 51
def process_mrhs_add_star(exp)
  generic_add_star exp
end
process_mrhs_new_from_args(exp) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 44
def process_mrhs_new_from_args(exp)
  _, inner, last = exp.shift 3
  process(inner).tap do |result|
    result.push process(last) if last
  end
end
process_opassign(exp) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 95
def process_opassign(exp)
  _, lvalue, (_, operator,), value = exp.shift 4

  lvalue = process(lvalue)
  value = process(value)
  operator = operator.chop.to_sym

  create_operator_assignment_sub_type lvalue, value, operator
end

Private Instance Methods

create_assignment_sub_type(lvalue, value) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 177
def create_assignment_sub_type(lvalue, value)
  lvalue_type, lvalue_value = lvalue
  s(map_assignment_lvalue_type(lvalue_type), lvalue_value, value)
end
create_multiple_assignment_sub_types(sexp_list) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 107
def create_multiple_assignment_sub_types(sexp_list)
  sexp_list.map! do |item|
    create_valueless_assignment_sub_type item
  end
end
create_operator_assignment_sub_type(lvalue, value, operator) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 125
def create_operator_assignment_sub_type(lvalue, value, operator)
  case lvalue.sexp_type
  when :aref_field
    _, arr, arglist = lvalue
    arglist.sexp_type = :arglist
    s(:op_asgn1, arr, arglist, operator, value)
  when :field
    _, obj, _, (_, field) = lvalue
    s(:op_asgn2, obj, :"#{field}=", operator, value)
  else
    value = unwrap_begin(value)
    if (mapped = OPERATOR_ASSIGNMENT_MAP[operator])
      s(mapped, lvalue, create_assignment_sub_type(lvalue, value))
    else
      operator_call = s(:call, lvalue, operator, value)
      create_assignment_sub_type lvalue, operator_call
    end
  end
end
create_regular_assignment_sub_type(lvalue, value) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 145
def create_regular_assignment_sub_type(lvalue, value)
  case lvalue.sexp_type
  when :aref_field
    _, arr, arglist = lvalue
    arglist << value
    arglist.shift
    s(:attrasgn, arr, :[]=, *arglist)
  when :field
    _, obj, call_op, (_, field) = lvalue
    case call_op
    when :"&.", s(:op, :"&.") # Handle both 2.5 and 2.6 style ops
      s(:safe_attrasgn, obj, :"#{field}=", value)
    else
      s(:attrasgn, obj, :"#{field}=", value)
    end
  else
    create_assignment_sub_type lvalue, value
  end
end
create_valueless_assignment_sub_type(item) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 113
def create_valueless_assignment_sub_type(item)
  item = with_line_number(item.line,
                          create_regular_assignment_sub_type(item, nil))
  item.pop
  item
end
map_assignment_lvalue_type(type) click to toggle source
# File lib/ripper_ruby_parser/sexp_handlers/assignment.rb, line 182
def map_assignment_lvalue_type(type)
  @in_method_body && ASSIGNMENT_IN_METHOD_SUB_TYPE_MAP[type] ||
    ASSIGNMENT_SUB_TYPE_MAP[type] ||
    type
end