to_source 0.1.3 → 0.2.16
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +6 -6
- data/.rspec +1 -0
- data/.travis.yml +12 -1
- data/Changelog.md +115 -0
- data/Gemfile +5 -3
- data/Gemfile.devtools +67 -0
- data/Guardfile +18 -0
- data/LICENSE +21 -0
- data/README.md +52 -0
- data/Rakefile +3 -8
- data/TODO +9 -0
- data/bin/to_source +17 -0
- data/config/flay.yml +3 -0
- data/config/flog.yml +2 -0
- data/config/roodi.yml +26 -0
- data/config/site.reek +97 -0
- data/config/yardstick.yml +2 -0
- data/lib/to_source/command.rb +106 -0
- data/lib/to_source/emitter/access.rb +28 -0
- data/lib/to_source/emitter/actual_arguments.rb +89 -0
- data/lib/to_source/emitter/alias.rb +27 -0
- data/lib/to_source/emitter/assignment.rb +119 -0
- data/lib/to_source/emitter/attribute_assignment.rb +28 -0
- data/lib/to_source/emitter/begin.rb +71 -0
- data/lib/to_source/emitter/binary_operator.rb +63 -0
- data/lib/to_source/emitter/binary_operator_method.rb +58 -0
- data/lib/to_source/emitter/block.rb +29 -0
- data/lib/to_source/emitter/block_argument.rb +23 -0
- data/lib/to_source/emitter/block_pass.rb +23 -0
- data/lib/to_source/emitter/case.rb +85 -0
- data/lib/to_source/emitter/class.rb +44 -0
- data/lib/to_source/emitter/concat_arguments.rb +28 -0
- data/lib/to_source/emitter/default_arguments.rb +22 -0
- data/lib/to_source/emitter/define.rb +99 -0
- data/lib/to_source/emitter/defined.rb +24 -0
- data/lib/to_source/emitter/element_assignment.rb +29 -0
- data/lib/to_source/emitter/element_reference.rb +25 -0
- data/lib/to_source/emitter/empty_body.rb +21 -0
- data/lib/to_source/emitter/ensure.rb +50 -0
- data/lib/to_source/emitter/ensure_body.rb +27 -0
- data/lib/to_source/emitter/execute_string.rb +22 -0
- data/lib/to_source/emitter/formal_arguments.rb +212 -0
- data/lib/to_source/emitter/if.rb +96 -0
- data/lib/to_source/emitter/iter.rb +27 -0
- data/lib/to_source/emitter/keyword_value.rb +67 -0
- data/lib/to_source/emitter/literal/dynamic.rb +178 -0
- data/lib/to_source/emitter/literal.rb +232 -0
- data/lib/to_source/emitter/loop.rb +40 -0
- data/lib/to_source/emitter/match3.rb +25 -0
- data/lib/to_source/emitter/module.rb +28 -0
- data/lib/to_source/emitter/multiple_assignment.rb +49 -0
- data/lib/to_source/emitter/nth_ref.rb +22 -0
- data/lib/to_source/emitter/op_assign1.rb +27 -0
- data/lib/to_source/emitter/op_assign2.rb +27 -0
- data/lib/to_source/emitter/pattern_arguments.rb +24 -0
- data/lib/to_source/emitter/rescue.rb +28 -0
- data/lib/to_source/emitter/rescue_condition.rb +93 -0
- data/lib/to_source/emitter/scope.rb +24 -0
- data/lib/to_source/emitter/scope_name.rb +23 -0
- data/lib/to_source/emitter/scoped_name.rb +28 -0
- data/lib/to_source/emitter/send.rb +133 -0
- data/lib/to_source/emitter/send_with_arguments.rb +103 -0
- data/lib/to_source/emitter/singleton_class.rb +38 -0
- data/lib/to_source/emitter/splat.rb +24 -0
- data/lib/to_source/emitter/splat_when.rb +23 -0
- data/lib/to_source/emitter/static.rb +52 -0
- data/lib/to_source/emitter/super.rb +92 -0
- data/lib/to_source/emitter/to_array.rb +22 -0
- data/lib/to_source/emitter/to_string.rb +24 -0
- data/lib/to_source/emitter/toplevel.rb +24 -0
- data/lib/to_source/emitter/unary_operator_method.rb +27 -0
- data/lib/to_source/emitter/unless.rb +45 -0
- data/lib/to_source/emitter/util.rb +28 -0
- data/lib/to_source/emitter/when.rb +63 -0
- data/lib/to_source/emitter/yield.rb +28 -0
- data/lib/to_source/emitter/z_super.rb +24 -0
- data/lib/to_source/emitter.rb +278 -0
- data/lib/to_source/state.rb +144 -0
- data/lib/to_source.rb +78 -11
- data/spec/spec_helper.rb +11 -0
- data/spec/unit/to_source/class_methods/run_spec.rb +1254 -0
- data/to_source.gemspec +16 -14
- metadata +160 -20
- data/.rvmrc +0 -1
- data/Readme.md +0 -38
- data/lib/to_source/core_ext/node.rb +0 -22
- data/lib/to_source/version.rb +0 -3
- data/lib/to_source/visitor.rb +0 -377
- data/test/to_source/visitor_test.rb +0 -202
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
class Literal
|
|
4
|
+
# Base class for dynamic literal emitters
|
|
5
|
+
class Dynamic < self
|
|
6
|
+
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
# Perform dispatch
|
|
10
|
+
#
|
|
11
|
+
# @return [undefined]
|
|
12
|
+
#
|
|
13
|
+
# @api private
|
|
14
|
+
#
|
|
15
|
+
def dispatch
|
|
16
|
+
emit_open
|
|
17
|
+
emit_first
|
|
18
|
+
emit_segments
|
|
19
|
+
emit_close
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Emit open
|
|
23
|
+
#
|
|
24
|
+
# @return [undefined]
|
|
25
|
+
#
|
|
26
|
+
# @api private
|
|
27
|
+
#
|
|
28
|
+
def emit_open
|
|
29
|
+
emit(self.class::OPEN)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Emit close
|
|
33
|
+
#
|
|
34
|
+
# @return [undefined]
|
|
35
|
+
#
|
|
36
|
+
# @api private
|
|
37
|
+
#
|
|
38
|
+
def emit_close
|
|
39
|
+
emit(self.class::CLOSE)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Return first value
|
|
43
|
+
#
|
|
44
|
+
# @return [String]
|
|
45
|
+
#
|
|
46
|
+
# @api private
|
|
47
|
+
#
|
|
48
|
+
def first_value
|
|
49
|
+
node.string
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Emit literal
|
|
53
|
+
#
|
|
54
|
+
# @param [Object] literal
|
|
55
|
+
#
|
|
56
|
+
# @return [undefined]
|
|
57
|
+
#
|
|
58
|
+
# @api private
|
|
59
|
+
#
|
|
60
|
+
def emit_literal(literal)
|
|
61
|
+
emit(literal.inspect[1..-2])
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Emit literal node
|
|
65
|
+
#
|
|
66
|
+
# @param [Rubinius::AST::Node] node
|
|
67
|
+
#
|
|
68
|
+
# @return [undefined]
|
|
69
|
+
#
|
|
70
|
+
# @api private
|
|
71
|
+
#
|
|
72
|
+
def emit_literal_node(node)
|
|
73
|
+
emit_literal(node.string)
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Emit first
|
|
77
|
+
#
|
|
78
|
+
# @return [undefined]
|
|
79
|
+
#
|
|
80
|
+
# @api private
|
|
81
|
+
#
|
|
82
|
+
def emit_first
|
|
83
|
+
emit_literal(first_value)
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Emit segments
|
|
87
|
+
#
|
|
88
|
+
# @return [undefined]
|
|
89
|
+
#
|
|
90
|
+
# @api private
|
|
91
|
+
#
|
|
92
|
+
def emit_segments
|
|
93
|
+
array.each do |segment|
|
|
94
|
+
emit_segment(segment)
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
|
|
98
|
+
# Emit segment
|
|
99
|
+
#
|
|
100
|
+
# @param [Rubinius::AST::Node] segment
|
|
101
|
+
#
|
|
102
|
+
# @return [undefined]
|
|
103
|
+
#
|
|
104
|
+
# @api private
|
|
105
|
+
#
|
|
106
|
+
def emit_segment(segment)
|
|
107
|
+
case segment
|
|
108
|
+
when Rubinius::AST::StringLiteral
|
|
109
|
+
emit_literal_node(segment)
|
|
110
|
+
else
|
|
111
|
+
visit(segment)
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
delegate :array
|
|
116
|
+
|
|
117
|
+
# Return max segment number
|
|
118
|
+
#
|
|
119
|
+
# @return [Fixnum]
|
|
120
|
+
#
|
|
121
|
+
# @api private
|
|
122
|
+
#
|
|
123
|
+
def max
|
|
124
|
+
array.length - 1
|
|
125
|
+
end
|
|
126
|
+
memoize :max
|
|
127
|
+
|
|
128
|
+
# Emitter for dynamic symbol literals
|
|
129
|
+
class Symbol < self
|
|
130
|
+
|
|
131
|
+
handle(Rubinius::AST::DynamicSymbol)
|
|
132
|
+
OPEN = ':"'.freeze
|
|
133
|
+
CLOSE = '"'.freeze
|
|
134
|
+
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# Emitter for dynamic string literals
|
|
138
|
+
class String < self
|
|
139
|
+
|
|
140
|
+
handle(Rubinius::AST::DynamicString)
|
|
141
|
+
OPEN = CLOSE = '"'.freeze
|
|
142
|
+
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
# Emitter for dynamic execute string literals
|
|
146
|
+
class Execute < self
|
|
147
|
+
|
|
148
|
+
handle(Rubinius::AST::DynamicExecuteString)
|
|
149
|
+
OPEN = CLOSE = '`'.freeze
|
|
150
|
+
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Emitter for dynamic regexp literals
|
|
154
|
+
class Regex < self
|
|
155
|
+
|
|
156
|
+
handle(Rubinius::AST::DynamicRegex)
|
|
157
|
+
OPEN = CLOSE = '/'.freeze
|
|
158
|
+
|
|
159
|
+
private
|
|
160
|
+
|
|
161
|
+
# Emit literal
|
|
162
|
+
#
|
|
163
|
+
# @param [String] literal
|
|
164
|
+
#
|
|
165
|
+
# @return [undefined]
|
|
166
|
+
#
|
|
167
|
+
# @api private
|
|
168
|
+
#
|
|
169
|
+
def emit_literal(literal)
|
|
170
|
+
emit(literal)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
end
|
|
176
|
+
end
|
|
177
|
+
end
|
|
178
|
+
end
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Base class for literal emitters
|
|
4
|
+
class Literal < self
|
|
5
|
+
|
|
6
|
+
# Emitter for empty array nodes
|
|
7
|
+
class EmptyArray < self
|
|
8
|
+
|
|
9
|
+
handle(Rubinius::AST::EmptyArray)
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
# Perform dispatch
|
|
14
|
+
#
|
|
15
|
+
# @return [undefined]
|
|
16
|
+
#
|
|
17
|
+
# @api private
|
|
18
|
+
#
|
|
19
|
+
def dispatch
|
|
20
|
+
emit('[]')
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Emitter for array nodes
|
|
25
|
+
class Array < self
|
|
26
|
+
|
|
27
|
+
handle(Rubinius::AST::ArrayLiteral)
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
# Perform dispatch
|
|
32
|
+
#
|
|
33
|
+
# @return [undefined]
|
|
34
|
+
#
|
|
35
|
+
# @api private
|
|
36
|
+
#
|
|
37
|
+
def dispatch
|
|
38
|
+
emit('[')
|
|
39
|
+
run(Util::DelimitedBody, node.body)
|
|
40
|
+
emit(']')
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
# Base class for range emitters
|
|
45
|
+
class Range < self
|
|
46
|
+
|
|
47
|
+
private
|
|
48
|
+
|
|
49
|
+
# Perform dispatch
|
|
50
|
+
#
|
|
51
|
+
# @return [undefined]
|
|
52
|
+
#
|
|
53
|
+
# @api private
|
|
54
|
+
#
|
|
55
|
+
def dispatch
|
|
56
|
+
util = node
|
|
57
|
+
visit(util.start)
|
|
58
|
+
emit(self.class::TOKEN)
|
|
59
|
+
visit(util.finish)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Emitter for incluive range nodes
|
|
63
|
+
class Inclusive < self
|
|
64
|
+
|
|
65
|
+
handle(Rubinius::AST::Range)
|
|
66
|
+
TOKEN = '..'.freeze
|
|
67
|
+
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
# Emitter for exclusive range nodes
|
|
71
|
+
class Exclude < self
|
|
72
|
+
|
|
73
|
+
handle(Rubinius::AST::RangeExclude)
|
|
74
|
+
TOKEN = '...'.freeze
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Emitter for hash nodes
|
|
81
|
+
class Hash < self
|
|
82
|
+
|
|
83
|
+
handle(Rubinius::AST::HashLiteral)
|
|
84
|
+
|
|
85
|
+
private
|
|
86
|
+
|
|
87
|
+
# Perform dispatch
|
|
88
|
+
#
|
|
89
|
+
# @return [undefined]
|
|
90
|
+
#
|
|
91
|
+
# @api private
|
|
92
|
+
#
|
|
93
|
+
def dispatch
|
|
94
|
+
emit '{'
|
|
95
|
+
emit_body
|
|
96
|
+
emit '}'
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
# Emit body
|
|
100
|
+
#
|
|
101
|
+
# @return [undefined]
|
|
102
|
+
#
|
|
103
|
+
# @api private
|
|
104
|
+
#
|
|
105
|
+
def emit_body
|
|
106
|
+
body = node.array.each_slice(2).to_a
|
|
107
|
+
max = body.length - 1
|
|
108
|
+
body.each_with_index do |(key, value), index|
|
|
109
|
+
visit(key)
|
|
110
|
+
emit(' => ')
|
|
111
|
+
visit(value)
|
|
112
|
+
|
|
113
|
+
if index < max
|
|
114
|
+
emit(', ')
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# Base class for emiiters that emit via #inspect
|
|
122
|
+
class Inspect < self
|
|
123
|
+
|
|
124
|
+
handle(Rubinius::AST::SymbolLiteral)
|
|
125
|
+
|
|
126
|
+
private
|
|
127
|
+
|
|
128
|
+
# Perform dispatch
|
|
129
|
+
#
|
|
130
|
+
# @return [undefined]
|
|
131
|
+
#
|
|
132
|
+
# @api private
|
|
133
|
+
#
|
|
134
|
+
def dispatch
|
|
135
|
+
emit(value.inspect)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
delegate :value
|
|
139
|
+
|
|
140
|
+
# Base class for emitters with static value
|
|
141
|
+
class Static < self
|
|
142
|
+
|
|
143
|
+
private
|
|
144
|
+
|
|
145
|
+
# Return value
|
|
146
|
+
#
|
|
147
|
+
# @return [Object]
|
|
148
|
+
#
|
|
149
|
+
# @api private
|
|
150
|
+
#
|
|
151
|
+
def value
|
|
152
|
+
self.class::VALUE
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Emitter for true literal nodes
|
|
156
|
+
class True < self
|
|
157
|
+
handle(Rubinius::AST::TrueLiteral)
|
|
158
|
+
VALUE = true
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
# Emitter for false literal nodes
|
|
162
|
+
class False < self
|
|
163
|
+
handle(Rubinius::AST::FalseLiteral)
|
|
164
|
+
VALUE = false
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Emitter for nil literal nodes
|
|
168
|
+
class Nil < self
|
|
169
|
+
handle(Rubinius::AST::NilLiteral)
|
|
170
|
+
VALUE = nil
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
# Emitter for regexp literal nodes
|
|
175
|
+
class Regexp < self
|
|
176
|
+
|
|
177
|
+
handle(Rubinius::AST::RegexLiteral)
|
|
178
|
+
|
|
179
|
+
private
|
|
180
|
+
|
|
181
|
+
# Return value to inspect
|
|
182
|
+
#
|
|
183
|
+
# @return [Regexp]
|
|
184
|
+
#
|
|
185
|
+
# @api private
|
|
186
|
+
#
|
|
187
|
+
def value
|
|
188
|
+
::Regexp.new(node.source)
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
# Emitter for string litera nodes
|
|
193
|
+
class String < self
|
|
194
|
+
|
|
195
|
+
handle(Rubinius::AST::StringLiteral)
|
|
196
|
+
|
|
197
|
+
private
|
|
198
|
+
|
|
199
|
+
# Return value to inspect
|
|
200
|
+
#
|
|
201
|
+
# @return [String]
|
|
202
|
+
#
|
|
203
|
+
# @api private
|
|
204
|
+
#
|
|
205
|
+
def value
|
|
206
|
+
node.string
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
# Emitters that emitt via vlaue pass through
|
|
212
|
+
class PassThrough < self
|
|
213
|
+
|
|
214
|
+
handle(Rubinius::AST::FixnumLiteral)
|
|
215
|
+
handle(Rubinius::AST::FloatLiteral)
|
|
216
|
+
|
|
217
|
+
private
|
|
218
|
+
|
|
219
|
+
# Perform dispatch
|
|
220
|
+
#
|
|
221
|
+
# @return [undefined]
|
|
222
|
+
#
|
|
223
|
+
# @api private
|
|
224
|
+
#
|
|
225
|
+
def dispatch
|
|
226
|
+
emit(node.value)
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Base class for loop node emittrs
|
|
4
|
+
class Loop < self
|
|
5
|
+
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
# Perform dispatch
|
|
9
|
+
#
|
|
10
|
+
# @return [undefined]
|
|
11
|
+
#
|
|
12
|
+
# @api private
|
|
13
|
+
#
|
|
14
|
+
def dispatch
|
|
15
|
+
emit(self.class::KEYWORD)
|
|
16
|
+
space
|
|
17
|
+
visit(condition)
|
|
18
|
+
indented do
|
|
19
|
+
visit(body)
|
|
20
|
+
end
|
|
21
|
+
emit_end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
delegate :condition, :body
|
|
25
|
+
|
|
26
|
+
# Emitter for while nodes
|
|
27
|
+
class While < self
|
|
28
|
+
handle(Rubinius::AST::While)
|
|
29
|
+
KEYWORD = :while
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Emitter for until nodes
|
|
33
|
+
class Until < self
|
|
34
|
+
handle(Rubinius::AST::Until)
|
|
35
|
+
KEYWORD = :until
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for match operator
|
|
4
|
+
class Match3 < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::Match3)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
util = node
|
|
18
|
+
visit(util.value)
|
|
19
|
+
emit(' =~ ')
|
|
20
|
+
visit(util.pattern)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for module nodes
|
|
4
|
+
class Module < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::Module)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
util = node
|
|
18
|
+
emit('module ')
|
|
19
|
+
visit(util.name)
|
|
20
|
+
indented do
|
|
21
|
+
visit(util.body)
|
|
22
|
+
end
|
|
23
|
+
emit_end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for multiple assignment nodes
|
|
4
|
+
class MultipleAssignment < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::MultipleAssignment)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
emit_left
|
|
18
|
+
emit(' = ')
|
|
19
|
+
emit_right
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Emit left
|
|
23
|
+
#
|
|
24
|
+
# @return [undefined]
|
|
25
|
+
#
|
|
26
|
+
# @api private
|
|
27
|
+
#
|
|
28
|
+
def emit_left
|
|
29
|
+
run(Util::DelimitedBody, node.left.body)
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Emit left
|
|
33
|
+
#
|
|
34
|
+
# @return [undefined]
|
|
35
|
+
#
|
|
36
|
+
# @api private
|
|
37
|
+
#
|
|
38
|
+
def emit_right
|
|
39
|
+
right = node.right
|
|
40
|
+
if right.kind_of?(Rubinius::AST::ArrayLiteral)
|
|
41
|
+
run(Util::DelimitedBody, right.body)
|
|
42
|
+
else
|
|
43
|
+
visit(right)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for nth global variable reference
|
|
4
|
+
class NthRef < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::NthRef)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
emit("$#{node.which}")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for conditiona element assignment
|
|
4
|
+
class OpAssign1 < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::OpAssign1)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
util = node
|
|
18
|
+
visit(util.receiver)
|
|
19
|
+
emit('[')
|
|
20
|
+
visit(util.arguments.array.first)
|
|
21
|
+
emit('] ||= ')
|
|
22
|
+
visit(util.value)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for conditiona attribute assignment
|
|
4
|
+
class OpAssign2 < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::OpAssign2)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
util = node
|
|
18
|
+
visit(util.receiver)
|
|
19
|
+
emit('.')
|
|
20
|
+
emit(util.name)
|
|
21
|
+
emit(' |= ')
|
|
22
|
+
visit(util.value)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for pattern argument node
|
|
4
|
+
class PatternArguments < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::PatternArguments)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
emit('(')
|
|
18
|
+
run(Util::DelimitedBody, node.arguments.body)
|
|
19
|
+
emit(')')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for rescue nodes
|
|
4
|
+
class Rescue < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::Rescue)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
util = node
|
|
18
|
+
emit('begin')
|
|
19
|
+
indented do
|
|
20
|
+
visit(util.body)
|
|
21
|
+
end
|
|
22
|
+
visit(util.rescue)
|
|
23
|
+
emit_end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|