unparser 0.0.1
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.
- checksums.yaml +7 -0
- data/.circle.yml +4 -0
- data/.gitignore +2 -0
- data/.rspec +3 -0
- data/.travis.yml +16 -0
- data/Changelog.md +3 -0
- data/Gemfile +6 -0
- data/Gemfile.devtools +60 -0
- data/Guardfile +18 -0
- data/README.md +41 -0
- data/Rakefile +24 -0
- data/TODO +1 -0
- data/config/devtools.yml +2 -0
- data/config/flay.yml +3 -0
- data/config/flog.yml +2 -0
- data/config/mutant.yml +3 -0
- data/config/reek.yml +107 -0
- data/config/yardstick.yml +2 -0
- data/lib/unparser/buffer.rb +93 -0
- data/lib/unparser/constants.rb +87 -0
- data/lib/unparser/emitter/alias.rb +27 -0
- data/lib/unparser/emitter/argument.rb +154 -0
- data/lib/unparser/emitter/assignment.rb +140 -0
- data/lib/unparser/emitter/begin.rb +179 -0
- data/lib/unparser/emitter/binary.rb +52 -0
- data/lib/unparser/emitter/block.rb +53 -0
- data/lib/unparser/emitter/break.rb +28 -0
- data/lib/unparser/emitter/case.rb +97 -0
- data/lib/unparser/emitter/cbase.rb +22 -0
- data/lib/unparser/emitter/class.rb +72 -0
- data/lib/unparser/emitter/def.rb +107 -0
- data/lib/unparser/emitter/defined.rb +27 -0
- data/lib/unparser/emitter/for.rb +50 -0
- data/lib/unparser/emitter/hookexe.rb +42 -0
- data/lib/unparser/emitter/if.rb +85 -0
- data/lib/unparser/emitter/literal/composed.rb +64 -0
- data/lib/unparser/emitter/literal/dynamic.rb +54 -0
- data/lib/unparser/emitter/literal/dynamic_body.rb +109 -0
- data/lib/unparser/emitter/literal/execute_string.rb +38 -0
- data/lib/unparser/emitter/literal/primitive.rb +49 -0
- data/lib/unparser/emitter/literal/range.rb +33 -0
- data/lib/unparser/emitter/literal/regexp.rb +96 -0
- data/lib/unparser/emitter/literal/singleton.rb +24 -0
- data/lib/unparser/emitter/literal.rb +7 -0
- data/lib/unparser/emitter/module.rb +37 -0
- data/lib/unparser/emitter/next.rb +22 -0
- data/lib/unparser/emitter/not.rb +25 -0
- data/lib/unparser/emitter/op_assign.rb +63 -0
- data/lib/unparser/emitter/redo.rb +22 -0
- data/lib/unparser/emitter/repetition.rb +33 -0
- data/lib/unparser/emitter/retry.rb +22 -0
- data/lib/unparser/emitter/return.rb +38 -0
- data/lib/unparser/emitter/root.rb +7 -0
- data/lib/unparser/emitter/send/binary.rb +100 -0
- data/lib/unparser/emitter/send/index.rb +82 -0
- data/lib/unparser/emitter/send/unary.rb +29 -0
- data/lib/unparser/emitter/send.rb +273 -0
- data/lib/unparser/emitter/splat.rb +24 -0
- data/lib/unparser/emitter/super.rb +46 -0
- data/lib/unparser/emitter/undef.rb +25 -0
- data/lib/unparser/emitter/variable.rb +83 -0
- data/lib/unparser/emitter/yield.rb +28 -0
- data/lib/unparser/emitter.rb +308 -0
- data/lib/unparser.rb +87 -0
- data/spec/integration/unparser/spike_spec.rb +914 -0
- data/spec/spec_helper.rb +13 -0
- data/spec/unit/unparser/buffer/append_spec.rb +23 -0
- data/spec/unit/unparser/buffer/content_spec.rb +38 -0
- data/spec/unit/unparser/buffer/indent_spec.rb +18 -0
- data/spec/unit/unparser/buffer/nl_spec.rb +16 -0
- data/spec/unit/unparser/buffer/unindent_spec.rb +18 -0
- data/spec/unit/unparser/class_methods/unparse_spec.rb +16 -0
- data/spec/unit/unparser/emitter/class_methods/handle_spec.rb +17 -0
- data/spec/unit/unparser/emitter/class_methods/visit_spec.rb +37 -0
- data/spec/unit/unparser/emitter/source_map/class_methods/emit_spec.rb +20 -0
- data/unparser.gemspec +24 -0
- metadata +201 -0
@@ -0,0 +1,140 @@
|
|
1
|
+
module Unparser
|
2
|
+
class Emitter
|
3
|
+
|
4
|
+
# Base class for assignment emitters
|
5
|
+
class Assignment < self
|
6
|
+
|
7
|
+
private
|
8
|
+
|
9
|
+
# Perform dispatch
|
10
|
+
#
|
11
|
+
# @return [undefined]
|
12
|
+
#
|
13
|
+
# @api private
|
14
|
+
#
|
15
|
+
def dispatch
|
16
|
+
emit_left
|
17
|
+
emit_right
|
18
|
+
end
|
19
|
+
|
20
|
+
# Single assignment emitter
|
21
|
+
class Single < self
|
22
|
+
|
23
|
+
# Emit right
|
24
|
+
#
|
25
|
+
# @return [undefined]
|
26
|
+
#
|
27
|
+
# @api private
|
28
|
+
#
|
29
|
+
def emit_right
|
30
|
+
right = right_node
|
31
|
+
if right
|
32
|
+
write(WS, O_ASN, WS)
|
33
|
+
visit(right)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
abstract_method :emit_left
|
38
|
+
|
39
|
+
# Variable assignment emitter
|
40
|
+
class Variable < self
|
41
|
+
|
42
|
+
handle :lvasgn, :ivasgn, :cvasgn, :gvasgn
|
43
|
+
|
44
|
+
children :name, :right_node
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
# Emit left
|
49
|
+
#
|
50
|
+
# @return [undefined]
|
51
|
+
#
|
52
|
+
# @api private
|
53
|
+
#
|
54
|
+
def emit_left
|
55
|
+
write(name.to_s)
|
56
|
+
end
|
57
|
+
|
58
|
+
end # Variable
|
59
|
+
|
60
|
+
# Constant assignment emitter
|
61
|
+
class Constant < self
|
62
|
+
|
63
|
+
|
64
|
+
handle :casgn
|
65
|
+
|
66
|
+
children :base, :name, :right_node
|
67
|
+
|
68
|
+
private
|
69
|
+
|
70
|
+
# Emit left
|
71
|
+
#
|
72
|
+
# @return [undefined]
|
73
|
+
#
|
74
|
+
# @api private
|
75
|
+
#
|
76
|
+
def emit_left
|
77
|
+
visit(base) if base
|
78
|
+
write(name.to_s)
|
79
|
+
end
|
80
|
+
|
81
|
+
end # Constant
|
82
|
+
end # Single
|
83
|
+
|
84
|
+
# Multiple assignment
|
85
|
+
class Multiple < self
|
86
|
+
|
87
|
+
handle :masgn
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
# Emit left
|
92
|
+
#
|
93
|
+
# @return [undefined]
|
94
|
+
#
|
95
|
+
# @api private
|
96
|
+
#
|
97
|
+
def emit_left
|
98
|
+
visit(first_child)
|
99
|
+
end
|
100
|
+
|
101
|
+
# Emit right
|
102
|
+
#
|
103
|
+
# @return [undefined]
|
104
|
+
#
|
105
|
+
# @api private
|
106
|
+
#
|
107
|
+
def emit_right
|
108
|
+
write(WS, O_ASN, WS)
|
109
|
+
right = children.last
|
110
|
+
case right.type
|
111
|
+
when :array
|
112
|
+
delimited(right.children)
|
113
|
+
else
|
114
|
+
visit(right)
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end # Multiple
|
119
|
+
|
120
|
+
# Emitter for multiple assignment left hand side
|
121
|
+
class MLHS < Emitter
|
122
|
+
|
123
|
+
handle :mlhs
|
124
|
+
|
125
|
+
private
|
126
|
+
|
127
|
+
# Perform dispatch
|
128
|
+
#
|
129
|
+
# @return [undefined]
|
130
|
+
#
|
131
|
+
# @api private
|
132
|
+
#
|
133
|
+
def dispatch
|
134
|
+
delimited(children)
|
135
|
+
end
|
136
|
+
end # MLHS
|
137
|
+
|
138
|
+
end # Assignment
|
139
|
+
end # Emitter
|
140
|
+
end # Unparser
|
@@ -0,0 +1,179 @@
|
|
1
|
+
module Unparser
|
2
|
+
class Emitter
|
3
|
+
|
4
|
+
# Emitter for rescue nodes
|
5
|
+
class Rescue < self
|
6
|
+
|
7
|
+
handle :rescue
|
8
|
+
|
9
|
+
children :body
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
# Perform dispatch
|
14
|
+
#
|
15
|
+
# @return [undefined]
|
16
|
+
#
|
17
|
+
# @api private
|
18
|
+
#
|
19
|
+
def dispatch
|
20
|
+
k_begin
|
21
|
+
indented { visit(body) }
|
22
|
+
children[1..-2].each do |child|
|
23
|
+
visit(child)
|
24
|
+
end
|
25
|
+
k_end
|
26
|
+
end
|
27
|
+
end # Rescue
|
28
|
+
|
29
|
+
# Emitter for enusre nodes
|
30
|
+
class Ensure < self
|
31
|
+
|
32
|
+
handle :ensure
|
33
|
+
|
34
|
+
children :body, :ensure_body
|
35
|
+
|
36
|
+
private
|
37
|
+
|
38
|
+
# Perform dispatch
|
39
|
+
#
|
40
|
+
# @return [undefined]
|
41
|
+
#
|
42
|
+
# @api private
|
43
|
+
#
|
44
|
+
def dispatch
|
45
|
+
k_begin
|
46
|
+
emit_body
|
47
|
+
write(K_ENSURE)
|
48
|
+
emit_ensure_body
|
49
|
+
k_end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Emit body
|
53
|
+
#
|
54
|
+
# @return [undefined]
|
55
|
+
#
|
56
|
+
# @api private
|
57
|
+
#
|
58
|
+
def emit_body
|
59
|
+
indented { visit(body) }
|
60
|
+
end
|
61
|
+
|
62
|
+
# Emit ensure body
|
63
|
+
#
|
64
|
+
# @return [undefined]
|
65
|
+
#
|
66
|
+
# @api private
|
67
|
+
#
|
68
|
+
def emit_ensure_body
|
69
|
+
indented { visit(ensure_body) }
|
70
|
+
end
|
71
|
+
|
72
|
+
end # Ensure
|
73
|
+
|
74
|
+
# Emitter for rescue body nodes
|
75
|
+
class Resbody < self
|
76
|
+
|
77
|
+
handle :resbody
|
78
|
+
|
79
|
+
children :exception, :assignment, :body
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
# Perform dispatch
|
84
|
+
#
|
85
|
+
# @return [undefined]
|
86
|
+
#
|
87
|
+
# @api private
|
88
|
+
#
|
89
|
+
def dispatch
|
90
|
+
write(K_RESCUE)
|
91
|
+
emit_exception
|
92
|
+
emit_assignment
|
93
|
+
indented { visit(body) }
|
94
|
+
end
|
95
|
+
|
96
|
+
# Emit exception
|
97
|
+
#
|
98
|
+
# @return [undefined]
|
99
|
+
#
|
100
|
+
# @api private
|
101
|
+
#
|
102
|
+
def emit_exception
|
103
|
+
return unless exception
|
104
|
+
ws
|
105
|
+
delimited(exception.children)
|
106
|
+
end
|
107
|
+
|
108
|
+
# Emit assignment
|
109
|
+
#
|
110
|
+
# @return [undefined]
|
111
|
+
#
|
112
|
+
# @api private
|
113
|
+
#
|
114
|
+
def emit_assignment
|
115
|
+
return unless assignment
|
116
|
+
write(WS, O_ASR, WS)
|
117
|
+
visit(assignment)
|
118
|
+
end
|
119
|
+
|
120
|
+
end # Resbody
|
121
|
+
|
122
|
+
# Emitter for begin nodes
|
123
|
+
class Begin < self
|
124
|
+
|
125
|
+
handle :begin
|
126
|
+
|
127
|
+
private
|
128
|
+
|
129
|
+
# Perform dispatch
|
130
|
+
#
|
131
|
+
# @return [undefined]
|
132
|
+
#
|
133
|
+
# @api private
|
134
|
+
#
|
135
|
+
def dispatch
|
136
|
+
case children.length
|
137
|
+
when 0
|
138
|
+
write(K_NIL)
|
139
|
+
when 1
|
140
|
+
visit(first_child)
|
141
|
+
else
|
142
|
+
emit_normal
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
# Emit normal begin block
|
147
|
+
#
|
148
|
+
# @return [undefined]
|
149
|
+
#
|
150
|
+
# @api private
|
151
|
+
#
|
152
|
+
def emit_normal
|
153
|
+
unless parent.needs_begin?
|
154
|
+
emit_inner
|
155
|
+
else
|
156
|
+
k_begin
|
157
|
+
indented { emit_inner }
|
158
|
+
k_end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
|
162
|
+
# Emit inner nodes
|
163
|
+
#
|
164
|
+
# @return [undefined]
|
165
|
+
#
|
166
|
+
# @api private
|
167
|
+
#
|
168
|
+
def emit_inner
|
169
|
+
childs = children
|
170
|
+
max = childs.length - 1
|
171
|
+
childs.each_with_index do |child, index|
|
172
|
+
visit(child)
|
173
|
+
nl if index < max
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
end # Body
|
178
|
+
end # Emitter
|
179
|
+
end # Unparser
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Unparser
|
2
|
+
class Emitter
|
3
|
+
# Base class for binary emitters
|
4
|
+
class Binary < self
|
5
|
+
|
6
|
+
handle :or, :and
|
7
|
+
children :left, :right
|
8
|
+
|
9
|
+
MAP = {
|
10
|
+
:or => O_OR,
|
11
|
+
:and => O_AND
|
12
|
+
}.freeze
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
# Perform dispatch
|
17
|
+
#
|
18
|
+
# @return [undefined]
|
19
|
+
#
|
20
|
+
# @api private
|
21
|
+
#
|
22
|
+
def dispatch
|
23
|
+
parentheses do
|
24
|
+
emit_left
|
25
|
+
write(WS, MAP.fetch(node.type), WS)
|
26
|
+
emit_right
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# Emit left
|
31
|
+
#
|
32
|
+
# @return [undefined]
|
33
|
+
#
|
34
|
+
# @api private
|
35
|
+
#
|
36
|
+
def emit_left
|
37
|
+
parentheses { visit(left) }
|
38
|
+
end
|
39
|
+
|
40
|
+
# Emit right
|
41
|
+
#
|
42
|
+
# @return [undefined]
|
43
|
+
#
|
44
|
+
# @api private
|
45
|
+
#
|
46
|
+
def emit_right
|
47
|
+
parentheses { visit(right) }
|
48
|
+
end
|
49
|
+
|
50
|
+
end # Binary
|
51
|
+
end # Emitter
|
52
|
+
end # Unparser
|
@@ -0,0 +1,53 @@
|
|
1
|
+
module Unparser
|
2
|
+
class Emitter
|
3
|
+
|
4
|
+
# Block emitter
|
5
|
+
class Block < self
|
6
|
+
|
7
|
+
handle :block
|
8
|
+
|
9
|
+
children :send, :arguments, :body
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
# Perform dispatch
|
14
|
+
#
|
15
|
+
# @return [undefined]
|
16
|
+
#
|
17
|
+
# @api private
|
18
|
+
#
|
19
|
+
def dispatch
|
20
|
+
visit(send)
|
21
|
+
write(WS, K_DO)
|
22
|
+
emit_block_arguments
|
23
|
+
indented { emit_body }
|
24
|
+
k_end
|
25
|
+
end
|
26
|
+
|
27
|
+
# Emit arguments
|
28
|
+
#
|
29
|
+
# @return [undefined]
|
30
|
+
#
|
31
|
+
# @api private
|
32
|
+
#
|
33
|
+
def emit_block_arguments
|
34
|
+
return if arguments.children.empty?
|
35
|
+
ws
|
36
|
+
parentheses(O_PIPE, O_PIPE) do
|
37
|
+
visit(arguments)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Emit body
|
42
|
+
#
|
43
|
+
# @return [undefined]
|
44
|
+
#
|
45
|
+
# @api private
|
46
|
+
#
|
47
|
+
def emit_body
|
48
|
+
visit(body)
|
49
|
+
end
|
50
|
+
|
51
|
+
end # Block
|
52
|
+
end # Emitter
|
53
|
+
end # Unparser
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Unparser
|
2
|
+
class Emitter
|
3
|
+
# Emitter for break nodes
|
4
|
+
class Break < self
|
5
|
+
|
6
|
+
handle :break
|
7
|
+
|
8
|
+
children :arguments
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
# Perform dispatch
|
13
|
+
#
|
14
|
+
# @return [undefined]
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
#
|
18
|
+
def dispatch
|
19
|
+
write(K_BREAK)
|
20
|
+
return unless arguments
|
21
|
+
parentheses do
|
22
|
+
visit(arguments)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end # Break
|
27
|
+
end # Emitter
|
28
|
+
end # Unparser
|
@@ -0,0 +1,97 @@
|
|
1
|
+
module Unparser
|
2
|
+
class Emitter
|
3
|
+
# Emitter for case nodes
|
4
|
+
class Case < self
|
5
|
+
|
6
|
+
handle :case
|
7
|
+
|
8
|
+
children :condition
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
# Perform dispatch
|
13
|
+
#
|
14
|
+
# @return [undefined]
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
#
|
18
|
+
def dispatch
|
19
|
+
write(K_CASE)
|
20
|
+
emit_condition
|
21
|
+
emit_whens
|
22
|
+
emit_else
|
23
|
+
k_end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Emit else
|
27
|
+
#
|
28
|
+
# @return [undefined]
|
29
|
+
#
|
30
|
+
# @api private
|
31
|
+
#
|
32
|
+
def emit_else
|
33
|
+
else_branch = children.last
|
34
|
+
return unless else_branch
|
35
|
+
write(K_ELSE)
|
36
|
+
indented { visit(else_branch) }
|
37
|
+
end
|
38
|
+
|
39
|
+
# Emit whens
|
40
|
+
#
|
41
|
+
# @return [undefined]
|
42
|
+
#
|
43
|
+
# @api private
|
44
|
+
#
|
45
|
+
def emit_whens
|
46
|
+
nl
|
47
|
+
children[1..-2].each do |child|
|
48
|
+
visit(child)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# Emit condition
|
53
|
+
#
|
54
|
+
# @return [undefined]
|
55
|
+
#
|
56
|
+
# @api private
|
57
|
+
#
|
58
|
+
def emit_condition
|
59
|
+
return unless condition
|
60
|
+
write(WS)
|
61
|
+
visit(condition)
|
62
|
+
end
|
63
|
+
|
64
|
+
end # Case
|
65
|
+
|
66
|
+
# Emitter for when nodes
|
67
|
+
class When < self
|
68
|
+
|
69
|
+
handle :when
|
70
|
+
|
71
|
+
private
|
72
|
+
|
73
|
+
# Perform dispatch
|
74
|
+
#
|
75
|
+
# @return [undefined]
|
76
|
+
#
|
77
|
+
# @api private
|
78
|
+
#
|
79
|
+
def dispatch
|
80
|
+
write(K_WHEN, WS)
|
81
|
+
emit_captures
|
82
|
+
indented { visit(children.last) }
|
83
|
+
end
|
84
|
+
|
85
|
+
# Emit captures
|
86
|
+
#
|
87
|
+
# @return [undefined]
|
88
|
+
#
|
89
|
+
# @api private
|
90
|
+
#
|
91
|
+
def emit_captures
|
92
|
+
delimited(children[0..-2])
|
93
|
+
end
|
94
|
+
|
95
|
+
end
|
96
|
+
end # Emitter
|
97
|
+
end # Unparser
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Unparser
|
2
|
+
class Emitter
|
3
|
+
# Emitter for toplevel constant reference nodes
|
4
|
+
class CBase < self
|
5
|
+
|
6
|
+
handle :cbase
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
# Perform dispatch
|
11
|
+
#
|
12
|
+
# @return [undefined]
|
13
|
+
#
|
14
|
+
# @api private
|
15
|
+
#
|
16
|
+
def dispatch
|
17
|
+
write(O_DCL)
|
18
|
+
end
|
19
|
+
|
20
|
+
end # CBase
|
21
|
+
end # Emitter
|
22
|
+
end # Unparser
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module Unparser
|
2
|
+
class Emitter
|
3
|
+
# Emitter for class nodes
|
4
|
+
class Class < self
|
5
|
+
|
6
|
+
handle :class
|
7
|
+
|
8
|
+
children :name, :superclass, :body
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
# Perform dispatch
|
13
|
+
#
|
14
|
+
# @return [undefined]
|
15
|
+
#
|
16
|
+
# @api private
|
17
|
+
#
|
18
|
+
def dispatch
|
19
|
+
write(K_CLASS, WS)
|
20
|
+
visit(name)
|
21
|
+
emit_superclass
|
22
|
+
emit_body
|
23
|
+
k_end
|
24
|
+
end
|
25
|
+
|
26
|
+
# Emit superclass
|
27
|
+
#
|
28
|
+
# @return [undefined]
|
29
|
+
#
|
30
|
+
# @api private
|
31
|
+
#
|
32
|
+
def emit_superclass
|
33
|
+
return unless superclass
|
34
|
+
write(WS, O_LT, WS)
|
35
|
+
visit(superclass)
|
36
|
+
end
|
37
|
+
|
38
|
+
# Emit body
|
39
|
+
#
|
40
|
+
# @return [undefined]
|
41
|
+
#
|
42
|
+
# @api private
|
43
|
+
#
|
44
|
+
def emit_body
|
45
|
+
emit_non_nil_body(body)
|
46
|
+
end
|
47
|
+
|
48
|
+
end # Class
|
49
|
+
|
50
|
+
# Emitter for sclass nodes
|
51
|
+
class SClass < self
|
52
|
+
|
53
|
+
handle :sclass
|
54
|
+
|
55
|
+
children :object, :body
|
56
|
+
|
57
|
+
# Perform dispatch
|
58
|
+
#
|
59
|
+
# @return [undefined]
|
60
|
+
#
|
61
|
+
# @api private
|
62
|
+
#
|
63
|
+
def dispatch
|
64
|
+
write(K_CLASS, WS, O_DLT, WS)
|
65
|
+
visit(object)
|
66
|
+
emit_non_nil_body(body)
|
67
|
+
k_end
|
68
|
+
end
|
69
|
+
|
70
|
+
end # SClass
|
71
|
+
end # Emitter
|
72
|
+
end # Unparser
|