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,89 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for arguments node
|
|
4
|
+
class ActualArguments < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::ActualArguments)
|
|
7
|
+
|
|
8
|
+
# Test if any arguments are present
|
|
9
|
+
#
|
|
10
|
+
# @return [true]
|
|
11
|
+
# if any argument is present
|
|
12
|
+
#
|
|
13
|
+
# @return [false]
|
|
14
|
+
# otherwise
|
|
15
|
+
#
|
|
16
|
+
# @api private
|
|
17
|
+
#
|
|
18
|
+
def any?
|
|
19
|
+
normal? || splat?
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
# Perform dispatch
|
|
25
|
+
#
|
|
26
|
+
# @return [self]
|
|
27
|
+
#
|
|
28
|
+
# @api private
|
|
29
|
+
#
|
|
30
|
+
def dispatch
|
|
31
|
+
emit_normal
|
|
32
|
+
emit_splat
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
delegate :array, :splat
|
|
36
|
+
|
|
37
|
+
# Test for splat argument
|
|
38
|
+
#
|
|
39
|
+
# @return [true]
|
|
40
|
+
# if splate argument is present
|
|
41
|
+
#
|
|
42
|
+
# @return [false]
|
|
43
|
+
# otherwise
|
|
44
|
+
#
|
|
45
|
+
# @api private
|
|
46
|
+
#
|
|
47
|
+
def splat?
|
|
48
|
+
!!splat
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Test if normal arguments are present
|
|
52
|
+
#
|
|
53
|
+
# @return [true]
|
|
54
|
+
# if normal arguments are present
|
|
55
|
+
#
|
|
56
|
+
# @return [false]
|
|
57
|
+
# otherwise
|
|
58
|
+
#
|
|
59
|
+
# @api private
|
|
60
|
+
#
|
|
61
|
+
def normal?
|
|
62
|
+
!array.empty?
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Emit normal arguments
|
|
66
|
+
#
|
|
67
|
+
# @return [undefined]
|
|
68
|
+
#
|
|
69
|
+
# @api private
|
|
70
|
+
#
|
|
71
|
+
def emit_normal
|
|
72
|
+
run(Util::DelimitedBody, array)
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
# Emit splat argument
|
|
76
|
+
#
|
|
77
|
+
# @return [undefined]
|
|
78
|
+
#
|
|
79
|
+
# @api private
|
|
80
|
+
#
|
|
81
|
+
def emit_splat
|
|
82
|
+
return unless splat?
|
|
83
|
+
emit(', ') if normal?
|
|
84
|
+
visit(splat)
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emiter for alias node
|
|
4
|
+
class Alias < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::Alias)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
delegate(:to, :from)
|
|
11
|
+
|
|
12
|
+
# Perform dispatch
|
|
13
|
+
#
|
|
14
|
+
# @return [undefined]
|
|
15
|
+
#
|
|
16
|
+
# @api private
|
|
17
|
+
#
|
|
18
|
+
def dispatch
|
|
19
|
+
emit('alias ')
|
|
20
|
+
emit(to.value)
|
|
21
|
+
space
|
|
22
|
+
emit(from.value)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Base class for various assignment nodes
|
|
4
|
+
class Assignment < self
|
|
5
|
+
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
delegate :value
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
emit_target
|
|
18
|
+
val = value
|
|
19
|
+
|
|
20
|
+
if val
|
|
21
|
+
emit(' = ')
|
|
22
|
+
visit(val)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Emitter for constant assignments
|
|
27
|
+
class Constant < self
|
|
28
|
+
|
|
29
|
+
handle(Rubinius::AST::ConstantAssignment)
|
|
30
|
+
|
|
31
|
+
private
|
|
32
|
+
|
|
33
|
+
# Emit name
|
|
34
|
+
#
|
|
35
|
+
# @return [undefined]
|
|
36
|
+
#
|
|
37
|
+
# @api private
|
|
38
|
+
#
|
|
39
|
+
def emit_target
|
|
40
|
+
visit(node.constant)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Emitter for various variabe assignments
|
|
46
|
+
class Variable < self
|
|
47
|
+
|
|
48
|
+
handle(Rubinius::AST::LocalVariableAssignment)
|
|
49
|
+
handle(Rubinius::AST::InstanceVariableAssignment)
|
|
50
|
+
handle(Rubinius::AST::GlobalVariableAssignment)
|
|
51
|
+
handle(Rubinius::AST::ClassVariableAssignment)
|
|
52
|
+
|
|
53
|
+
private
|
|
54
|
+
|
|
55
|
+
# Emit target
|
|
56
|
+
#
|
|
57
|
+
# @return [undefined]
|
|
58
|
+
#
|
|
59
|
+
# @api private
|
|
60
|
+
#
|
|
61
|
+
def emit_target
|
|
62
|
+
emit(node.name)
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
# Base class for assignment operators
|
|
69
|
+
class AssignmentOperator < self
|
|
70
|
+
|
|
71
|
+
private
|
|
72
|
+
|
|
73
|
+
delegate(:left, :right)
|
|
74
|
+
|
|
75
|
+
# Perform dispatch
|
|
76
|
+
#
|
|
77
|
+
# @return [undefined]
|
|
78
|
+
#
|
|
79
|
+
# @api private
|
|
80
|
+
#
|
|
81
|
+
def dispatch
|
|
82
|
+
parantheses do
|
|
83
|
+
visit(left)
|
|
84
|
+
emit(" #{self.class::SYMBOL} ")
|
|
85
|
+
emit_right
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Emit right
|
|
90
|
+
#
|
|
91
|
+
# @return [undefined]
|
|
92
|
+
#
|
|
93
|
+
# @api private
|
|
94
|
+
#
|
|
95
|
+
def emit_right
|
|
96
|
+
parantheses do
|
|
97
|
+
visit(right.value)
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# Emitter for or assigmnent operator
|
|
102
|
+
class Or < self
|
|
103
|
+
|
|
104
|
+
handle(Rubinius::AST::OpAssignOr19)
|
|
105
|
+
SYMBOL = :'||='
|
|
106
|
+
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
# Emitter for and assigmnent operator
|
|
110
|
+
class And < self
|
|
111
|
+
|
|
112
|
+
handle(Rubinius::AST::OpAssignAnd)
|
|
113
|
+
SYMBOL = :'&&='
|
|
114
|
+
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
end
|
|
118
|
+
end
|
|
119
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for attribute assignments
|
|
4
|
+
class AttributeAssignment < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::AttributeAssignment)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
delegate(:receiver, :name)
|
|
11
|
+
|
|
12
|
+
# Perform dispatch
|
|
13
|
+
#
|
|
14
|
+
# @return [undefined]
|
|
15
|
+
#
|
|
16
|
+
# @api private
|
|
17
|
+
#
|
|
18
|
+
def dispatch
|
|
19
|
+
visit(receiver)
|
|
20
|
+
emit('.')
|
|
21
|
+
emit(name)
|
|
22
|
+
space
|
|
23
|
+
visit(node.arguments.array.first)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for begin constructs
|
|
4
|
+
class Begin < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::Begin)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
emit('begin')
|
|
18
|
+
emit_body
|
|
19
|
+
emit_end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Emit body
|
|
23
|
+
#
|
|
24
|
+
# @return [undefined]
|
|
25
|
+
#
|
|
26
|
+
# @api private
|
|
27
|
+
#
|
|
28
|
+
def emit_body
|
|
29
|
+
indent
|
|
30
|
+
body = node.rescue
|
|
31
|
+
case body
|
|
32
|
+
when Rubinius::AST::Rescue
|
|
33
|
+
emit_rescue(body)
|
|
34
|
+
when Rubinius::AST::Ensure
|
|
35
|
+
emit_ensure(body)
|
|
36
|
+
else
|
|
37
|
+
visit(body)
|
|
38
|
+
unindent
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
# Emit ensure
|
|
43
|
+
#
|
|
44
|
+
# @return [undefined]
|
|
45
|
+
#
|
|
46
|
+
# @api private
|
|
47
|
+
#
|
|
48
|
+
def emit_ensure(node)
|
|
49
|
+
visit(node.body)
|
|
50
|
+
unindent
|
|
51
|
+
emit(:ensure)
|
|
52
|
+
indented do
|
|
53
|
+
visit(node.ensure)
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Emit rescue
|
|
58
|
+
#
|
|
59
|
+
# @return [undefined]
|
|
60
|
+
#
|
|
61
|
+
# @api private
|
|
62
|
+
#
|
|
63
|
+
def emit_rescue(node)
|
|
64
|
+
visit(node.body)
|
|
65
|
+
unindent
|
|
66
|
+
visit(node.rescue)
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Base class for binary operator emitters
|
|
4
|
+
class BinaryOperator < self
|
|
5
|
+
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
# Perform dispatch
|
|
9
|
+
#
|
|
10
|
+
# @return [undefined]
|
|
11
|
+
#
|
|
12
|
+
# @api private
|
|
13
|
+
#
|
|
14
|
+
def dispatch
|
|
15
|
+
parantheses do
|
|
16
|
+
emit_left
|
|
17
|
+
emit(" #{self.class::SYMBOL} ")
|
|
18
|
+
emit_right
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Emit left
|
|
23
|
+
#
|
|
24
|
+
# @return [undefined]
|
|
25
|
+
#
|
|
26
|
+
# @api private
|
|
27
|
+
#
|
|
28
|
+
def emit_left
|
|
29
|
+
parantheses do
|
|
30
|
+
visit(node.left)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Emit right
|
|
35
|
+
#
|
|
36
|
+
# @return [undefined]
|
|
37
|
+
#
|
|
38
|
+
# @api private
|
|
39
|
+
#
|
|
40
|
+
def emit_right
|
|
41
|
+
parantheses do
|
|
42
|
+
visit(node.right)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Emitter for binary or operator
|
|
47
|
+
class Or < self
|
|
48
|
+
|
|
49
|
+
handle(Rubinius::AST::Or)
|
|
50
|
+
SYMBOL = :'||'
|
|
51
|
+
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Emitter for binary and operator
|
|
55
|
+
class And < self
|
|
56
|
+
|
|
57
|
+
handle(Rubinius::AST::And)
|
|
58
|
+
SYMBOL = :'&&'
|
|
59
|
+
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for binary operator methods
|
|
4
|
+
class BinaryOperatorMethod < self
|
|
5
|
+
|
|
6
|
+
private
|
|
7
|
+
|
|
8
|
+
# Perform dispatch
|
|
9
|
+
#
|
|
10
|
+
# @return [undefined]
|
|
11
|
+
#
|
|
12
|
+
# @api private
|
|
13
|
+
#
|
|
14
|
+
def dispatch
|
|
15
|
+
parantheses do
|
|
16
|
+
emit_left
|
|
17
|
+
emit(" #{node.name} ")
|
|
18
|
+
emit_right
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
# Emit right
|
|
23
|
+
#
|
|
24
|
+
# @return [undefined]
|
|
25
|
+
#
|
|
26
|
+
# @api private
|
|
27
|
+
#
|
|
28
|
+
def emit_right
|
|
29
|
+
parantheses do
|
|
30
|
+
visit(right)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Emit left
|
|
35
|
+
#
|
|
36
|
+
# @return [undefined]
|
|
37
|
+
#
|
|
38
|
+
# @api private
|
|
39
|
+
#
|
|
40
|
+
def emit_left
|
|
41
|
+
parantheses do
|
|
42
|
+
visit(node.receiver)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Return right
|
|
47
|
+
#
|
|
48
|
+
# @return [Rubinius::AST::Node]
|
|
49
|
+
#
|
|
50
|
+
# @api private
|
|
51
|
+
#
|
|
52
|
+
def right
|
|
53
|
+
node.arguments.array.first
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emiter for blocks
|
|
4
|
+
class Block < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::Block)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
array = node.array
|
|
18
|
+
max = array.length-1
|
|
19
|
+
array.each_with_index do |node, index|
|
|
20
|
+
visit(node)
|
|
21
|
+
if index < max
|
|
22
|
+
new_line
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for block argument
|
|
4
|
+
class BlockArgument < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::BlockArgument)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
emit('&')
|
|
18
|
+
emit(node.name)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for block pass
|
|
4
|
+
class BlockPass < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::BlockPass19)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
emit('&')
|
|
18
|
+
visit(node.body)
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
|
|
4
|
+
# Emitter for case statment nodes
|
|
5
|
+
class Case < self
|
|
6
|
+
|
|
7
|
+
handle(Rubinius::AST::Case)
|
|
8
|
+
|
|
9
|
+
private
|
|
10
|
+
|
|
11
|
+
# Perform dispatch
|
|
12
|
+
#
|
|
13
|
+
# @return [undefined]
|
|
14
|
+
#
|
|
15
|
+
# @api private
|
|
16
|
+
#
|
|
17
|
+
def dispatch
|
|
18
|
+
emit('case ')
|
|
19
|
+
emit_receiver
|
|
20
|
+
emit_whens
|
|
21
|
+
emit_else
|
|
22
|
+
emit_end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
# Emit receiver
|
|
26
|
+
#
|
|
27
|
+
# @return [undefined]
|
|
28
|
+
#
|
|
29
|
+
# @api private
|
|
30
|
+
#
|
|
31
|
+
def emit_receiver
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# Emit else
|
|
35
|
+
#
|
|
36
|
+
# @return [undefined]
|
|
37
|
+
#
|
|
38
|
+
# @api private
|
|
39
|
+
#
|
|
40
|
+
def emit_else
|
|
41
|
+
body = node.else
|
|
42
|
+
return if body.kind_of?(Rubinius::AST::NilLiteral)
|
|
43
|
+
emit('else')
|
|
44
|
+
indented do
|
|
45
|
+
visit(body)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
# Emit whens
|
|
50
|
+
#
|
|
51
|
+
# @return [undefined]
|
|
52
|
+
#
|
|
53
|
+
# @api private
|
|
54
|
+
#
|
|
55
|
+
def emit_whens
|
|
56
|
+
first = true
|
|
57
|
+
node.whens.each do |member|
|
|
58
|
+
new_line if first
|
|
59
|
+
first = false
|
|
60
|
+
visit(member)
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Emitter for receiver case nodes
|
|
65
|
+
class ReceiverCase < self
|
|
66
|
+
|
|
67
|
+
handle(Rubinius::AST::ReceiverCase)
|
|
68
|
+
|
|
69
|
+
private
|
|
70
|
+
|
|
71
|
+
# Emit receiver
|
|
72
|
+
#
|
|
73
|
+
# @return [undefined]
|
|
74
|
+
#
|
|
75
|
+
# @api private
|
|
76
|
+
#
|
|
77
|
+
def emit_receiver
|
|
78
|
+
visit(node.receiver)
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
end
|
|
84
|
+
end
|
|
85
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for class nodes
|
|
4
|
+
class Class < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::Class)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
delegate(:name, :body)
|
|
11
|
+
|
|
12
|
+
# Perform dispatch
|
|
13
|
+
#
|
|
14
|
+
# @return [undefined]
|
|
15
|
+
#
|
|
16
|
+
# @api private
|
|
17
|
+
#
|
|
18
|
+
def dispatch
|
|
19
|
+
emit(:class)
|
|
20
|
+
space
|
|
21
|
+
visit(name)
|
|
22
|
+
emit_superclass
|
|
23
|
+
indented do
|
|
24
|
+
visit(body)
|
|
25
|
+
end
|
|
26
|
+
emit_end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Emit superclass
|
|
30
|
+
#
|
|
31
|
+
# @return [undefined]
|
|
32
|
+
#
|
|
33
|
+
# @api private
|
|
34
|
+
#
|
|
35
|
+
def emit_superclass
|
|
36
|
+
superclass = node.superclass
|
|
37
|
+
return if superclass.kind_of?(Rubinius::AST::NilLiteral)
|
|
38
|
+
emit(' < ')
|
|
39
|
+
visit(superclass)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for concat arguments
|
|
4
|
+
class ConcatArguments < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::ConcatArgs)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
delegate(:rest)
|
|
11
|
+
|
|
12
|
+
# Perform dispatch
|
|
13
|
+
#
|
|
14
|
+
# @return [undefined]
|
|
15
|
+
#
|
|
16
|
+
# @api private
|
|
17
|
+
#
|
|
18
|
+
def dispatch
|
|
19
|
+
emit('[')
|
|
20
|
+
run(Util::DelimitedBody, node.array.body)
|
|
21
|
+
emit(', *')
|
|
22
|
+
visit(rest)
|
|
23
|
+
emit(']')
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
module ToSource
|
|
2
|
+
class Emitter
|
|
3
|
+
# Emitter for default arguments
|
|
4
|
+
class DefaultArguments < self
|
|
5
|
+
|
|
6
|
+
handle(Rubinius::AST::DefaultArguments)
|
|
7
|
+
|
|
8
|
+
private
|
|
9
|
+
|
|
10
|
+
# Perform dispatch
|
|
11
|
+
#
|
|
12
|
+
# @return [undefined]
|
|
13
|
+
#
|
|
14
|
+
# @api private
|
|
15
|
+
#
|
|
16
|
+
def dispatch
|
|
17
|
+
run(Util::DelimitedBody, node.arguments)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|