class Oga::Ruby::Generator

Class for converting a Ruby AST to a String.

This class takes a {Oga::Ruby::Node} instance and converts it (and its child nodes) to a String that in turn can be passed to `eval` and the likes.

Public Instance Methods

on_and(ast) click to toggle source

Processes a boolean “and” node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 78
def on_and(ast)
  left, right = *ast

  left_str  = process(left)
  right_str = process(right)

  "#{left_str} && #{right_str}"
end
on_assign(ast) click to toggle source

Processes an assignment node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 25
def on_assign(ast)
  var, val = *ast

  var_str = process(var)
  val_str = process(val)

  "#{var_str} = #{val_str}"
end
on_begin(ast) click to toggle source

Processes a `begin` node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 51
      def on_begin(ast)
        body = process(ast.to_a[0])

        <<-EOF
begin
  #{body}
end
        EOF
      end
on_block(ast) click to toggle source

Processes a block node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 173
      def on_block(ast)
        receiver, args, body = *ast

        receiver_str = process(receiver)
        body_str     = body ? process(body) : nil
        arg_strs     = args.map { |arg| process(arg) }

        <<-EOF
#{receiver_str} do |#{arg_strs.join(', ')}|
  #{body_str}
end
        EOF
      end
on_eq(ast) click to toggle source

Processes an equality node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 65
def on_eq(ast)
  left, right = *ast

  left_str  = process(left)
  right_str = process(right)

  "#{left_str} == #{right_str}"
end
on_followed_by(ast) click to toggle source

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 17
def on_followed_by(ast)
  ast.to_a.map { |child| process(child) }.join("\n\n")
end
on_if(ast) click to toggle source

Processes an if statement node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 104
      def on_if(ast)
        cond, body, else_body = *ast

        cond_str = process(cond)
        body_str = process(body)

        if else_body
          else_str = process(else_body)

          <<-EOF
if #{cond_str}
  #{body_str}
else
  #{else_str}
end
          EOF
        else
          <<-EOF
if #{cond_str}
  #{body_str}
end
          EOF
        end
      end
on_lit(ast) click to toggle source

Processes a literal node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 220
def on_lit(ast)
  ast.to_a[0]
end
on_massign(ast) click to toggle source

Processes a mass assignment node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 38
def on_massign(ast)
  vars, val = *ast

  var_names = vars.map { |var| process(var) }
  val_str   = process(val)

  "#{var_names.join(', ')} = #{val_str}"
end
on_or(ast) click to toggle source

Processes a boolean “or” node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 91
def on_or(ast)
  left, right = *ast

  left_str  = process(left)
  right_str = process(right)

  "(#{left_str} || #{right_str})"
end
on_range(ast) click to toggle source

Processes a Range node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 191
def on_range(ast)
  start, stop = *ast

  start_str = process(start)
  stop_str  = process(stop)

  "(#{start_str}..#{stop_str})"
end
on_send(ast) click to toggle source

Processes a method call node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 150
def on_send(ast)
  receiver, name, *args = *ast

  call     = name
  brackets = name == '[]'

  unless args.empty?
    arg_str = args.map { |arg| process(arg) }.join(', ')
    call    = brackets ? "[#{arg_str}]" : "#{call}(#{arg_str})"
  end

  if receiver
    rec_str = process(receiver)
    call    = brackets ? "#{rec_str}#{call}" : "#{rec_str}.#{call}"
  end

  call
end
on_string(ast) click to toggle source

Processes a string node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 204
def on_string(ast)
  ast.to_a[0].inspect
end
on_symbol(ast) click to toggle source

Processes a Symbol node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 212
def on_symbol(ast)
  ast.to_a[0].to_sym.inspect
end
on_while(ast) click to toggle source

Processes a while statement node.

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 133
      def on_while(ast)
        cond, body = *ast

        cond_str = process(cond)
        body_str = process(body)

        <<-EOF
while #{cond_str}
  #{body_str}
end
        EOF
      end
process(ast) click to toggle source

@param [Oga::Ruby::Node] ast @return [String]

# File lib/oga/ruby/generator.rb, line 11
def process(ast)
  send(:"on_#{ast.type}", ast)
end