Class: Riml::AST_Rewriter::DefaultParamToIfNode
- Inherits:
-
Riml::AST_Rewriter
- Object
- Riml::AST_Rewriter
- Riml::AST_Rewriter::DefaultParamToIfNode
- 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
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 |