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.
Files changed (157) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +40 -9
  3. data/bin/unparser +2 -2
  4. data/lib/unparser/abstract_type.rb +121 -0
  5. data/lib/unparser/adamantium/method_builder.rb +111 -0
  6. data/lib/unparser/adamantium.rb +150 -0
  7. data/lib/unparser/anima/attribute.rb +59 -0
  8. data/lib/unparser/anima/error.rb +23 -0
  9. data/lib/unparser/anima.rb +184 -0
  10. data/lib/unparser/ast/local_variable_scope.rb +6 -76
  11. data/lib/unparser/ast.rb +1 -3
  12. data/lib/unparser/buffer.rb +14 -25
  13. data/lib/unparser/cli.rb +85 -77
  14. data/lib/unparser/{cli/color.rb → color.rb} +4 -14
  15. data/lib/unparser/comments.rb +0 -26
  16. data/lib/unparser/concord.rb +114 -0
  17. data/lib/unparser/constants.rb +4 -53
  18. data/lib/unparser/diff.rb +98 -0
  19. data/lib/unparser/dsl.rb +0 -32
  20. data/lib/unparser/either.rb +153 -0
  21. data/lib/unparser/emitter/alias.rb +2 -8
  22. data/lib/unparser/emitter/args.rb +45 -0
  23. data/lib/unparser/emitter/argument.rb +13 -169
  24. data/lib/unparser/emitter/array.rb +27 -0
  25. data/lib/unparser/emitter/array_pattern.rb +29 -0
  26. data/lib/unparser/emitter/assignment.rb +36 -127
  27. data/lib/unparser/emitter/begin.rb +9 -84
  28. data/lib/unparser/emitter/binary.rb +7 -20
  29. data/lib/unparser/emitter/block.rb +57 -41
  30. data/lib/unparser/emitter/case.rb +6 -48
  31. data/lib/unparser/emitter/case_guard.rb +27 -0
  32. data/lib/unparser/emitter/case_match.rb +40 -0
  33. data/lib/unparser/emitter/cbase.rb +1 -3
  34. data/lib/unparser/emitter/class.rb +6 -26
  35. data/lib/unparser/emitter/const_pattern.rb +24 -0
  36. data/lib/unparser/emitter/def.rb +7 -51
  37. data/lib/unparser/emitter/defined.rb +2 -12
  38. data/lib/unparser/emitter/dstr.rb +22 -0
  39. data/lib/unparser/emitter/dsym.rb +41 -0
  40. data/lib/unparser/emitter/find_pattern.rb +18 -0
  41. data/lib/unparser/emitter/flipflop.rb +11 -10
  42. data/lib/unparser/emitter/float.rb +29 -0
  43. data/lib/unparser/emitter/flow_modifier.rb +15 -53
  44. data/lib/unparser/emitter/for.rb +5 -19
  45. data/lib/unparser/emitter/hash.rb +36 -0
  46. data/lib/unparser/emitter/hash_pattern.rb +67 -0
  47. data/lib/unparser/emitter/hookexe.rb +5 -11
  48. data/lib/unparser/emitter/if.rb +15 -71
  49. data/lib/unparser/emitter/in_match.rb +21 -0
  50. data/lib/unparser/emitter/in_pattern.rb +36 -0
  51. data/lib/unparser/emitter/index.rb +22 -89
  52. data/lib/unparser/emitter/kwargs.rb +13 -0
  53. data/lib/unparser/emitter/kwbegin.rb +31 -0
  54. data/lib/unparser/emitter/lambda.rb +0 -8
  55. data/lib/unparser/emitter/masgn.rb +20 -0
  56. data/lib/unparser/emitter/match.rb +3 -17
  57. data/lib/unparser/emitter/match_alt.rb +23 -0
  58. data/lib/unparser/emitter/match_as.rb +21 -0
  59. data/lib/unparser/emitter/match_pattern.rb +30 -0
  60. data/lib/unparser/emitter/match_pattern_p.rb +20 -0
  61. data/lib/unparser/emitter/match_rest.rb +33 -0
  62. data/lib/unparser/emitter/match_var.rb +19 -0
  63. data/lib/unparser/emitter/mlhs.rb +40 -0
  64. data/lib/unparser/emitter/module.rb +3 -9
  65. data/lib/unparser/emitter/op_assign.rb +14 -29
  66. data/lib/unparser/emitter/pair.rb +33 -0
  67. data/lib/unparser/emitter/pin.rb +19 -0
  68. data/lib/unparser/emitter/primitive.rb +93 -0
  69. data/lib/unparser/emitter/range.rb +35 -0
  70. data/lib/unparser/emitter/regexp.rb +35 -0
  71. data/lib/unparser/emitter/repetition.rb +17 -57
  72. data/lib/unparser/emitter/rescue.rb +1 -97
  73. data/lib/unparser/emitter/root.rb +17 -1
  74. data/lib/unparser/emitter/send.rb +10 -219
  75. data/lib/unparser/emitter/simple.rb +33 -0
  76. data/lib/unparser/emitter/splat.rb +13 -19
  77. data/lib/unparser/emitter/super.rb +1 -29
  78. data/lib/unparser/emitter/undef.rb +1 -9
  79. data/lib/unparser/emitter/variable.rb +1 -31
  80. data/lib/unparser/emitter/xstr.rb +72 -0
  81. data/lib/unparser/emitter/yield.rb +1 -9
  82. data/lib/unparser/emitter.rb +24 -425
  83. data/lib/unparser/equalizer.rb +98 -0
  84. data/lib/unparser/generation.rb +252 -0
  85. data/lib/unparser/node_details/send.rb +65 -0
  86. data/lib/unparser/node_details.rb +21 -0
  87. data/lib/unparser/node_helpers.rb +48 -6
  88. data/lib/unparser/validation.rb +172 -0
  89. data/lib/unparser/writer/binary.rb +99 -0
  90. data/lib/unparser/writer/dynamic_string.rb +211 -0
  91. data/lib/unparser/writer/resbody.rb +40 -0
  92. data/lib/unparser/writer/rescue.rb +43 -0
  93. data/lib/unparser/{emitter → writer}/send/attribute_assignment.rb +11 -26
  94. data/lib/unparser/writer/send/binary.rb +27 -0
  95. data/lib/unparser/writer/send/conditional.rb +25 -0
  96. data/lib/unparser/writer/send/regular.rb +33 -0
  97. data/lib/unparser/{emitter → writer}/send/unary.rb +10 -17
  98. data/lib/unparser/writer/send.rb +115 -0
  99. data/lib/unparser/writer.rb +15 -0
  100. data/lib/unparser.rb +161 -77
  101. metadata +100 -157
  102. data/.circleci/config.yml +0 -49
  103. data/.gitignore +0 -37
  104. data/.rspec +0 -4
  105. data/.rubocop.yml +0 -9
  106. data/Changelog.md +0 -156
  107. data/Gemfile +0 -9
  108. data/Gemfile.lock +0 -181
  109. data/LICENSE +0 -20
  110. data/Rakefile +0 -22
  111. data/config/devtools.yml +0 -2
  112. data/config/flay.yml +0 -3
  113. data/config/flog.yml +0 -2
  114. data/config/mutant.yml +0 -6
  115. data/config/reek.yml +0 -98
  116. data/config/rubocop.yml +0 -122
  117. data/config/yardstick.yml +0 -2
  118. data/lib/unparser/cli/differ.rb +0 -152
  119. data/lib/unparser/cli/source.rb +0 -267
  120. data/lib/unparser/emitter/empty.rb +0 -23
  121. data/lib/unparser/emitter/ensure.rb +0 -37
  122. data/lib/unparser/emitter/literal/array.rb +0 -29
  123. data/lib/unparser/emitter/literal/dynamic.rb +0 -53
  124. data/lib/unparser/emitter/literal/dynamic_body.rb +0 -132
  125. data/lib/unparser/emitter/literal/execute_string.rb +0 -38
  126. data/lib/unparser/emitter/literal/hash.rb +0 -156
  127. data/lib/unparser/emitter/literal/primitive.rb +0 -145
  128. data/lib/unparser/emitter/literal/range.rb +0 -36
  129. data/lib/unparser/emitter/literal/regexp.rb +0 -114
  130. data/lib/unparser/emitter/literal/singleton.rb +0 -26
  131. data/lib/unparser/emitter/literal.rb +0 -10
  132. data/lib/unparser/emitter/meta.rb +0 -16
  133. data/lib/unparser/emitter/redo.rb +0 -25
  134. data/lib/unparser/emitter/resbody.rb +0 -76
  135. data/lib/unparser/emitter/retry.rb +0 -25
  136. data/lib/unparser/emitter/send/binary.rb +0 -57
  137. data/lib/unparser/emitter/send/conditional.rb +0 -40
  138. data/lib/unparser/emitter/send/regular.rb +0 -40
  139. data/lib/unparser/preprocessor.rb +0 -159
  140. data/spec/integration/unparser/corpus_spec.rb +0 -111
  141. data/spec/integrations.yml +0 -92
  142. data/spec/spec_helper.rb +0 -20
  143. data/spec/unit/unparser/buffer/append_spec.rb +0 -24
  144. data/spec/unit/unparser/buffer/append_without_prefix_spec.rb +0 -23
  145. data/spec/unit/unparser/buffer/capture_content_spec.rb +0 -17
  146. data/spec/unit/unparser/buffer/content_spec.rb +0 -38
  147. data/spec/unit/unparser/buffer/fresh_line_spec.rb +0 -20
  148. data/spec/unit/unparser/buffer/indent_spec.rb +0 -20
  149. data/spec/unit/unparser/buffer/nl_spec.rb +0 -16
  150. data/spec/unit/unparser/buffer/unindent_spec.rb +0 -20
  151. data/spec/unit/unparser/comments/consume_spec.rb +0 -22
  152. data/spec/unit/unparser/comments/take_all_spec.rb +0 -19
  153. data/spec/unit/unparser/comments/take_before_spec.rb +0 -46
  154. data/spec/unit/unparser/comments/take_eol_comments_spec.rb +0 -32
  155. data/spec/unit/unparser/emitter/class_methods/handle_spec.rb +0 -17
  156. data/spec/unit/unparser_spec.rb +0 -1849
  157. data/unparser.gemspec +0 -32
@@ -2,121 +2,21 @@
2
2
 
3
3
  module Unparser
4
4
  class Emitter
5
-
6
- # Arg expr (pattern args) emitter
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: T_AMP,
104
- kwrestarg: T_DSPLAT
8
+ blockarg: '&',
9
+ forwarded_kwrestarg: '**',
10
+ forwarded_restarg: '*',
11
+ kwrestarg: '**'
105
12
  }.freeze
106
13
 
107
- handle :blockarg
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, WS, T_ASN, WS)
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, T_COLON, WS)
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, T_COLON)
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(T_SPLAT, name.to_s)
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(T_AMP)
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
- # Single assignment emitter
23
- class Single < self
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
- # Emit right
38
- #
39
- # @return [undefined]
40
- #
41
- # @api private
42
- #
43
- def emit_right
44
- return unless right
30
+ write(' = ')
45
31
 
46
- write(WS, T_ASN, WS)
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
- abstract_method :emit_left
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
- end # Constant
97
- end # Single
41
+ # Variable assignment emitter
42
+ class Variable < self
98
43
 
99
- # Multiple assignment
100
- class Multiple < self
101
- include Unterminated
44
+ handle :lvasgn, :ivasgn, :cvasgn, :gvasgn
102
45
 
103
- handle :masgn
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
- visit_plain(first_child)
51
+ write(name.to_s)
115
52
  end
116
53
 
117
- # Emit right
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
- end # Multiple
56
+ # Constant assignment emitter
57
+ class Constant < self
129
58
 
130
- # Emitter for multiple assignment left hand side
131
- class MLHS < Emitter
132
- include Unterminated
59
+ handle :casgn
133
60
 
134
- handle :mlhs
61
+ children :base, :name, :right
135
62
 
136
63
  private
137
64
 
138
- NO_COMMA = %i[splat restarg].to_set.freeze
139
- PARENT_MLHS = %i[mlhs masgn].freeze
140
-
141
- # Perform dispatch
142
- #
143
- # @return [undefined]
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 # MLHS
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
- private
12
-
13
- # Emit inner nodes
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
- # Emitter for implicit begins
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
- # Emit body
82
- #
83
- # @return [undefined]
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
- # Base class for binary emitters
5
+ # Non send binary operator / keyword emitter
6
6
  class Binary < self
7
- include Unterminated
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
- visit(left)
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