class Riml::AST_Rewriter::DefaultParamToIfNode

Public Instance Methods

match?(node) click to toggle source
# File lib/riml/ast_rewriter.rb, line 899
def match?(node)
  DefaultParamNode === node
end
replace(node) click to toggle source
# File lib/riml/ast_rewriter.rb, line 903
def replace(node)
  def_node = node.parent
  param_idx = def_node.parameters.index(node)
  first_default_param = def_node.parameters.detect(&DefNode::DEFAULT_PARAMS)
  first_default_param_idx = def_node.parameters.index(first_default_param)

  last_default_param = def_node.parameters.reverse.detect(&DefNode::DEFAULT_PARAMS)
  insert_idx = param_idx - first_default_param_idx

  while param = def_node.parameters[param_idx += 1]
    unless param == def_node.splat || DefaultParamNode === param
      error_msg = "can't have regular parameter after default parameter in function #{def_node.name.inspect}"
      error = UserArgumentError.new(error_msg, def_node)
      raise error
    end
  end

  if_expression = construct_if_expression(node)
  if insert_idx.zero?
    def_node.expressions.nodes.unshift(construct_copy_splat_var_assignment)
    SplatVarToCopiedSplatVar.new(def_node, classes).rewrite_on_match
  end

  if last_default_param == node
    def_node.parameters.delete_if(&DefNode::DEFAULT_PARAMS)
    def_node.parameters << SPLAT_LITERAL unless def_node.splat
  end
  def_node.expressions.nodes.insert(insert_idx + 1, if_expression)
  reestablish_parents(def_node)
end

Private Instance Methods

construct_copy_splat_var_assignment() click to toggle source
# File lib/riml/ast_rewriter.rb, line 951
def construct_copy_splat_var_assignment
  AssignNode.new('=', GetVariableNode.new('', '__splat_var_cpy'), CallNode.new('', 'copy', [GetVariableNode.new('a:', '000')]))
end
construct_if_expression(node) click to toggle source
# File lib/riml/ast_rewriter.rb, line 936
def construct_if_expression(node)
  condition_node = UnaryOperatorNode.new('!', [
    CallNode.new(nil, 'empty', [ GetVariableNode.new('', '__splat_var_cpy') ])
  ])
  remove_from_splat_node = CallNode.new(nil, 'remove', [ GetVariableNode.new('', '__splat_var_cpy'), NumberNode.new(0) ])
  IfNode.new(condition_node,
    Nodes.new([
      AssignNode.new('=', GetVariableNode.new(nil, node.parameter), remove_from_splat_node),
    ElseNode.new(Nodes.new([
      AssignNode.new('=', GetVariableNode.new(nil, node.parameter), node.expression)
    ]))
    ])
  )
end