unparser 0.4.7 → 0.6.7

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,156 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- class Literal
6
-
7
- # Abstract namespace class for hash pair emitters
8
- class HashPair < self
9
-
10
- children :key, :value
11
-
12
- private
13
-
14
- # Emit value
15
- #
16
- # @return [undefined]
17
- #
18
- # @api private
19
- #
20
- def emit_value
21
- value_type = value.type
22
- conditional_parentheses(value_type.equal?(:if)) do
23
- visit(value)
24
- end
25
- end
26
-
27
- # Pair emitter that emits hash-rocket separated key values
28
- class Rocket < self
29
- HASHROCKET = ' => '.freeze
30
-
31
- handle :pair_rocket, :pair
32
-
33
- private
34
-
35
- # Perform dispatch
36
- #
37
- # @return [undefined]
38
- #
39
- # @api private
40
- #
41
- def dispatch
42
- visit(key)
43
- write(HASHROCKET)
44
- emit_value
45
- end
46
-
47
- end # Rocket
48
-
49
- # Pair emitter that emits colon separated key values
50
- class Colon < self
51
- COLON = ': '.freeze
52
-
53
- handle :pair_colon
54
-
55
- private
56
-
57
- # Perform dispatch
58
- #
59
- # @return [undefined]
60
- #
61
- # @api private
62
- #
63
- def dispatch
64
- write(key.children.first.to_s, COLON)
65
- emit_value
66
- end
67
-
68
- end # Colon
69
-
70
- end # HashPair
71
-
72
- # Emitter for hash bodies
73
- class HashBody < self
74
-
75
- BAREWORD = /\A[A-Za-z_][A-Za-z_0-9]*[?!]?\z/.freeze
76
-
77
- handle :hash_body
78
-
79
- private
80
-
81
- # Perform dispatch
82
- #
83
- # @return [undefined]
84
- #
85
- # @api private
86
- #
87
- def dispatch
88
- delimited(effective_body)
89
- end
90
-
91
- # Return effective body
92
- #
93
- # @return [Enumerable<Parser::AST::Node>]
94
- #
95
- # @api private
96
- #
97
- def effective_body
98
- children.map do |pair|
99
- if pair.type.equal?(:kwsplat)
100
- pair
101
- else
102
- key, _value = *pair
103
- if key.type.equal?(:sym) && key.children.first.to_s =~ BAREWORD
104
- n(:pair_colon, pair.children)
105
- else
106
- n(:pair_rocket, pair.children)
107
- end
108
- end
109
- end
110
- end
111
-
112
- end # HashBody
113
-
114
- # Emitter for Hash literals
115
- class Hash < self
116
-
117
- DELIMITER = ', '.freeze
118
- OPEN = '{'.freeze
119
- CLOSE = '}'.freeze
120
-
121
- handle :hash
122
-
123
- private
124
-
125
- # Perform dispatch
126
- #
127
- # @return [undefined]
128
- #
129
- # @api private
130
- #
131
- def dispatch
132
- if children.empty?
133
- write(OPEN, CLOSE)
134
- else
135
- emit_hash_body
136
- end
137
- end
138
-
139
- # Emit hash body
140
- #
141
- # @return [undefined]
142
- #
143
- # @api private
144
- #
145
- def emit_hash_body
146
- parentheses(OPEN, CLOSE) do
147
- write(WS)
148
- run(HashBody)
149
- write(WS)
150
- end
151
- end
152
-
153
- end # Hash
154
- end # Literal
155
- end # Emitter
156
- end # Unparser
@@ -1,145 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- class Literal
6
-
7
- # Base class for primitive emitters
8
- class Primitive < self
9
-
10
- children :value
11
-
12
- # Emitter for primitives based on Object#inspect
13
- class Inspect < self
14
-
15
- handle :sym, :str
16
-
17
- private
18
-
19
- # Dispatch value
20
- #
21
- # @return [undefined]
22
- #
23
- # @api private
24
- #
25
- def dispatch
26
- write(value.inspect)
27
- end
28
-
29
- end # Inspect
30
-
31
- # Emitter for complex literals
32
- class Complex < self
33
-
34
- handle :complex
35
-
36
- RATIONAL_FORMAT = 'i'.freeze
37
-
38
- MAP =
39
- if 0.class.equal?(Integer)
40
- IceNine.deep_freeze(
41
- Float => :float,
42
- Rational => :rational,
43
- Integer => :int
44
- )
45
- else
46
- IceNine.deep_freeze(
47
- Float => :float,
48
- Rational => :rational,
49
- Fixnum => :int,
50
- Bignum => :int
51
- )
52
- end
53
-
54
- private
55
-
56
- # Dispatch value
57
- #
58
- # @return [undefined]
59
- #
60
- def dispatch
61
- emit_imaginary
62
- write(RATIONAL_FORMAT)
63
- end
64
-
65
- # Emit imaginary component
66
- #
67
- # @return [undefined]
68
- #
69
- # @api private
70
- #
71
- def emit_imaginary
72
- visit(imaginary_node)
73
- end
74
-
75
- # Return imaginary node
76
- #
77
- # @return [Parser::AST::Node]
78
- #
79
- # @api private
80
- #
81
- def imaginary_node
82
- imaginary = value.imaginary
83
- s(MAP.fetch(imaginary.class), imaginary)
84
- end
85
-
86
- end # Rational
87
-
88
- # Emitter for rational literals
89
- class Rational < self
90
-
91
- handle :rational
92
-
93
- RATIONAL_FORMAT = 'r'.freeze
94
-
95
- private
96
-
97
- # Dispatch value
98
- #
99
- # @return [undefined]
100
- #
101
- def dispatch
102
- integer = value.to_i
103
- float = value.to_f
104
-
105
- write_rational(integer.to_f.eql?(float) ? integer : float)
106
- end
107
-
108
- # Write rational format
109
- #
110
- # @param [#to_s] value
111
- #
112
- # @return [undefined]
113
- #
114
- # @api private
115
- #
116
- def write_rational(value)
117
- write(value.to_s, RATIONAL_FORMAT)
118
- end
119
-
120
- end # Rational
121
-
122
- # Emiter for numeric literals
123
- class Numeric < self
124
-
125
- handle :int, :float
126
-
127
- private
128
-
129
- # Dispatch value
130
- #
131
- # @return [undefined]
132
- #
133
- # @api private
134
- #
135
- def dispatch
136
- conditional_parentheses(parent.is_a?(Send) && value.negative?) do
137
- write(value.inspect)
138
- end
139
- end
140
-
141
- end # Numeric
142
- end # Primitive
143
- end # Literal
144
- end # Emitter
145
- end # Unparser
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- class Literal
6
- # Abstract base class for literal range emitter
7
- class Range < self
8
- include Unterminated
9
-
10
- TOKENS = IceNine.deep_freeze(
11
- irange: '..',
12
- erange: '...'
13
- )
14
-
15
- handle(*TOKENS.keys)
16
-
17
- children :begin_node, :end_node
18
-
19
- private
20
-
21
- # Perform dispatch
22
- #
23
- # @return [undefined]
24
- #
25
- # @api private
26
- #
27
- def dispatch
28
- visit(begin_node)
29
- write(TOKENS.fetch(node.type))
30
- visit(end_node) if end_node
31
- end
32
-
33
- end # Range
34
- end # Literal
35
- end # Emitter
36
- end # Unparser
@@ -1,114 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- class Literal
6
-
7
- # Emitter for regexp literals
8
- class Regexp < self
9
- DELIMITER = '/'.freeze
10
- ESCAPED_DELIMITER = '\/'.freeze
11
-
12
- handle :regexp
13
-
14
- private
15
-
16
- # Perform dispatch
17
- #
18
- # @return [undefined]
19
- #
20
- # @api private
21
- #
22
- def dispatch
23
- parentheses(DELIMITER, DELIMITER) do
24
- body.each(&method(:write_body))
25
- end
26
- visit(children.last)
27
- end
28
-
29
- # Return non regopt children
30
- #
31
- # @return [Array<Parser::AST::Node>]
32
- #
33
- # @api private
34
- #
35
- def body
36
- children[0..-2]
37
- end
38
-
39
- # Write specific body component
40
- #
41
- # @param [Parser::AST::Node] node
42
- #
43
- # @return [undefined]
44
- #
45
- # @api private
46
- #
47
- def write_body(node)
48
- case node.type
49
- when :str
50
- buffer.append_without_prefix(escape(node).children.first)
51
- else
52
- visit(s(:interpolated, node))
53
- end
54
- end
55
-
56
- # Return dynamic body
57
- #
58
- # @return [undefined]
59
- #
60
- # @api private
61
- #
62
- def dynamic_body
63
- Parser::AST::Node.new(:dyn_regexp_body, dynamic_body_children)
64
- end
65
-
66
- # Return dynamic body children
67
- #
68
- # @return [Enumerable<Parser::AST::Node>]
69
- #
70
- # @api private
71
- #
72
- def dynamic_body_children
73
- children[0..-2].map do |child|
74
- escape(child)
75
- end
76
- end
77
-
78
- # Return escaped child
79
- #
80
- # @param [Parser::AST::Node] child
81
- #
82
- # @return [Parser::AST::Node]
83
- #
84
- # @api private
85
- #
86
- def escape(child)
87
- source = child.children.first
88
- s(:str, source.gsub(DELIMITER, ESCAPED_DELIMITER))
89
- end
90
-
91
- end # Regexp
92
-
93
- # Emitter for regexp options
94
- class Regopt < self
95
-
96
- handle :regopt
97
-
98
- private
99
-
100
- # Perform dispatch
101
- #
102
- # @return [undefined]
103
- #
104
- # @api private
105
- #
106
- def dispatch
107
- write(children.map(&:to_s).join)
108
- end
109
-
110
- end # Regopt
111
-
112
- end # Literal
113
- end # Emitter
114
- end # Unparser
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- class Literal
6
- # Emiter for literal singletons
7
- class Singleton < self
8
-
9
- handle :self, :true, :false, :nil
10
-
11
- private
12
-
13
- # Perform dispatco
14
- #
15
- # @return [undefined]
16
- #
17
- # @api private
18
- #
19
- def dispatch
20
- buffer.append(node.type.to_s)
21
- end
22
-
23
- end # Singleton
24
- end # Literal
25
- end # Emitter
26
- end # Unparser
@@ -1,10 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- # Namespace class for literal emiters
6
- class Literal < self
7
- include Terminated
8
- end # Literal
9
- end # Emitter
10
- end # Unparser
@@ -1,16 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- # Namespace class for meta emitters
6
- class Meta < self
7
- include Terminated
8
-
9
- handle(:__ENCODING__, :__FILE__, :__LINE__)
10
-
11
- def dispatch
12
- write(node.type.to_s)
13
- end
14
- end # Meta
15
- end # Emitter
16
- end # Unparser
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- # Emitter for redo nodes
6
- class Redo < self
7
- include Terminated
8
-
9
- handle :redo
10
-
11
- private
12
-
13
- # Perform dispatch
14
- #
15
- # @return [undefined]
16
- #
17
- # @api private
18
- #
19
- def dispatch
20
- write(K_REDO)
21
- end
22
-
23
- end # Redo
24
- end # Emitter
25
- end # Unparser
@@ -1,76 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- # Emitter for rescue body nodes
6
- class Resbody < self
7
-
8
- children :exception, :assignment, :body
9
-
10
- # Emitter for resbody in standalone form
11
- class Standalone < self
12
-
13
- private
14
-
15
- # Perform dispatch
16
- #
17
- # @return [undefined]
18
- #
19
- # @api private
20
- #
21
- def dispatch
22
- write(K_RESCUE, WS)
23
- visit_plain(body)
24
- end
25
- end
26
-
27
- # Emitter for resbody in keyworkd-embedded form
28
- class Embedded < self
29
-
30
- handle :resbody
31
-
32
- private
33
-
34
- # Perform dispatch
35
- #
36
- # @return [undefined]
37
- #
38
- # @api private
39
- #
40
- def dispatch
41
- write(K_RESCUE)
42
- emit_exception
43
- emit_assignment
44
- emit_body
45
- end
46
-
47
- # Emit exception
48
- #
49
- # @return [undefined]
50
- #
51
- # @api private
52
- #
53
- def emit_exception
54
- return unless exception
55
-
56
- ws
57
- delimited(exception.children)
58
- end
59
-
60
- # Emit assignment
61
- #
62
- # @return [undefined]
63
- #
64
- # @api private
65
- #
66
- def emit_assignment
67
- return unless assignment
68
-
69
- write(WS, T_ASR, WS)
70
- visit(assignment)
71
- end
72
-
73
- end # Resbody
74
- end
75
- end # Emitter
76
- end # Unparser
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- # Emitter for retry nodes
6
- class Retry < self
7
- include Terminated
8
-
9
- handle :retry
10
-
11
- private
12
-
13
- # Perform dispatch
14
- #
15
- # @return [undefined]
16
- #
17
- # @api private
18
- #
19
- def dispatch
20
- write(K_RETRY)
21
- end
22
-
23
- end # Break
24
- end # Emitter
25
- end # Unparser
@@ -1,57 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Unparser
4
- class Emitter
5
- class Send
6
- # Emitter for binary sends
7
- class Binary < self
8
- include Unterminated
9
-
10
- private
11
-
12
- # Return undefined
13
- #
14
- # @return [undefined]
15
- #
16
- # @api private
17
- #
18
- def dispatch
19
- visit(receiver)
20
- emit_operator
21
- emit_right
22
- end
23
-
24
- # Emit operator
25
- #
26
- # @return [undefined]
27
- #
28
- # @api private
29
- #
30
- def emit_operator
31
- write(WS, string_selector, WS)
32
- end
33
-
34
- # Return right node
35
- #
36
- # @return [Parser::AST::Node]
37
- #
38
- # @api private
39
- #
40
- def right_node
41
- children[2]
42
- end
43
-
44
- # Emit right
45
- #
46
- # @return [undefined]
47
- #
48
- # @api private
49
- #
50
- def emit_right
51
- visit(right_node)
52
- end
53
-
54
- end # Binary
55
- end # Send
56
- end # Emitter
57
- end # Unparser