unparser 0.4.7 → 0.6.7
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 +4 -4
- data/README.md +40 -9
- data/bin/unparser +2 -2
- data/lib/unparser/abstract_type.rb +121 -0
- data/lib/unparser/adamantium/method_builder.rb +111 -0
- data/lib/unparser/adamantium.rb +150 -0
- data/lib/unparser/anima/attribute.rb +59 -0
- data/lib/unparser/anima/error.rb +23 -0
- data/lib/unparser/anima.rb +184 -0
- data/lib/unparser/ast/local_variable_scope.rb +6 -76
- data/lib/unparser/ast.rb +1 -3
- data/lib/unparser/buffer.rb +14 -25
- data/lib/unparser/cli.rb +85 -77
- data/lib/unparser/{cli/color.rb → color.rb} +4 -14
- data/lib/unparser/comments.rb +0 -26
- data/lib/unparser/concord.rb +114 -0
- data/lib/unparser/constants.rb +4 -53
- data/lib/unparser/diff.rb +98 -0
- data/lib/unparser/dsl.rb +0 -32
- data/lib/unparser/either.rb +153 -0
- data/lib/unparser/emitter/alias.rb +2 -8
- data/lib/unparser/emitter/args.rb +45 -0
- data/lib/unparser/emitter/argument.rb +13 -169
- data/lib/unparser/emitter/array.rb +27 -0
- data/lib/unparser/emitter/array_pattern.rb +29 -0
- data/lib/unparser/emitter/assignment.rb +36 -127
- data/lib/unparser/emitter/begin.rb +9 -84
- data/lib/unparser/emitter/binary.rb +7 -20
- data/lib/unparser/emitter/block.rb +57 -41
- data/lib/unparser/emitter/case.rb +6 -48
- data/lib/unparser/emitter/case_guard.rb +27 -0
- data/lib/unparser/emitter/case_match.rb +40 -0
- data/lib/unparser/emitter/cbase.rb +1 -3
- data/lib/unparser/emitter/class.rb +6 -26
- data/lib/unparser/emitter/const_pattern.rb +24 -0
- data/lib/unparser/emitter/def.rb +7 -51
- data/lib/unparser/emitter/defined.rb +2 -12
- data/lib/unparser/emitter/dstr.rb +22 -0
- data/lib/unparser/emitter/dsym.rb +41 -0
- data/lib/unparser/emitter/find_pattern.rb +18 -0
- data/lib/unparser/emitter/flipflop.rb +11 -10
- data/lib/unparser/emitter/float.rb +29 -0
- data/lib/unparser/emitter/flow_modifier.rb +15 -53
- data/lib/unparser/emitter/for.rb +5 -19
- data/lib/unparser/emitter/hash.rb +36 -0
- data/lib/unparser/emitter/hash_pattern.rb +67 -0
- data/lib/unparser/emitter/hookexe.rb +5 -11
- data/lib/unparser/emitter/if.rb +15 -71
- data/lib/unparser/emitter/in_match.rb +21 -0
- data/lib/unparser/emitter/in_pattern.rb +36 -0
- data/lib/unparser/emitter/index.rb +22 -89
- data/lib/unparser/emitter/kwargs.rb +13 -0
- data/lib/unparser/emitter/kwbegin.rb +31 -0
- data/lib/unparser/emitter/lambda.rb +0 -8
- data/lib/unparser/emitter/masgn.rb +20 -0
- data/lib/unparser/emitter/match.rb +3 -17
- data/lib/unparser/emitter/match_alt.rb +23 -0
- data/lib/unparser/emitter/match_as.rb +21 -0
- data/lib/unparser/emitter/match_pattern.rb +30 -0
- data/lib/unparser/emitter/match_pattern_p.rb +20 -0
- data/lib/unparser/emitter/match_rest.rb +33 -0
- data/lib/unparser/emitter/match_var.rb +19 -0
- data/lib/unparser/emitter/mlhs.rb +40 -0
- data/lib/unparser/emitter/module.rb +3 -9
- data/lib/unparser/emitter/op_assign.rb +14 -29
- data/lib/unparser/emitter/pair.rb +33 -0
- data/lib/unparser/emitter/pin.rb +19 -0
- data/lib/unparser/emitter/primitive.rb +93 -0
- data/lib/unparser/emitter/range.rb +35 -0
- data/lib/unparser/emitter/regexp.rb +35 -0
- data/lib/unparser/emitter/repetition.rb +17 -57
- data/lib/unparser/emitter/rescue.rb +1 -97
- data/lib/unparser/emitter/root.rb +17 -1
- data/lib/unparser/emitter/send.rb +10 -219
- data/lib/unparser/emitter/simple.rb +33 -0
- data/lib/unparser/emitter/splat.rb +13 -19
- data/lib/unparser/emitter/super.rb +1 -29
- data/lib/unparser/emitter/undef.rb +1 -9
- data/lib/unparser/emitter/variable.rb +1 -31
- data/lib/unparser/emitter/xstr.rb +72 -0
- data/lib/unparser/emitter/yield.rb +1 -9
- data/lib/unparser/emitter.rb +24 -425
- data/lib/unparser/equalizer.rb +98 -0
- data/lib/unparser/generation.rb +252 -0
- data/lib/unparser/node_details/send.rb +65 -0
- data/lib/unparser/node_details.rb +21 -0
- data/lib/unparser/node_helpers.rb +48 -6
- data/lib/unparser/validation.rb +172 -0
- data/lib/unparser/writer/binary.rb +99 -0
- data/lib/unparser/writer/dynamic_string.rb +211 -0
- data/lib/unparser/writer/resbody.rb +40 -0
- data/lib/unparser/writer/rescue.rb +43 -0
- data/lib/unparser/{emitter → writer}/send/attribute_assignment.rb +11 -26
- data/lib/unparser/writer/send/binary.rb +27 -0
- data/lib/unparser/writer/send/conditional.rb +25 -0
- data/lib/unparser/writer/send/regular.rb +33 -0
- data/lib/unparser/{emitter → writer}/send/unary.rb +10 -17
- data/lib/unparser/writer/send.rb +115 -0
- data/lib/unparser/writer.rb +15 -0
- data/lib/unparser.rb +161 -77
- metadata +100 -157
- data/.circleci/config.yml +0 -49
- data/.gitignore +0 -37
- data/.rspec +0 -4
- data/.rubocop.yml +0 -9
- data/Changelog.md +0 -156
- data/Gemfile +0 -9
- data/Gemfile.lock +0 -181
- data/LICENSE +0 -20
- data/Rakefile +0 -22
- data/config/devtools.yml +0 -2
- data/config/flay.yml +0 -3
- data/config/flog.yml +0 -2
- data/config/mutant.yml +0 -6
- data/config/reek.yml +0 -98
- data/config/rubocop.yml +0 -122
- data/config/yardstick.yml +0 -2
- data/lib/unparser/cli/differ.rb +0 -152
- data/lib/unparser/cli/source.rb +0 -267
- data/lib/unparser/emitter/empty.rb +0 -23
- data/lib/unparser/emitter/ensure.rb +0 -37
- data/lib/unparser/emitter/literal/array.rb +0 -29
- data/lib/unparser/emitter/literal/dynamic.rb +0 -53
- data/lib/unparser/emitter/literal/dynamic_body.rb +0 -132
- data/lib/unparser/emitter/literal/execute_string.rb +0 -38
- data/lib/unparser/emitter/literal/hash.rb +0 -156
- data/lib/unparser/emitter/literal/primitive.rb +0 -145
- data/lib/unparser/emitter/literal/range.rb +0 -36
- data/lib/unparser/emitter/literal/regexp.rb +0 -114
- data/lib/unparser/emitter/literal/singleton.rb +0 -26
- data/lib/unparser/emitter/literal.rb +0 -10
- data/lib/unparser/emitter/meta.rb +0 -16
- data/lib/unparser/emitter/redo.rb +0 -25
- data/lib/unparser/emitter/resbody.rb +0 -76
- data/lib/unparser/emitter/retry.rb +0 -25
- data/lib/unparser/emitter/send/binary.rb +0 -57
- data/lib/unparser/emitter/send/conditional.rb +0 -40
- data/lib/unparser/emitter/send/regular.rb +0 -40
- data/lib/unparser/preprocessor.rb +0 -159
- data/spec/integration/unparser/corpus_spec.rb +0 -111
- data/spec/integrations.yml +0 -92
- data/spec/spec_helper.rb +0 -20
- data/spec/unit/unparser/buffer/append_spec.rb +0 -24
- data/spec/unit/unparser/buffer/append_without_prefix_spec.rb +0 -23
- data/spec/unit/unparser/buffer/capture_content_spec.rb +0 -17
- data/spec/unit/unparser/buffer/content_spec.rb +0 -38
- data/spec/unit/unparser/buffer/fresh_line_spec.rb +0 -20
- data/spec/unit/unparser/buffer/indent_spec.rb +0 -20
- data/spec/unit/unparser/buffer/nl_spec.rb +0 -16
- data/spec/unit/unparser/buffer/unindent_spec.rb +0 -20
- data/spec/unit/unparser/comments/consume_spec.rb +0 -22
- data/spec/unit/unparser/comments/take_all_spec.rb +0 -19
- data/spec/unit/unparser/comments/take_before_spec.rb +0 -46
- data/spec/unit/unparser/comments/take_eol_comments_spec.rb +0 -32
- data/spec/unit/unparser/emitter/class_methods/handle_spec.rb +0 -17
- data/spec/unit/unparser_spec.rb +0 -1849
- data/unparser.gemspec +0 -32
|
@@ -2,121 +2,21 @@
|
|
|
2
2
|
|
|
3
3
|
module Unparser
|
|
4
4
|
class Emitter
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class ArgExpr < self
|
|
8
|
-
|
|
9
|
-
handle :arg_expr
|
|
10
|
-
|
|
11
|
-
children :body
|
|
12
|
-
|
|
13
|
-
private
|
|
14
|
-
|
|
15
|
-
# Perform dispatch
|
|
16
|
-
#
|
|
17
|
-
# @return [undefined]
|
|
18
|
-
#
|
|
19
|
-
# @api private
|
|
20
|
-
#
|
|
21
|
-
def dispatch
|
|
22
|
-
visit_parentheses(body)
|
|
23
|
-
end
|
|
24
|
-
end # ArgExpr
|
|
25
|
-
|
|
26
|
-
# Arguments emitter
|
|
27
|
-
class Arguments < self
|
|
28
|
-
include Terminated
|
|
29
|
-
|
|
30
|
-
handle :args
|
|
31
|
-
|
|
32
|
-
SHADOWARGS = ->(node) { node.type.equal?(:shadowarg) }.freeze
|
|
33
|
-
ARG = ->(node) { node.type.equal?(:arg) }.freeze
|
|
34
|
-
|
|
35
|
-
private
|
|
36
|
-
|
|
37
|
-
# Perform dispatch
|
|
38
|
-
#
|
|
39
|
-
# @return [undefined]
|
|
40
|
-
#
|
|
41
|
-
# @api private
|
|
42
|
-
#
|
|
43
|
-
def dispatch
|
|
44
|
-
delimited(normal_arguments)
|
|
45
|
-
|
|
46
|
-
write(', ') if procarg_disambiguator?
|
|
47
|
-
|
|
48
|
-
return if shadowargs.empty?
|
|
49
|
-
|
|
50
|
-
write('; ')
|
|
51
|
-
delimited(shadowargs)
|
|
52
|
-
end
|
|
53
|
-
|
|
54
|
-
# Test for procarg_disambiguator
|
|
55
|
-
#
|
|
56
|
-
# @return [Boolean]
|
|
57
|
-
#
|
|
58
|
-
# @api private
|
|
59
|
-
#
|
|
60
|
-
def procarg_disambiguator?
|
|
61
|
-
regular_block? && normal_arguments.all?(&ARG) && normal_arguments.one?
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# Test for regular block
|
|
65
|
-
#
|
|
66
|
-
# @return [Boolean]
|
|
67
|
-
#
|
|
68
|
-
# @api private
|
|
69
|
-
#
|
|
70
|
-
def regular_block?
|
|
71
|
-
parent_type.equal?(:block) && !parent.node.children.first.type.equal?(:lambda)
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
# Return normal arguments
|
|
75
|
-
#
|
|
76
|
-
# @return [Enumerable<Parser::AST::Node>]
|
|
77
|
-
#
|
|
78
|
-
# @api private
|
|
79
|
-
#
|
|
80
|
-
def normal_arguments
|
|
81
|
-
children.reject(&SHADOWARGS)
|
|
82
|
-
end
|
|
83
|
-
memoize :normal_arguments
|
|
84
|
-
|
|
85
|
-
# Return shadow args
|
|
86
|
-
#
|
|
87
|
-
# @return [Enumerable<Parser::AST::Node>]
|
|
88
|
-
#
|
|
89
|
-
# @api private
|
|
90
|
-
#
|
|
91
|
-
def shadowargs
|
|
92
|
-
children.select(&SHADOWARGS)
|
|
93
|
-
end
|
|
94
|
-
memoize :shadowargs
|
|
95
|
-
|
|
96
|
-
end # Arguments
|
|
97
|
-
|
|
98
|
-
# Emitter for block and kwrestarg arguments
|
|
99
|
-
class Morearg < self
|
|
100
|
-
include Terminated
|
|
101
|
-
|
|
5
|
+
# Emitter for forwarding arguments
|
|
6
|
+
class ForwardArg < self
|
|
102
7
|
MAP = {
|
|
103
|
-
blockarg:
|
|
104
|
-
|
|
8
|
+
blockarg: '&',
|
|
9
|
+
forwarded_kwrestarg: '**',
|
|
10
|
+
forwarded_restarg: '*',
|
|
11
|
+
kwrestarg: '**'
|
|
105
12
|
}.freeze
|
|
106
13
|
|
|
107
|
-
handle
|
|
108
|
-
handle :kwrestarg
|
|
14
|
+
handle(*MAP.keys)
|
|
109
15
|
|
|
110
16
|
children :name
|
|
111
17
|
|
|
112
18
|
private
|
|
113
19
|
|
|
114
|
-
# Perform dispatch
|
|
115
|
-
#
|
|
116
|
-
# @return [undefined]
|
|
117
|
-
#
|
|
118
|
-
# @api private
|
|
119
|
-
#
|
|
120
20
|
def dispatch
|
|
121
21
|
write(MAP.fetch(node_type), name.to_s)
|
|
122
22
|
end
|
|
@@ -125,44 +25,28 @@ module Unparser
|
|
|
125
25
|
|
|
126
26
|
# Optional argument emitter
|
|
127
27
|
class Optarg < self
|
|
128
|
-
include Terminated
|
|
129
|
-
|
|
130
28
|
handle :optarg
|
|
131
29
|
|
|
132
30
|
children :name, :value
|
|
133
31
|
|
|
134
32
|
private
|
|
135
33
|
|
|
136
|
-
# Perform dispatch
|
|
137
|
-
#
|
|
138
|
-
# @return [undefined]
|
|
139
|
-
#
|
|
140
|
-
# @api private
|
|
141
|
-
#
|
|
142
34
|
def dispatch
|
|
143
|
-
write(name.to_s,
|
|
35
|
+
write(name.to_s, ' = ')
|
|
144
36
|
visit(value)
|
|
145
37
|
end
|
|
146
38
|
end
|
|
147
39
|
|
|
148
40
|
# Optional keyword argument emitter
|
|
149
41
|
class KeywordOptional < self
|
|
150
|
-
include Terminated
|
|
151
|
-
|
|
152
42
|
handle :kwoptarg
|
|
153
43
|
|
|
154
44
|
children :name, :value
|
|
155
45
|
|
|
156
46
|
private
|
|
157
47
|
|
|
158
|
-
# Perform dispatch
|
|
159
|
-
#
|
|
160
|
-
# @return [undefined]
|
|
161
|
-
#
|
|
162
|
-
# @api private
|
|
163
|
-
#
|
|
164
48
|
def dispatch
|
|
165
|
-
write(name.to_s,
|
|
49
|
+
write(name.to_s, ': ')
|
|
166
50
|
visit(value)
|
|
167
51
|
end
|
|
168
52
|
|
|
@@ -170,64 +54,40 @@ module Unparser
|
|
|
170
54
|
|
|
171
55
|
# Keyword argument emitter
|
|
172
56
|
class Kwarg < self
|
|
173
|
-
include Terminated
|
|
174
|
-
|
|
175
57
|
handle :kwarg
|
|
176
58
|
|
|
177
59
|
children :name
|
|
178
60
|
|
|
179
61
|
private
|
|
180
62
|
|
|
181
|
-
# Perform dispatch
|
|
182
|
-
#
|
|
183
|
-
# @return [undefined]
|
|
184
|
-
#
|
|
185
|
-
# @api private
|
|
186
|
-
#
|
|
187
63
|
def dispatch
|
|
188
|
-
write(name.to_s,
|
|
64
|
+
write(name.to_s, ':')
|
|
189
65
|
end
|
|
190
66
|
|
|
191
67
|
end # Restarg
|
|
192
68
|
|
|
193
69
|
# Rest argument emitter
|
|
194
70
|
class Restarg < self
|
|
195
|
-
include Terminated
|
|
196
|
-
|
|
197
71
|
handle :restarg
|
|
198
72
|
|
|
199
73
|
children :name
|
|
200
74
|
|
|
201
75
|
private
|
|
202
76
|
|
|
203
|
-
# Perform dispatch
|
|
204
|
-
#
|
|
205
|
-
# @return [undefined]
|
|
206
|
-
#
|
|
207
|
-
# @api private
|
|
208
|
-
#
|
|
209
77
|
def dispatch
|
|
210
|
-
write(
|
|
78
|
+
write('*', name.to_s)
|
|
211
79
|
end
|
|
212
80
|
|
|
213
81
|
end # Restarg
|
|
214
82
|
|
|
215
83
|
# Argument emitter
|
|
216
84
|
class Argument < self
|
|
217
|
-
include Terminated
|
|
218
|
-
|
|
219
85
|
handle :arg, :shadowarg
|
|
220
86
|
|
|
221
87
|
children :name
|
|
222
88
|
|
|
223
89
|
private
|
|
224
90
|
|
|
225
|
-
# Perform dispatch
|
|
226
|
-
#
|
|
227
|
-
# @return [undefined]
|
|
228
|
-
#
|
|
229
|
-
# @api private
|
|
230
|
-
#
|
|
231
91
|
def dispatch
|
|
232
92
|
write(name.to_s)
|
|
233
93
|
end
|
|
@@ -236,20 +96,12 @@ module Unparser
|
|
|
236
96
|
|
|
237
97
|
# Progarg emitter
|
|
238
98
|
class Procarg < self
|
|
239
|
-
include Terminated
|
|
240
|
-
|
|
241
99
|
handle :procarg0
|
|
242
100
|
|
|
243
101
|
PARENS = %i[restarg mlhs].freeze
|
|
244
102
|
|
|
245
103
|
private
|
|
246
104
|
|
|
247
|
-
# Perform dispatch
|
|
248
|
-
#
|
|
249
|
-
# @return [undefined]
|
|
250
|
-
#
|
|
251
|
-
# @api private
|
|
252
|
-
#
|
|
253
105
|
def dispatch
|
|
254
106
|
if needs_parens?
|
|
255
107
|
parentheses do
|
|
@@ -269,23 +121,15 @@ module Unparser
|
|
|
269
121
|
|
|
270
122
|
# Block pass node emitter
|
|
271
123
|
class BlockPass < self
|
|
272
|
-
include Terminated
|
|
273
|
-
|
|
274
124
|
handle :block_pass
|
|
275
125
|
|
|
276
126
|
children :name
|
|
277
127
|
|
|
278
128
|
private
|
|
279
129
|
|
|
280
|
-
# Perform dispatch
|
|
281
|
-
#
|
|
282
|
-
# @return [undefined]
|
|
283
|
-
#
|
|
284
|
-
# @api private
|
|
285
|
-
#
|
|
286
130
|
def dispatch
|
|
287
|
-
write(
|
|
288
|
-
visit(name)
|
|
131
|
+
write('&')
|
|
132
|
+
visit(name) if name
|
|
289
133
|
end
|
|
290
134
|
|
|
291
135
|
end # BlockPass
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Unparser
|
|
4
|
+
class Emitter
|
|
5
|
+
# Array literal emitter
|
|
6
|
+
class Array < self
|
|
7
|
+
handle :array
|
|
8
|
+
|
|
9
|
+
def emit_heredoc_reminders
|
|
10
|
+
emitters.each(&:emit_heredoc_reminders)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
private
|
|
14
|
+
|
|
15
|
+
def dispatch
|
|
16
|
+
parentheses('[', ']') do
|
|
17
|
+
delimited(emitters, &:write_to_buffer)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def emitters
|
|
22
|
+
children.map(&method(:emitter))
|
|
23
|
+
end
|
|
24
|
+
memoize :emitters
|
|
25
|
+
end # Array
|
|
26
|
+
end # Emitter
|
|
27
|
+
end # Unparser
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Unparser
|
|
4
|
+
class Emitter
|
|
5
|
+
# Emitter for array patterns
|
|
6
|
+
class ArrayPattern < self
|
|
7
|
+
|
|
8
|
+
handle :array_pattern
|
|
9
|
+
handle :array_pattern_with_tail
|
|
10
|
+
|
|
11
|
+
private
|
|
12
|
+
|
|
13
|
+
def dispatch
|
|
14
|
+
write('[')
|
|
15
|
+
delimited(children, &method(:emit_member))
|
|
16
|
+
write(', ') if node_type.equal?(:array_pattern_with_tail)
|
|
17
|
+
write(']')
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def emit_member(node)
|
|
21
|
+
if n_match_rest?(node)
|
|
22
|
+
writer_with(MatchRest, node).emit_array_pattern
|
|
23
|
+
else
|
|
24
|
+
visit(node)
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end # Pin
|
|
28
|
+
end # Emitter
|
|
29
|
+
end # Unparser
|
|
@@ -5,163 +5,72 @@ module Unparser
|
|
|
5
5
|
|
|
6
6
|
# Base class for assignment emitters
|
|
7
7
|
class Assignment < self
|
|
8
|
+
BINARY_OPERATOR = %i[and or].freeze
|
|
9
|
+
|
|
10
|
+
def symbol_name
|
|
11
|
+
true
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def emit_heredoc_reminders
|
|
15
|
+
return unless right
|
|
16
|
+
|
|
17
|
+
emitter(right).emit_heredoc_reminders
|
|
18
|
+
end
|
|
8
19
|
|
|
9
20
|
private
|
|
10
21
|
|
|
11
|
-
# Perform dispatch
|
|
12
|
-
#
|
|
13
|
-
# @return [undefined]
|
|
14
|
-
#
|
|
15
|
-
# @api private
|
|
16
|
-
#
|
|
17
22
|
def dispatch
|
|
18
23
|
emit_left
|
|
19
24
|
emit_right
|
|
20
25
|
end
|
|
21
26
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
# Test for terminated emit
|
|
26
|
-
#
|
|
27
|
-
# @return [Boolean]
|
|
28
|
-
#
|
|
29
|
-
# @api private
|
|
30
|
-
#
|
|
31
|
-
def terminated?
|
|
32
|
-
right.nil?
|
|
33
|
-
end
|
|
34
|
-
|
|
35
|
-
private
|
|
27
|
+
def emit_right
|
|
28
|
+
return unless right
|
|
36
29
|
|
|
37
|
-
|
|
38
|
-
#
|
|
39
|
-
# @return [undefined]
|
|
40
|
-
#
|
|
41
|
-
# @api private
|
|
42
|
-
#
|
|
43
|
-
def emit_right
|
|
44
|
-
return unless right
|
|
30
|
+
write(' = ')
|
|
45
31
|
|
|
46
|
-
|
|
32
|
+
if BINARY_OPERATOR.include?(right.type)
|
|
33
|
+
writer_with(Writer::Binary, right).emit_operator
|
|
34
|
+
else
|
|
47
35
|
visit(right)
|
|
48
36
|
end
|
|
37
|
+
end
|
|
49
38
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
# Variable assignment emitter
|
|
53
|
-
class Variable < self
|
|
54
|
-
|
|
55
|
-
handle :lvasgn, :ivasgn, :cvasgn, :gvasgn
|
|
56
|
-
|
|
57
|
-
children :name, :right
|
|
58
|
-
|
|
59
|
-
private
|
|
60
|
-
|
|
61
|
-
# Emit left
|
|
62
|
-
#
|
|
63
|
-
# @return [undefined]
|
|
64
|
-
#
|
|
65
|
-
# @api private
|
|
66
|
-
#
|
|
67
|
-
def emit_left
|
|
68
|
-
write(name.to_s)
|
|
69
|
-
end
|
|
70
|
-
|
|
71
|
-
end # Variable
|
|
72
|
-
|
|
73
|
-
# Constant assignment emitter
|
|
74
|
-
class Constant < self
|
|
75
|
-
|
|
76
|
-
handle :casgn
|
|
77
|
-
|
|
78
|
-
children :base, :name, :right
|
|
79
|
-
|
|
80
|
-
private
|
|
81
|
-
|
|
82
|
-
# Emit left
|
|
83
|
-
#
|
|
84
|
-
# @return [undefined]
|
|
85
|
-
#
|
|
86
|
-
# @api private
|
|
87
|
-
#
|
|
88
|
-
def emit_left
|
|
89
|
-
if base
|
|
90
|
-
visit(base)
|
|
91
|
-
write(T_DCL) if base.type != :cbase
|
|
92
|
-
end
|
|
93
|
-
write(name.to_s)
|
|
94
|
-
end
|
|
39
|
+
abstract_method :emit_left
|
|
95
40
|
|
|
96
|
-
|
|
97
|
-
|
|
41
|
+
# Variable assignment emitter
|
|
42
|
+
class Variable < self
|
|
98
43
|
|
|
99
|
-
|
|
100
|
-
class Multiple < self
|
|
101
|
-
include Unterminated
|
|
44
|
+
handle :lvasgn, :ivasgn, :cvasgn, :gvasgn
|
|
102
45
|
|
|
103
|
-
|
|
46
|
+
children :name, :right
|
|
104
47
|
|
|
105
48
|
private
|
|
106
49
|
|
|
107
|
-
# Emit left
|
|
108
|
-
#
|
|
109
|
-
# @return [undefined]
|
|
110
|
-
#
|
|
111
|
-
# @api private
|
|
112
|
-
#
|
|
113
50
|
def emit_left
|
|
114
|
-
|
|
51
|
+
write(name.to_s)
|
|
115
52
|
end
|
|
116
53
|
|
|
117
|
-
|
|
118
|
-
#
|
|
119
|
-
# @return [undefined]
|
|
120
|
-
#
|
|
121
|
-
# @api private
|
|
122
|
-
#
|
|
123
|
-
def emit_right
|
|
124
|
-
write(WS, T_ASN, WS)
|
|
125
|
-
visit(children.last)
|
|
126
|
-
end
|
|
54
|
+
end # Variable
|
|
127
55
|
|
|
128
|
-
|
|
56
|
+
# Constant assignment emitter
|
|
57
|
+
class Constant < self
|
|
129
58
|
|
|
130
|
-
|
|
131
|
-
class MLHS < Emitter
|
|
132
|
-
include Unterminated
|
|
59
|
+
handle :casgn
|
|
133
60
|
|
|
134
|
-
|
|
61
|
+
children :base, :name, :right
|
|
135
62
|
|
|
136
63
|
private
|
|
137
64
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
#
|
|
145
|
-
# @api private
|
|
146
|
-
#
|
|
147
|
-
def dispatch
|
|
148
|
-
delimited(children)
|
|
149
|
-
|
|
150
|
-
write(',') if children.one? && mlhs?
|
|
151
|
-
end
|
|
152
|
-
|
|
153
|
-
# Test for mlhs context
|
|
154
|
-
#
|
|
155
|
-
# @return [undefined]
|
|
156
|
-
#
|
|
157
|
-
# @api private
|
|
158
|
-
#
|
|
159
|
-
def mlhs?
|
|
160
|
-
!NO_COMMA.include?(first_child.type) && PARENT_MLHS.include?(parent_type)
|
|
65
|
+
def emit_left
|
|
66
|
+
if base
|
|
67
|
+
visit(base)
|
|
68
|
+
write('::') unless n_cbase?(base)
|
|
69
|
+
end
|
|
70
|
+
write(name.to_s)
|
|
161
71
|
end
|
|
162
72
|
|
|
163
|
-
end #
|
|
164
|
-
|
|
73
|
+
end # Constant
|
|
165
74
|
end # Assignment
|
|
166
75
|
end # Emitter
|
|
167
76
|
end # Unparser
|
|
@@ -5,97 +5,22 @@ module Unparser
|
|
|
5
5
|
|
|
6
6
|
# Emitter for begin nodes
|
|
7
7
|
class Begin < self
|
|
8
|
-
|
|
8
|
+
handle :begin
|
|
9
9
|
children :body
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
#
|
|
15
|
-
# @return [undefined]
|
|
16
|
-
#
|
|
17
|
-
# @api private
|
|
18
|
-
#
|
|
19
|
-
def emit_inner
|
|
20
|
-
children.each_with_index do |child, index|
|
|
21
|
-
visit_plain(child)
|
|
22
|
-
write(NL) if index < children.length - 1
|
|
11
|
+
def emit_heredoc_reminders
|
|
12
|
+
children.each do |child|
|
|
13
|
+
emitter(child).emit_heredoc_reminders
|
|
23
14
|
end
|
|
24
15
|
end
|
|
25
16
|
|
|
26
|
-
|
|
27
|
-
class Implicit < self
|
|
28
|
-
|
|
29
|
-
handle :begin
|
|
30
|
-
|
|
31
|
-
# Test if begin is terminated
|
|
32
|
-
#
|
|
33
|
-
# @return [Boolean]
|
|
34
|
-
#
|
|
35
|
-
# @api private
|
|
36
|
-
#
|
|
37
|
-
def terminated?
|
|
38
|
-
children.empty?
|
|
39
|
-
end
|
|
40
|
-
|
|
41
|
-
TERMINATING_PARENT = %i[root interpolated dyn_str_body].to_set.freeze
|
|
42
|
-
|
|
43
|
-
private
|
|
44
|
-
|
|
45
|
-
# Perform dispatch
|
|
46
|
-
#
|
|
47
|
-
# @return [undefined]
|
|
48
|
-
#
|
|
49
|
-
# @api private
|
|
50
|
-
#
|
|
51
|
-
def dispatch
|
|
52
|
-
if terminated? && !TERMINATING_PARENT.include?(parent_type)
|
|
53
|
-
write('()')
|
|
54
|
-
else
|
|
55
|
-
emit_inner
|
|
56
|
-
end
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
end # Implicit
|
|
60
|
-
|
|
61
|
-
# Emitter for explicit begins
|
|
62
|
-
class Explicit < self
|
|
63
|
-
include Terminated
|
|
64
|
-
|
|
65
|
-
handle :kwbegin
|
|
66
|
-
|
|
67
|
-
private
|
|
68
|
-
|
|
69
|
-
# Perform dispatch
|
|
70
|
-
#
|
|
71
|
-
# @return [undefined]
|
|
72
|
-
#
|
|
73
|
-
# @api private
|
|
74
|
-
#
|
|
75
|
-
def dispatch
|
|
76
|
-
write(K_BEGIN)
|
|
77
|
-
emit_body
|
|
78
|
-
k_end
|
|
79
|
-
end
|
|
17
|
+
private
|
|
80
18
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
#
|
|
85
|
-
# @api private
|
|
86
|
-
#
|
|
87
|
-
def emit_body
|
|
88
|
-
if body.nil?
|
|
89
|
-
nl
|
|
90
|
-
elsif NOINDENT.include?(body.type)
|
|
91
|
-
emit_inner
|
|
92
|
-
else
|
|
93
|
-
indented { emit_inner }
|
|
94
|
-
end
|
|
19
|
+
def dispatch
|
|
20
|
+
parentheses do
|
|
21
|
+
delimited(children, '; ')
|
|
95
22
|
end
|
|
96
|
-
|
|
97
|
-
end # Explicit
|
|
98
|
-
|
|
23
|
+
end
|
|
99
24
|
end # Begin
|
|
100
25
|
end # Emitter
|
|
101
26
|
end # Unparser
|
|
@@ -2,33 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
module Unparser
|
|
4
4
|
class Emitter
|
|
5
|
-
#
|
|
5
|
+
# Non send binary operator / keyword emitter
|
|
6
6
|
class Binary < self
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
children :left, :right
|
|
10
|
-
|
|
11
|
-
MAP = {
|
|
12
|
-
or: T_OR,
|
|
13
|
-
and: T_AND
|
|
14
|
-
}.freeze
|
|
15
|
-
|
|
16
|
-
handle(*MAP.keys)
|
|
7
|
+
handle :and, :or
|
|
17
8
|
|
|
18
9
|
private
|
|
19
10
|
|
|
20
|
-
# Perform dispatch
|
|
21
|
-
#
|
|
22
|
-
# @return [undefined]
|
|
23
|
-
#
|
|
24
|
-
# @api private
|
|
25
|
-
#
|
|
26
11
|
def dispatch
|
|
27
|
-
|
|
28
|
-
write(WS, MAP.fetch(node.type), WS)
|
|
29
|
-
visit(right)
|
|
12
|
+
writer.dispatch
|
|
30
13
|
end
|
|
31
14
|
|
|
15
|
+
def writer
|
|
16
|
+
writer_with(Writer::Binary, node)
|
|
17
|
+
end
|
|
18
|
+
memoize :writer
|
|
32
19
|
end # Binary
|
|
33
20
|
end # Emitter
|
|
34
21
|
end # Unparser
|