Class: Oga::Ruby::Generator
- Inherits:
-
Object
- Object
- Oga::Ruby::Generator
- Defined in:
- lib/oga/ruby/generator.rb
Overview
Class for converting a Ruby AST to a String.
This class takes a Node instance and converts it (and its
child nodes) to a String that in turn can be passed to eval
and the
likes.
Instance Method Summary collapse
-
#on_and(ast) ⇒ String
Processes a boolean “and” node.
-
#on_assign(ast) ⇒ String
Processes an assignment node.
-
#on_begin(ast) ⇒ String
Processes a
begin
node. -
#on_block(ast) ⇒ String
Processes a block node.
-
#on_eq(ast) ⇒ String
Processes an equality node.
-
#on_followed_by(ast) ⇒ String
-
#on_if(ast) ⇒ String
Processes an if statement node.
-
#on_lit(ast) ⇒ String
Processes a literal node.
-
#on_massign(ast) ⇒ String
Processes a mass assignment node.
-
#on_or(ast) ⇒ String
Processes a boolean “or” node.
-
#on_range(ast) ⇒ String
Processes a Range node.
-
#on_send(ast) ⇒ String
Processes a method call node.
-
#on_string(ast) ⇒ String
Processes a string node.
-
#on_symbol(ast) ⇒ String
Processes a Symbol node.
-
#on_while(ast) ⇒ String
Processes a while statement node.
-
#process(ast) ⇒ String
Instance Method Details
#on_and(ast) ⇒ String
Processes a boolean “and” node.
78 79 80 81 82 83 84 85 |
# 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) ⇒ String
Processes an assignment node.
25 26 27 28 29 30 31 32 |
# 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) ⇒ String
Processes a begin
node.
51 52 53 54 55 56 57 58 59 |
# 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) ⇒ String
Processes a block node.
173 174 175 176 177 178 179 180 181 182 183 184 185 |
# 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) ⇒ String
Processes an equality node.
65 66 67 68 69 70 71 72 |
# 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) ⇒ String
17 18 19 |
# 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) ⇒ String
Processes an if statement node.
104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# 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) ⇒ String
Processes a literal node.
220 221 222 |
# File 'lib/oga/ruby/generator.rb', line 220 def on_lit(ast) ast.to_a[0] end |
#on_massign(ast) ⇒ String
Processes a mass assignment node.
38 39 40 41 42 43 44 45 |
# 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) ⇒ String
Processes a boolean “or” node.
91 92 93 94 95 96 97 98 |
# 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) ⇒ String
Processes a Range node.
191 192 193 194 195 196 197 198 |
# 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) ⇒ String
Processes a method call node.
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 |
# 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) ⇒ String
Processes a string node.
204 205 206 |
# File 'lib/oga/ruby/generator.rb', line 204 def on_string(ast) ast.to_a[0].inspect end |
#on_symbol(ast) ⇒ String
Processes a Symbol node.
212 213 214 |
# File 'lib/oga/ruby/generator.rb', line 212 def on_symbol(ast) ast.to_a[0].to_sym.inspect end |
#on_while(ast) ⇒ String
Processes a while statement node.
133 134 135 136 137 138 139 140 141 142 143 144 |
# 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) ⇒ String
11 12 13 |
# File 'lib/oga/ruby/generator.rb', line 11 def process(ast) send(:"on_#{ast.type}", ast) end |