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,99 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
|
|
4
|
+
# Emitter for define singleton nodes
|
|
5
|
+
class DefineSingleton < self
|
|
6
|
+
|
|
7
|
+
handle(Rubinius::AST::DefineSingleton)
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
delegate(:receiver, :body)
|
|
12
|
+
|
|
13
|
+
# Perform dispatch
|
|
14
|
+
#
|
|
15
|
+
# @return [undefined]
|
|
16
|
+
#
|
|
17
|
+
# @api private
|
|
18
|
+
#
|
|
19
|
+
def dispatch
|
|
20
|
+
emit('def ')
|
|
21
|
+
visit(receiver)
|
|
22
|
+
emit('.')
|
|
23
|
+
visit(body)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Base class for define emitters
|
|
28
|
+
class Define < self
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
delegate(:name, :body)
|
|
33
|
+
|
|
34
|
+
# Perform dispatch
|
|
35
|
+
#
|
|
36
|
+
# @return [undefined]
|
|
37
|
+
#
|
|
38
|
+
# @api private
|
|
39
|
+
#
|
|
40
|
+
def shared_dispatch
|
|
41
|
+
emit(name)
|
|
42
|
+
emit_arguments
|
|
43
|
+
indented do
|
|
44
|
+
visit(body)
|
|
45
|
+
end
|
|
46
|
+
emit_end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Emit arguments
|
|
50
|
+
#
|
|
51
|
+
# @return [undefined]
|
|
52
|
+
#
|
|
53
|
+
# @api private
|
|
54
|
+
#
|
|
55
|
+
def emit_arguments
|
|
56
|
+
run(FormalArguments::Method)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Emitter for singeton level defines
|
|
60
|
+
class Singleton < self
|
|
61
|
+
|
|
62
|
+
handle(Rubinius::AST::DefineSingletonScope)
|
|
63
|
+
|
|
64
|
+
private
|
|
65
|
+
|
|
66
|
+
# Perform dispatch
|
|
67
|
+
#
|
|
68
|
+
# @return [undefined]
|
|
69
|
+
#
|
|
70
|
+
# @api private
|
|
71
|
+
#
|
|
72
|
+
def dispatch
|
|
73
|
+
shared_dispatch
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Emitter for instance level defines
|
|
79
|
+
class Instance < self
|
|
80
|
+
|
|
81
|
+
handle(Rubinius::AST::Define)
|
|
82
|
+
|
|
83
|
+
private
|
|
84
|
+
|
|
85
|
+
# Perform dispatch
|
|
86
|
+
#
|
|
87
|
+
# @return [undefined]
|
|
88
|
+
#
|
|
89
|
+
# @api private
|
|
90
|
+
#
|
|
91
|
+
def dispatch
|
|
92
|
+
emit('def ')
|
|
93
|
+
shared_dispatch
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for defined? node
|
|
4
|
+
class Defined < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::Defined)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
emit('defined?(')
|
|
18
|
+
visit(node.expression)
|
|
19
|
+
emit(')')
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for element assignment nodes
|
|
4
|
+
class ElementAssignment < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::ElementAssignment)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
delegate(:receiver)
|
|
11
|
+
|
|
12
|
+
# Perform dispatch
|
|
13
|
+
#
|
|
14
|
+
# @return [undefined]
|
|
15
|
+
#
|
|
16
|
+
# @api private
|
|
17
|
+
#
|
|
18
|
+
def dispatch
|
|
19
|
+
index, value = node.arguments.array
|
|
20
|
+
visit(receiver)
|
|
21
|
+
emit('[')
|
|
22
|
+
visit(index)
|
|
23
|
+
emit('] = ')
|
|
24
|
+
visit(value)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for element reference nodes
|
|
4
|
+
class ElementReference < self
|
|
5
|
+
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
delegate(:receiver)
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
visit(receiver)
|
|
18
|
+
emit('[')
|
|
19
|
+
visit(node.arguments.array.first)
|
|
20
|
+
emit(']')
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for empty body
|
|
4
|
+
class EmptyBody < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::EmptyBody)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for ensure nodes
|
|
4
|
+
class Ensure < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::Ensure)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
emit_begin
|
|
18
|
+
emit_enusure
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
# Emit begin
|
|
22
|
+
#
|
|
23
|
+
# @return [undefined]
|
|
24
|
+
#
|
|
25
|
+
# @api private
|
|
26
|
+
#
|
|
27
|
+
def emit_begin
|
|
28
|
+
emit(:begin)
|
|
29
|
+
indented do
|
|
30
|
+
visit(node.body)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Emit ensure
|
|
35
|
+
#
|
|
36
|
+
# @return [undefined]
|
|
37
|
+
#
|
|
38
|
+
# @api private
|
|
39
|
+
#
|
|
40
|
+
def emit_enusure
|
|
41
|
+
emit(:ensure)
|
|
42
|
+
indented do
|
|
43
|
+
visit(node.ensure)
|
|
44
|
+
end
|
|
45
|
+
emit_end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for ensure body
|
|
4
|
+
class EnsureBody < self
|
|
5
|
+
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
delegate(:body)
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
visit(body)
|
|
18
|
+
unindent
|
|
19
|
+
emit(:ensure)
|
|
20
|
+
indented do
|
|
21
|
+
visit(node.ensure)
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for execute string
|
|
4
|
+
class ExecuteString < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::ExecuteString)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
emit("`#{node.string}`")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for formal arguments
|
|
4
|
+
class FormalArguments < self
|
|
5
|
+
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
delegate(:arguments)
|
|
9
|
+
predicate(:splat, :block_arg, :defaults)
|
|
10
|
+
|
|
11
|
+
# Perform dispatch
|
|
12
|
+
#
|
|
13
|
+
# @return [undefined]
|
|
14
|
+
#
|
|
15
|
+
# @api private
|
|
16
|
+
#
|
|
17
|
+
def dispatch
|
|
18
|
+
return unless any?
|
|
19
|
+
util = self.class
|
|
20
|
+
emit(util::OPEN)
|
|
21
|
+
emit_required
|
|
22
|
+
emit_defaults
|
|
23
|
+
emit_splat
|
|
24
|
+
emit_block_arg
|
|
25
|
+
emit(util::CLOSE)
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
# Test if any argument is present
|
|
29
|
+
#
|
|
30
|
+
# @return [true]
|
|
31
|
+
# if any argument is present
|
|
32
|
+
#
|
|
33
|
+
# @return [false]
|
|
34
|
+
# otherwise
|
|
35
|
+
#
|
|
36
|
+
# @api private
|
|
37
|
+
#
|
|
38
|
+
def any?
|
|
39
|
+
required? || defaults? || splat? || block_arg?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Return required
|
|
43
|
+
#
|
|
44
|
+
# @return [Array]
|
|
45
|
+
#
|
|
46
|
+
# @api private
|
|
47
|
+
#
|
|
48
|
+
def required
|
|
49
|
+
arguments.required
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
# Test if any required arguments are present
|
|
53
|
+
#
|
|
54
|
+
# @return [true]
|
|
55
|
+
# if any required arguments are presnet
|
|
56
|
+
#
|
|
57
|
+
# @return [false]
|
|
58
|
+
# otherwise
|
|
59
|
+
#
|
|
60
|
+
# @api private
|
|
61
|
+
#
|
|
62
|
+
def required?
|
|
63
|
+
required.any?
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
# Return defaults
|
|
67
|
+
#
|
|
68
|
+
# @return [Rubinius::AST::Node]
|
|
69
|
+
#
|
|
70
|
+
# @api private
|
|
71
|
+
#
|
|
72
|
+
def defaults
|
|
73
|
+
arguments.defaults
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Return splat arguments
|
|
77
|
+
#
|
|
78
|
+
# @return [Rubinius::AST::Node]
|
|
79
|
+
#
|
|
80
|
+
# @api private
|
|
81
|
+
#
|
|
82
|
+
def splat
|
|
83
|
+
arguments.splat
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
# Return block argument
|
|
87
|
+
#
|
|
88
|
+
# @return [Rubinius::AST::Node]
|
|
89
|
+
#
|
|
90
|
+
# @api private
|
|
91
|
+
#
|
|
92
|
+
def block_arg
|
|
93
|
+
arguments.block_arg
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# Emit required
|
|
97
|
+
#
|
|
98
|
+
# @return [undefined]
|
|
99
|
+
#
|
|
100
|
+
# @api private
|
|
101
|
+
#
|
|
102
|
+
def emit_required
|
|
103
|
+
array = required
|
|
104
|
+
max = array.length - 1
|
|
105
|
+
array.each_with_index do |member, index|
|
|
106
|
+
emit_member(member)
|
|
107
|
+
emit(', ') if index < max
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
# Emit member
|
|
112
|
+
#
|
|
113
|
+
# @param [Object, Rubinius::AST::Node] member
|
|
114
|
+
#
|
|
115
|
+
# @return [undefined]
|
|
116
|
+
#
|
|
117
|
+
# @api private
|
|
118
|
+
#
|
|
119
|
+
def emit_member(member)
|
|
120
|
+
if member.kind_of?(Rubinius::AST::Node)
|
|
121
|
+
visit(member)
|
|
122
|
+
else
|
|
123
|
+
emit(member)
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
# Emit defaults
|
|
128
|
+
#
|
|
129
|
+
# @return [undefined]
|
|
130
|
+
#
|
|
131
|
+
# @api private
|
|
132
|
+
#
|
|
133
|
+
def emit_defaults
|
|
134
|
+
return unless defaults?
|
|
135
|
+
emit(', ') if required?
|
|
136
|
+
visit(defaults)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
# Emit splat
|
|
140
|
+
#
|
|
141
|
+
# @return [undefined]
|
|
142
|
+
#
|
|
143
|
+
# @api private
|
|
144
|
+
#
|
|
145
|
+
def emit_splat
|
|
146
|
+
return unless splat?
|
|
147
|
+
|
|
148
|
+
emit(', ') if required? or defaults?
|
|
149
|
+
emit('*')
|
|
150
|
+
emit_splat_value(splat)
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
# Emit splat value
|
|
154
|
+
#
|
|
155
|
+
# @param [Object] value
|
|
156
|
+
#
|
|
157
|
+
# @return [undefined]
|
|
158
|
+
#
|
|
159
|
+
# @api private
|
|
160
|
+
#
|
|
161
|
+
def emit_splat_value(value)
|
|
162
|
+
unless value == :@unnamed_splat
|
|
163
|
+
emit(value)
|
|
164
|
+
end
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
# Emit block arg
|
|
168
|
+
#
|
|
169
|
+
# @return [undefined]
|
|
170
|
+
#
|
|
171
|
+
# @api private
|
|
172
|
+
#
|
|
173
|
+
def emit_block_arg
|
|
174
|
+
return unless block_arg?
|
|
175
|
+
emit(', ') if required? or defaults? or splat?
|
|
176
|
+
visit(block_arg)
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
# Emmiter for block arguments
|
|
180
|
+
class Block < self
|
|
181
|
+
OPEN = ' |'.freeze
|
|
182
|
+
CLOSE = '|'.freeze
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# Emitter for method arguments
|
|
186
|
+
class Method < self
|
|
187
|
+
OPEN = '('.freeze
|
|
188
|
+
CLOSE = ')'.freeze
|
|
189
|
+
|
|
190
|
+
# Generic emitter for method arguments
|
|
191
|
+
class Generic < self
|
|
192
|
+
|
|
193
|
+
handle(Rubinius::AST::FormalArguments19)
|
|
194
|
+
|
|
195
|
+
private
|
|
196
|
+
|
|
197
|
+
# Return arguments
|
|
198
|
+
#
|
|
199
|
+
# @return [Rubnius::AST::Node]
|
|
200
|
+
#
|
|
201
|
+
# @api private
|
|
202
|
+
#
|
|
203
|
+
def arguments
|
|
204
|
+
node
|
|
205
|
+
end
|
|
206
|
+
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
end
|
|
210
|
+
end
|
|
211
|
+
end
|
|
212
|
+
end
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for if nodes
|
|
4
|
+
class If < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::If)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
if else_branch? and !if_branch?
|
|
18
|
+
run(Unless, node)
|
|
19
|
+
return
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
normal_dispatch
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Test if if branch is present
|
|
26
|
+
#
|
|
27
|
+
# @return [true]
|
|
28
|
+
# if if branch is present
|
|
29
|
+
#
|
|
30
|
+
# @return [false]
|
|
31
|
+
# otherwise
|
|
32
|
+
#
|
|
33
|
+
# @api private
|
|
34
|
+
#
|
|
35
|
+
def if_branch?
|
|
36
|
+
!node.body.kind_of?(Rubinius::AST::NilLiteral)
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Test if else branch is present
|
|
40
|
+
#
|
|
41
|
+
# @return [true]
|
|
42
|
+
# if else branch is present
|
|
43
|
+
#
|
|
44
|
+
# @return [false]
|
|
45
|
+
# otherwise
|
|
46
|
+
#
|
|
47
|
+
# @api private
|
|
48
|
+
#
|
|
49
|
+
def else_branch?
|
|
50
|
+
!node.else.kind_of?(Rubinius::AST::NilLiteral)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Perform normal dispatch
|
|
54
|
+
#
|
|
55
|
+
# @return [undefined]
|
|
56
|
+
#
|
|
57
|
+
# @api private
|
|
58
|
+
#
|
|
59
|
+
def normal_dispatch
|
|
60
|
+
emit('if ')
|
|
61
|
+
visit(node.condition)
|
|
62
|
+
emit_if_branch
|
|
63
|
+
emit_else_branch
|
|
64
|
+
emit('end')
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Emit if brnach
|
|
68
|
+
#
|
|
69
|
+
# @return [undefined]
|
|
70
|
+
#
|
|
71
|
+
# @api private
|
|
72
|
+
#
|
|
73
|
+
def emit_if_branch
|
|
74
|
+
indented do
|
|
75
|
+
visit(node.body)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
# Emit else branch
|
|
80
|
+
#
|
|
81
|
+
# @return [undefined]
|
|
82
|
+
#
|
|
83
|
+
# @api private
|
|
84
|
+
#
|
|
85
|
+
def emit_else_branch
|
|
86
|
+
body = node.else
|
|
87
|
+
return unless else_branch?
|
|
88
|
+
emit('else')
|
|
89
|
+
indented do
|
|
90
|
+
visit(body)
|
|
91
|
+
end
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for iter nodes
|
|
4
|
+
class Iter < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::Iter19)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
emit(' do')
|
|
18
|
+
run(FormalArguments::Block)
|
|
19
|
+
indented do
|
|
20
|
+
visit(node.body)
|
|
21
|
+
end
|
|
22
|
+
emit_end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
|
|
4
|
+
# Base class for keyword with value emitters
|
|
5
|
+
class KeywordValue < self
|
|
6
|
+
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
# Perform dispatch
|
|
10
|
+
#
|
|
11
|
+
# @return [undefined]
|
|
12
|
+
#
|
|
13
|
+
# @api private
|
|
14
|
+
#
|
|
15
|
+
def dispatch
|
|
16
|
+
emit(self.class::SYMBOL)
|
|
17
|
+
if value?
|
|
18
|
+
emit('(')
|
|
19
|
+
visit(node.value)
|
|
20
|
+
emit(')')
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Emitter for return nodes
|
|
25
|
+
class Return < self
|
|
26
|
+
|
|
27
|
+
handle(Rubinius::AST::Return)
|
|
28
|
+
SYMBOL = :return
|
|
29
|
+
|
|
30
|
+
private
|
|
31
|
+
|
|
32
|
+
# Perform dispatch
|
|
33
|
+
#
|
|
34
|
+
# @return [undefined]
|
|
35
|
+
#
|
|
36
|
+
# @api private
|
|
37
|
+
#
|
|
38
|
+
def value?
|
|
39
|
+
!!node.value
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
# Emitter for break nodes
|
|
44
|
+
class Break < self
|
|
45
|
+
|
|
46
|
+
handle(Rubinius::AST::Break)
|
|
47
|
+
SYMBOL = :break
|
|
48
|
+
|
|
49
|
+
# Test if value is present
|
|
50
|
+
#
|
|
51
|
+
# @return [true]
|
|
52
|
+
# if value is present
|
|
53
|
+
#
|
|
54
|
+
# @return [false]
|
|
55
|
+
# otherwise
|
|
56
|
+
#
|
|
57
|
+
# @api private
|
|
58
|
+
#
|
|
59
|
+
def value?
|
|
60
|
+
!node.value.kind_of?(Rubinius::AST::NilLiteral)
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|