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