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
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for multiple assignment nodes
6
+ class MASGN < self
7
+ handle :masgn
8
+
9
+ children :target, :source
10
+
11
+ private
12
+
13
+ def dispatch
14
+ visit(target)
15
+ write(' = ')
16
+ visit(source)
17
+ end
18
+ end # MLHS
19
+ end # Emitter
20
+ end # Unaprser
@@ -5,10 +5,6 @@ module Unparser
5
5
 
6
6
  # Base class for special match node emitters
7
7
  class Match < self
8
- include Unterminated
9
-
10
- OPERATOR = '=~'.freeze
11
-
12
8
  # Emitter for match with local variable assignment
13
9
  class Lvasgn < self
14
10
  handle :match_with_lvasgn
@@ -17,15 +13,9 @@ module Unparser
17
13
 
18
14
  private
19
15
 
20
- # Perform dispatch
21
- #
22
- # @return [undefined]
23
- #
24
- # @api private
25
- #
26
16
  def dispatch
27
17
  visit(regexp)
28
- write(WS, OPERATOR, WS)
18
+ write(' =~ ')
29
19
  visit(lvasgn)
30
20
  end
31
21
 
@@ -37,12 +27,8 @@ module Unparser
37
27
 
38
28
  children :regexp
39
29
 
40
- # Perform dispatch
41
- #
42
- # @return [undefined]
43
- #
44
- # @api private
45
- #
30
+ private
31
+
46
32
  def dispatch
47
33
  visit(regexp)
48
34
  end
@@ -0,0 +1,23 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for in pattern nodes
6
+ class MatchAlt < self
7
+
8
+ handle :match_alt
9
+
10
+ children :left, :right
11
+
12
+ private
13
+
14
+ def dispatch
15
+ visit(left)
16
+ ws
17
+ write('|')
18
+ ws
19
+ visit(right)
20
+ end
21
+ end # MatchAlt
22
+ end # Emitter
23
+ end # Unparser
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for in pattern nodes
6
+ class MatchAs < self
7
+
8
+ handle :match_as
9
+
10
+ children :left, :right
11
+
12
+ private
13
+
14
+ def dispatch
15
+ visit(left)
16
+ write(' => ')
17
+ visit(right)
18
+ end
19
+ end # MatchAs
20
+ end # Emitter
21
+ end # Unparser
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for in pattern nodes
6
+ class MatchPattern < self
7
+
8
+ handle :match_pattern
9
+
10
+ children :target, :pattern
11
+
12
+ # Modern ast format emits `match_pattern`
13
+ # node on single line pre 3.0, but 3.0+ uses `match_pattern_p`
14
+ SYMBOL =
15
+ if RUBY_VERSION < '3.0'
16
+ ' in '
17
+ else
18
+ ' => '
19
+ end
20
+
21
+ private
22
+
23
+ def dispatch
24
+ visit(target)
25
+ write(SYMBOL)
26
+ visit(pattern)
27
+ end
28
+ end # MatchPattern
29
+ end # Emitter
30
+ end # Unparser
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ class MatchPatternP < self
6
+
7
+ handle :match_pattern_p
8
+
9
+ children :target, :pattern
10
+
11
+ private
12
+
13
+ def dispatch
14
+ visit(target)
15
+ write(' in ')
16
+ visit(pattern)
17
+ end
18
+ end # MatchPatternP
19
+ end # Emitter
20
+ end # Unparser
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emiter for match rest nodes
6
+ class MatchRest < self
7
+ handle :match_rest
8
+
9
+ children :match_var
10
+
11
+ def dispatch
12
+ write('*')
13
+ visit(match_var) if match_var
14
+ end
15
+
16
+ def emit_array_pattern
17
+ write('*')
18
+ emit_match_var
19
+ end
20
+
21
+ def emit_hash_pattern
22
+ write('**')
23
+ emit_match_var
24
+ end
25
+
26
+ private
27
+
28
+ def emit_match_var
29
+ visit(match_var) if match_var
30
+ end
31
+ end # MatchRest
32
+ end # Emitter
33
+ end # Unparser
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for in pattern nodes
6
+ class MatchVar < self
7
+
8
+ handle :match_var
9
+
10
+ children :name
11
+
12
+ private
13
+
14
+ def dispatch
15
+ write(name.to_s)
16
+ end
17
+ end # MatchVar
18
+ end # Emitter
19
+ end # Unparser
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for multiple assignment left hand side
6
+ class MLHS < self
7
+ handle :mlhs
8
+
9
+ NO_COMMA = %i[arg splat mlhs restarg].freeze
10
+
11
+ private_constant(*constants(false))
12
+
13
+ private
14
+
15
+ def dispatch
16
+ if children.one?
17
+ emit_one_child_mlhs
18
+ else
19
+ emit_many
20
+ end
21
+ end
22
+
23
+ def emit_one_child_mlhs
24
+ child = children.first
25
+ parentheses do
26
+ emitter(child).emit_mlhs
27
+ write(',') unless NO_COMMA.include?(child.type)
28
+ end
29
+ end
30
+
31
+ def emit_many
32
+ parentheses do
33
+ delimited(children) do |node|
34
+ emitter(node).emit_mlhs
35
+ end
36
+ end
37
+ end
38
+ end # MLHS
39
+ end # Emitter
40
+ end # Unaprser
@@ -4,7 +4,7 @@ module Unparser
4
4
  class Emitter
5
5
  # Emitter for module nodes
6
6
  class Module < self
7
- include LocalVariableRoot, Terminated
7
+ include LocalVariableRoot
8
8
 
9
9
  handle :module
10
10
 
@@ -12,16 +12,10 @@ module Unparser
12
12
 
13
13
  private
14
14
 
15
- # Perform dispatch
16
- #
17
- # @return [undefined]
18
- #
19
- # @api private
20
- #
21
15
  def dispatch
22
- write(K_MODULE, WS)
16
+ write('module ')
23
17
  visit(name)
24
- emit_body
18
+ emit_optional_body(body)
25
19
  k_end
26
20
  end
27
21
 
@@ -5,28 +5,25 @@ module Unparser
5
5
 
6
6
  # Base class for and and or op-assign
7
7
  class BinaryAssign < self
8
- include Unterminated
9
-
10
8
  children :target, :expression
11
9
 
12
- MAP = IceNine.deep_freeze(
10
+ MAP = {
13
11
  and_asgn: '&&=',
14
12
  or_asgn: '||='
15
- )
13
+ }.freeze
16
14
 
17
15
  handle(*MAP.keys)
18
16
 
17
+ def emit_heredoc_reminders
18
+ emitter(target).emit_heredoc_reminders
19
+ emitter(expression).emit_heredoc_reminders
20
+ end
21
+
19
22
  private
20
23
 
21
- # Perform dispatch
22
- #
23
- # @return [undefined]
24
- #
25
- # @api private
26
- #
27
24
  def dispatch
28
- visit(target)
29
- write(WS, MAP.fetch(node.type), WS)
25
+ emitter(target).emit_mlhs
26
+ write(' ', MAP.fetch(node.type), ' ')
30
27
  visit(expression)
31
28
  end
32
29
 
@@ -34,32 +31,20 @@ module Unparser
34
31
 
35
32
  # Emitter for op assign
36
33
  class OpAssign < self
37
- include Unterminated
38
-
39
34
  handle :op_asgn
40
35
 
36
+ children :target, :operator, :value
37
+
41
38
  private
42
39
 
43
- # Perform dispatch
44
- #
45
- # @return [undefined]
46
- #
47
- # @api private
48
- #
49
40
  def dispatch
50
- visit(first_child)
41
+ emitter(first_child).emit_mlhs
51
42
  emit_operator
52
- visit(children[2])
43
+ visit(value)
53
44
  end
54
45
 
55
- # Emit operator
56
- #
57
- # @return [undefined]
58
- #
59
- # @api private
60
- #
61
46
  def emit_operator
62
- write(WS, children[1].to_s, T_ASN, WS)
47
+ write(' ', operator.to_s, '= ')
63
48
  end
64
49
 
65
50
  end # OpAssign
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for key value pairs in hash literals or kwargs
6
+ class Pair < self
7
+ BAREWORD = /\A[A-Za-z_][A-Za-z_0-9]*[?!]?\z/.freeze
8
+
9
+ private_constant(*constants(false))
10
+
11
+ handle :pair
12
+
13
+ children :key, :value
14
+
15
+ private
16
+
17
+ def dispatch
18
+ if colon?(key)
19
+ write(key.children.first.to_s, ': ')
20
+ else
21
+ visit(key)
22
+ write(' => ')
23
+ end
24
+
25
+ visit(value)
26
+ end
27
+
28
+ def colon?(key)
29
+ n_sym?(key) && BAREWORD.match?(key.children.first)
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for pin nodes
6
+ class Pin < self
7
+ handle :pin
8
+
9
+ children :target
10
+
11
+ private
12
+
13
+ def dispatch
14
+ write('^')
15
+ visit(target)
16
+ end
17
+ end # Pin
18
+ end # Emitter
19
+ end # Unparser
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Base class for primitive emitters
6
+ class Primitive < self
7
+
8
+ children :value
9
+
10
+ # Emitter for primitives based on Object#inspect
11
+ class Inspect < self
12
+
13
+ handle :sym, :str
14
+
15
+ private
16
+
17
+ def dispatch
18
+ write(value.inspect)
19
+ end
20
+
21
+ end # Inspect
22
+
23
+ # Emitter for complex literals
24
+ class Complex < self
25
+
26
+ handle :complex
27
+
28
+ RATIONAL_FORMAT = 'i'.freeze
29
+
30
+ MAP =
31
+ {
32
+ ::Float => :float,
33
+ ::Rational => :rational,
34
+ ::Integer => :int
35
+ }.freeze
36
+
37
+ private
38
+
39
+ def dispatch
40
+ emit_imaginary
41
+ write(RATIONAL_FORMAT)
42
+ end
43
+
44
+ def emit_imaginary
45
+ visit(imaginary_node)
46
+ end
47
+
48
+ def imaginary_node
49
+ imaginary = value.imaginary
50
+ s(MAP.fetch(imaginary.class), imaginary)
51
+ end
52
+
53
+ end # Rational
54
+
55
+ # Emitter for rational literals
56
+ class Rational < self
57
+
58
+ handle :rational
59
+
60
+ RATIONAL_FORMAT = 'r'.freeze
61
+
62
+ private
63
+
64
+ # rubocop:disable Lint/FloatComparison
65
+ def dispatch
66
+ integer = Integer(value)
67
+ float = value.to_f
68
+
69
+ write_rational(integer.to_f.equal?(float) ? integer : float)
70
+ end
71
+ # rubocop:enable Lint/FloatComparison
72
+
73
+ def write_rational(value)
74
+ write(value.to_s, RATIONAL_FORMAT)
75
+ end
76
+
77
+ end # Rational
78
+
79
+ # Emiter for numeric literals
80
+ class Numeric < self
81
+
82
+ handle :int
83
+
84
+ private
85
+
86
+ def dispatch
87
+ write(value.inspect)
88
+ end
89
+
90
+ end # Numeric
91
+ end # Primitive
92
+ end # Emitter
93
+ end # Unparser
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Range emitters
6
+ class Range < self
7
+ TOKENS = {
8
+ irange: '..',
9
+ erange: '...'
10
+ }.freeze
11
+
12
+ SYMBOLS = {
13
+ erange: :tDOT3,
14
+ irange: :tDOT2
15
+ }.freeze
16
+
17
+ def symbol_name
18
+ true
19
+ end
20
+
21
+ handle(*TOKENS.keys)
22
+
23
+ children :begin_node, :end_node
24
+
25
+ private
26
+
27
+ def dispatch
28
+ visit(begin_node) if begin_node
29
+ write(TOKENS.fetch(node.type))
30
+ visit(end_node) if end_node
31
+ end
32
+
33
+ end # Range
34
+ end # Emitter
35
+ end # Unparser
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for regexp literals
6
+ class Regexp < self
7
+ handle :regexp
8
+
9
+ define_group(:body, 0..-2)
10
+
11
+ private
12
+
13
+ def dispatch
14
+ parentheses('/', '/') do
15
+ body.each(&method(:emit_body))
16
+ end
17
+ emit_options
18
+ end
19
+
20
+ def emit_options
21
+ write(children.last.children.join)
22
+ end
23
+
24
+ def emit_body(node)
25
+ if n_begin?(node)
26
+ write('#{')
27
+ node.children.each(&method(:visit))
28
+ write('}')
29
+ else
30
+ buffer.append_without_prefix(node.children.first.gsub('/', '\/'))
31
+ end
32
+ end
33
+ end # Regexp
34
+ end # Emitter
35
+ end # Unparser
@@ -5,39 +5,29 @@ module Unparser
5
5
 
6
6
  # Emitter for postconditions
7
7
  class Post < self
8
- include Unterminated
9
-
10
- handle :while_post, :until_post
11
-
12
8
  children :condition, :body
13
9
 
14
10
  MAP = {
15
- while_post: K_WHILE,
16
- until_post: K_UNTIL
11
+ while_post: 'while',
12
+ until_post: 'until'
17
13
  }.freeze
18
14
 
19
15
  handle(*MAP.keys)
20
16
 
21
- # Perform dispatch
22
- #
23
- # @return [undefined]
24
- #
25
- # @api private
26
- #
17
+ private
18
+
27
19
  def dispatch
28
20
  visit(body)
29
- write(WS, MAP.fetch(node.type), WS)
21
+ write(' ', MAP.fetch(node.type), ' ')
30
22
  visit(condition)
31
23
  end
32
24
  end
33
25
 
34
- # Base class for while and until emitters
26
+ # Emitter for while and until nodes
35
27
  class Repetition < self
36
- include Terminated
37
-
38
28
  MAP = {
39
- while: K_WHILE,
40
- until: K_UNTIL
29
+ while: 'while',
30
+ until: 'until'
41
31
  }.freeze
42
32
 
43
33
  handle(*MAP.keys)
@@ -46,12 +36,6 @@ module Unparser
46
36
 
47
37
  private
48
38
 
49
- # Perform dispatch
50
- #
51
- # @return [undefined]
52
- #
53
- # @api private
54
- #
55
39
  def dispatch
56
40
  if postcontrol?
57
41
  emit_postcontrol
@@ -60,54 +44,30 @@ module Unparser
60
44
  end
61
45
  end
62
46
 
63
- # Test if node must be emitted in postcontrol form
64
- #
65
- # @return [Boolean]
66
- #
67
- # @api private
68
- #
69
47
  def postcontrol?
70
- return nil unless body # greez from falsyness
71
-
72
- local_variable_scope.first_assignment_in_body_and_used_in_condition?(body, condition)
48
+ body && local_variable_scope.first_assignment_in?(body, condition)
73
49
  end
74
50
 
75
- # Emit keyword
76
- #
77
- # @return [undefined]
78
- #
79
- # @api private
80
- #
81
51
  def emit_keyword
82
- write(MAP.fetch(node.type), WS)
52
+ write(MAP.fetch(node.type), ' ')
83
53
  end
84
54
 
85
- # Emit embedded
86
- #
87
- # @return [undefned]
88
- #
89
- # @api private
90
- #
91
55
  def emit_normal
92
56
  emit_keyword
93
- conditional_parentheses(condition.type.equal?(:block)) do
94
- visit(condition)
57
+ visit(condition)
58
+ if body
59
+ emit_body(body)
60
+ else
61
+ nl
95
62
  end
96
- emit_body
97
63
  k_end
98
64
  end
99
65
 
100
- # Emit postcontrol
101
- #
102
- # @return [undefined]
103
- #
104
- # @api private
105
- #
106
66
  def emit_postcontrol
107
- visit_plain(body)
67
+ visit(body)
108
68
  ws
109
69
  emit_keyword
110
- visit_plain(condition)
70
+ visit(condition)
111
71
  end
112
72
 
113
73
  end # Repetition