Class: Riml::AST_Rewriter::DefaultParamToIfNode

Inherits:
Riml::AST_Rewriter show all
Defined in:
lib/ast_rewriter.rb

Constant Summary

Constants included from Constants

Constants::BUILTIN_COMMANDS, Constants::BUILTIN_FUNCTIONS, Constants::COMPARISON_OPERATORS, Constants::DEFINE_KEYWORDS, Constants::END_KEYWORDS, Constants::IGNORECASE_CAPABLE_OPERATORS, Constants::KEYWORDS, Constants::REGISTERS, Constants::RIML_COMMANDS, Constants::RIML_END_KEYWORDS, Constants::RIML_KEYWORDS, Constants::SPECIAL_VARIABLE_PREFIXES, Constants::SPLAT_LITERAL, Constants::VIML_COMMANDS, Constants::VIML_END_KEYWORDS, Constants::VIML_KEYWORDS

Instance Attribute Summary

Attributes inherited from Riml::AST_Rewriter

#ast, #classes, #rewritten_included_and_sourced_files

Instance Method Summary collapse

Methods inherited from Riml::AST_Rewriter

#add_SID_function!, #add_SID_function?, #do_establish_parents, #do_rewrite_on_match, #establish_parents, #initialize, #recursive?, #rewrite, #rewrite_included_and_sourced_files!, #rewrite_on_match

Constructor Details

This class inherits a constructor from Riml::AST_Rewriter

Instance Method Details

#construct_if_expression(node) ⇒ Object



590
591
592
593
594
595
596
597
598
599
600
601
602
# File 'lib/ast_rewriter.rb', line 590

def construct_if_expression(node)
  get_splat_node = CallNode.new(nil, 'get', [ GetVariableNode.new('a:', '000'), NumberNode.new(0), StringNode.new('rimldefault', :s) ])
  condition_node = BinaryOperatorNode.new('!=#', [ get_splat_node, StringNode.new('rimldefault', :s) ])
  remove_from_splat_node = CallNode.new(nil, 'remove', [ GetVariableNode.new('a:', '000'), 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

#match?(node) ⇒ Boolean

Returns:

  • (Boolean)


561
562
563
# File 'lib/ast_rewriter.rb', line 561

def match?(node)
  DefaultParamNode === node
end

#replace(node) ⇒ Object



565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
# File 'lib/ast_rewriter.rb', line 565

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
      raise UserArgumentError, "can't have regular parameter after default parameter in function #{def_node.name.inspect}"
    end
  end

  if_expression = construct_if_expression(node)

  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.insert(insert_idx, if_expression)
  reestablish_parents(def_node)
end