class RedParse::Node

Public Instance Methods

replace_flow_control(replacer) click to toggle source
# File lib/macro/node.rb, line 21
def replace_flow_control(replacer)
  fail "retry is hard! & changes semantics in ruby 1.9" if replacer[:retry]
  return_yield={}
  return_yield[:return]=replacer[:return] if replacer[:return]
  return_yield[:yield]=replacer[:yield] if replacer[:yield]
  walk{|parent,i,j,node|
    case node
    when KWCallNode
      if action=replacer[node.name.to_sym]
        newnode=action[*node.params]
        if j
          parent[i][j]=newnode
        else
          parent[i]=newnode
        end
      end
      true
    when LoopNode, UntilOpNode, WhileOpNode
      #nested loops hide break/next/redo
      node.condition.replace_flow_control(replacer)
      node.body.replace_flow_control(return_yield) if node.body and !return_yield.empty?
      false
    when MethodNode,ClassNode,ModuleNode,MetaClassNode
      node.receiver.replace_flow_control(replacer) if node.receiver
      #but not in body, rescues, else, ensure
      false
    when CallNode
      node.receiver.replace_flow_control(replacer) if node.receiver
      node.params.each{|param| param.replace_flow_control(replacer) } if node.params
      #but only return/yield in block or blockparams
      unless return_yield.empty?
        node.blockparams.each{|bparam| bparam.replace_flow_control(return_yield) } if node.blockparams
        node.block.replace_flow_control(return_yield) if node.block
      end
      false
    when Macro::FormNode
      #should really recurse in corresponding form escapes....
      false
    else true
    end
  }
end