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
@@ -4,66 +4,82 @@ module Unparser
4
4
  class Emitter
5
5
 
6
6
  # Block emitter
7
- #
8
- # ignore :reek:RepeatedConditional
9
7
  class Block < self
10
- include Terminated
11
-
12
- handle :block
8
+ handle :block, :numblock
13
9
 
14
10
  children :target, :arguments, :body
15
11
 
16
12
  private
17
13
 
18
- # Perform dispatch
19
- #
20
- # @return [undefined]
21
- #
22
- # @api private
23
- #
24
14
  def dispatch
25
15
  emit_target
26
- write(WS, K_DO)
27
- emit_block_arguments unless stabby_lambda?
28
- emit_body
29
- k_end
16
+ ws
17
+ write_open
18
+ emit_block_arguments unless n_lambda?(target)
19
+ target_writer.emit_heredoc_reminders if n_send?(target)
20
+ emit_optional_body_ensure_rescue(body)
21
+ write_close
30
22
  end
31
23
 
32
- # Emit target
33
- #
34
- # @return [undefined]
35
- #
36
- # @api private
37
- #
38
- def emit_target
39
- visit(target)
24
+ def need_do?
25
+ body && (n_rescue?(body) || n_ensure?(body))
26
+ end
27
+
28
+ def write_open
29
+ if need_do?
30
+ write('do')
31
+ else
32
+ write('{')
33
+ end
34
+ end
40
35
 
41
- if stabby_lambda?
42
- parentheses { visit(arguments) }
36
+ def write_close
37
+ if need_do?
38
+ k_end
39
+ else
40
+ write('}')
43
41
  end
44
42
  end
45
43
 
46
- # Test if we are emitting a stabby lambda
47
- #
48
- # @return [Boolean]
49
- #
50
- # @api private
51
- #
52
- def stabby_lambda?
53
- target.type.equal?(:lambda)
44
+ def target_writer
45
+ writer_with(Writer::Send::Regular, target)
46
+ end
47
+ memoize :target_writer
48
+
49
+ def emit_target
50
+ case target.type
51
+ when :send
52
+ emit_send_target
53
+ when :lambda
54
+ visit(target)
55
+ emit_lambda_arguments unless node.type.equal?(:numblock)
56
+ else
57
+ visit(target)
58
+ end
59
+ end
60
+
61
+ def emit_send_target
62
+ target_writer.emit_receiver
63
+ target_writer.emit_selector
64
+ target_writer.emit_arguments_without_heredoc_body
65
+ end
66
+
67
+ def emit_lambda_arguments
68
+ parentheses { writer_with(Args, arguments).emit_lambda_arguments }
69
+ end
70
+
71
+ def numblock?
72
+ node.type.equal?(:numblock)
54
73
  end
55
74
 
56
- # Emit arguments
57
- #
58
- # @return [undefined]
59
- #
60
- # @api private
61
- #
62
75
  def emit_block_arguments
63
- return if arguments.children.empty?
76
+ return if numblock? || arguments.children.empty?
64
77
 
65
78
  ws
66
- visit_parentheses(arguments, T_PIPE, T_PIPE)
79
+
80
+ parentheses('|', '|') do
81
+ writer_with(Args, arguments).emit_block_arguments
82
+ end
67
83
  end
68
84
 
69
85
  end # Block
@@ -4,8 +4,6 @@ module Unparser
4
4
  class Emitter
5
5
  # Emitter for case nodes
6
6
  class Case < self
7
- include Terminated
8
-
9
7
  handle :case
10
8
 
11
9
  children :condition
@@ -13,89 +11,49 @@ module Unparser
13
11
 
14
12
  private
15
13
 
16
- # Perform dispatch
17
- #
18
- # @return [undefined]
19
- #
20
- # @api private
21
- #
22
14
  def dispatch
23
- write(K_CASE)
15
+ write('case')
24
16
  emit_condition
25
17
  emit_whens
26
18
  emit_else
27
19
  k_end
28
20
  end
29
21
 
30
- # Emit else
31
- #
32
- # @return [undefined]
33
- #
34
- # @api private
35
- #
36
22
  def emit_else
37
23
  else_branch = children.last
38
24
  return unless else_branch
39
25
 
40
- write(K_ELSE)
41
- visit_indented(else_branch)
26
+ write('else')
27
+ emit_body(else_branch)
42
28
  end
43
29
 
44
- # Emit whens
45
- #
46
- # @return [undefined]
47
- #
48
- # @api private
49
- #
50
30
  def emit_whens
51
31
  nl
52
32
  whens.each(&method(:visit))
53
33
  end
54
34
 
55
- # Emit condition
56
- #
57
- # @return [undefined]
58
- #
59
- # @api private
60
- #
61
35
  def emit_condition
62
36
  return unless condition
63
37
 
64
- write(WS)
38
+ ws
65
39
  visit(condition)
66
40
  end
67
-
68
41
  end # Case
69
42
 
70
43
  # Emitter for when nodes
71
44
  class When < self
72
- include Terminated
73
-
74
45
  handle :when
75
46
 
76
47
  define_group :captures, 0..-2
77
48
 
78
49
  private
79
50
 
80
- # Perform dispatch
81
- #
82
- # @return [undefined]
83
- #
84
- # @api private
85
- #
86
51
  def dispatch
87
- write(K_WHEN, WS)
52
+ write('when ')
88
53
  emit_captures
89
- body = children.last
90
- emit_body(body)
54
+ emit_optional_body(children.last)
91
55
  end
92
56
 
93
- # Emit captures
94
- #
95
- # @return [undefined]
96
- #
97
- # @api private
98
- #
99
57
  def emit_captures
100
58
  delimited(captures)
101
59
  end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for case guards
6
+ class CaseGuard < self
7
+
8
+ handle :if_guard, :unless_guard
9
+
10
+ MAP = {
11
+ if_guard: 'if',
12
+ unless_guard: 'unless'
13
+ }.freeze
14
+
15
+ children :condition
16
+
17
+ private
18
+
19
+ def dispatch
20
+ write(MAP.fetch(node_type))
21
+ ws
22
+ visit(condition)
23
+ end
24
+
25
+ end # UnlessGuard
26
+ end # Emitter
27
+ end # Unparser
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for case matches
6
+ class CaseMatch < self
7
+
8
+ handle :case_match
9
+
10
+ children :target
11
+
12
+ define_group :patterns, 1..-2
13
+
14
+ private
15
+
16
+ def else_branch
17
+ children.last
18
+ end
19
+
20
+ def dispatch
21
+ write('case ')
22
+ visit(target)
23
+ nl
24
+ patterns.each(&method(:visit))
25
+ nl unless buffer.fresh_line?
26
+ emit_else_branch
27
+ k_end
28
+ end
29
+
30
+ def emit_else_branch
31
+ if else_branch
32
+ write('else')
33
+ emit_body(else_branch) unless n_empty_else?(else_branch)
34
+ nl unless buffer.fresh_line?
35
+ end
36
+ end
37
+
38
+ end # CaseMatch
39
+ end # Emitter
40
+ end # Unparser
@@ -4,8 +4,6 @@ module Unparser
4
4
  class Emitter
5
5
  # Emitter for toplevel constant reference nodes
6
6
  class CBase < self
7
- include Terminated
8
-
9
7
  handle :cbase
10
8
 
11
9
  private
@@ -17,7 +15,7 @@ module Unparser
17
15
  # @api private
18
16
  #
19
17
  def dispatch
20
- write(T_DCL)
18
+ write('::')
21
19
  end
22
20
 
23
21
  end # CBase
@@ -4,7 +4,7 @@ module Unparser
4
4
  class Emitter
5
5
  # Emitter for class nodes
6
6
  class Class < self
7
- include LocalVariableRoot, Terminated
7
+ include LocalVariableRoot
8
8
 
9
9
  handle :class
10
10
 
@@ -12,30 +12,18 @@ 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_CLASS, WS)
16
+ write('class ')
23
17
  visit(name)
24
18
  emit_superclass
25
- emit_body
19
+ emit_optional_body(body)
26
20
  k_end
27
21
  end
28
22
 
29
- # Emit superclass
30
- #
31
- # @return [undefined]
32
- #
33
- # @api private
34
- #
35
23
  def emit_superclass
36
24
  return unless superclass
37
25
 
38
- write(WS, T_LT, WS)
26
+ write(' < ')
39
27
  visit(superclass)
40
28
  end
41
29
 
@@ -43,24 +31,16 @@ module Unparser
43
31
 
44
32
  # Emitter for sclass nodes
45
33
  class SClass < self
46
- include Terminated
47
-
48
34
  handle :sclass
49
35
 
50
36
  children :object, :body
51
37
 
52
38
  private
53
39
 
54
- # Perform dispatch
55
- #
56
- # @return [undefined]
57
- #
58
- # @api private
59
- #
60
40
  def dispatch
61
- write(K_CLASS, WS, T_DLT, WS)
41
+ write('class << ')
62
42
  visit(object)
63
- emit_body
43
+ emit_optional_body(body)
64
44
  k_end
65
45
  end
66
46
 
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for const pattern node
6
+ class ConstPattern < self
7
+
8
+ handle :const_pattern
9
+
10
+ children :const, :pattern
11
+
12
+ private
13
+
14
+ def dispatch
15
+ visit(const)
16
+ if n_hash_pattern?(pattern)
17
+ emitter(pattern).emit_const_pattern
18
+ else
19
+ visit(pattern)
20
+ end
21
+ end
22
+ end # ConstPattern
23
+ end # Emitter
24
+ end # Unparser
@@ -4,70 +4,40 @@ module Unparser
4
4
  class Emitter
5
5
  # Emitter for def node
6
6
  class Def < self
7
- include LocalVariableRoot, Terminated
7
+ include LocalVariableRoot
8
8
 
9
9
  private
10
10
 
11
- # Emit name
12
- #
13
- # @return [undefined]
14
- #
15
- # @api private
16
- #
17
11
  abstract_method :emit_name
18
12
  private :emit_name
19
13
 
20
- # Return body node
21
- #
22
- # @return [Parser::AST::Node]
23
- #
24
- # @api private
25
- #
26
14
  abstract_method :body
27
15
  private :body
28
16
 
29
- # Perform dispatch
30
- #
31
- # @return [undefined]
32
- #
33
- # @api private
34
- #
35
17
  def dispatch
36
- write(K_DEF, WS)
18
+ write('def ')
37
19
  emit_name
38
- comments.consume(node, :name)
39
20
  emit_arguments
40
- emit_body
21
+ emit_optional_body_ensure_rescue(body)
41
22
  k_end
42
23
  end
43
24
 
44
- # Emit arguments
45
- #
46
- # @return [undefined]
47
- #
48
- # @api private
49
- #
50
25
  def emit_arguments
51
26
  return if arguments.children.empty?
52
27
 
53
- visit_parentheses(arguments)
28
+ parentheses do
29
+ writer_with(Args, arguments).emit_def_arguments
30
+ end
54
31
  end
55
32
 
56
33
  # Instance def emitter
57
34
  class Instance < self
58
-
59
35
  handle :def
60
36
 
61
37
  children :name, :arguments, :body
62
38
 
63
39
  private
64
40
 
65
- # Emit name
66
- #
67
- # @return [undefined]
68
- #
69
- # @api private
70
- #
71
41
  def emit_name
72
42
  write(name.to_s)
73
43
  end
@@ -83,25 +53,13 @@ module Unparser
83
53
 
84
54
  private
85
55
 
86
- # Return mame
87
- #
88
- # @return [String]
89
- #
90
- # @api private
91
- #
92
56
  def emit_name
93
57
  conditional_parentheses(!subject_without_parens?) do
94
58
  visit(subject)
95
59
  end
96
- write(T_DOT, name.to_s)
60
+ write('.', name.to_s)
97
61
  end
98
62
 
99
- # Test if subject needs parentheses
100
- #
101
- # @return [Boolean]
102
- #
103
- # @api private
104
- #
105
63
  def subject_without_parens?
106
64
  case subject.type
107
65
  when :self
@@ -111,8 +69,6 @@ module Unparser
111
69
  when :send
112
70
  receiver, _selector, *arguments = *subject
113
71
  !receiver && arguments.empty?
114
- else
115
- false
116
72
  end
117
73
  end
118
74
 
@@ -4,25 +4,15 @@ module Unparser
4
4
  class Emitter
5
5
  # Emitter for defined? nodes
6
6
  class Defined < self
7
- include Terminated
8
-
9
7
  handle :defined?
10
8
 
11
9
  children :subject
12
10
 
13
11
  private
14
12
 
15
- # Perform dispatch
16
- #
17
- # @return [undefined]
18
- #
19
- # @api private
20
- #
21
13
  def dispatch
22
- write(K_DEFINED)
23
- parentheses do
24
- visit(subject)
25
- end
14
+ write('defined?')
15
+ parentheses { visit(subject) }
26
16
  end
27
17
 
28
18
  end # Defined
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Dynamic string emitter
6
+ class DStr < self
7
+
8
+ handle :dstr
9
+
10
+ def emit_heredoc_reminders
11
+ writer_with(Writer::DynamicString, node).emit_heredoc_reminder
12
+ end
13
+
14
+ private
15
+
16
+ def dispatch
17
+ writer_with(Writer::DynamicString, node).dispatch
18
+ end
19
+
20
+ end # DStr
21
+ end # Emitter
22
+ end # Unparser
@@ -0,0 +1,41 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Dynamic symbol literal emitter
6
+ class DSym < self
7
+ handle :dsym
8
+
9
+ private
10
+
11
+ def dispatch
12
+ write(':"')
13
+ children.each do |child|
14
+ case child.type
15
+ when :str
16
+ emit_str_child(child)
17
+ when :begin
18
+ emit_begin_child(child)
19
+ end
20
+ end
21
+ write('"')
22
+ end
23
+
24
+ def emit_str_child(value)
25
+ string = value.children.first
26
+ if string.end_with?("\n")
27
+ write(string.inspect[1..-4])
28
+ nl
29
+ else
30
+ write(string.inspect[1..-2])
31
+ end
32
+ end
33
+
34
+ def emit_begin_child(component)
35
+ write('#{')
36
+ visit(unwrap_single_begin(component))
37
+ write('}')
38
+ end
39
+ end # DSym
40
+ end # Emitter
41
+ end # Unparser
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emitter for in pattern nodes
6
+ class FindPattern < self
7
+ handle :find_pattern
8
+
9
+ private
10
+
11
+ def dispatch
12
+ write('[')
13
+ delimited(children)
14
+ write(']')
15
+ end
16
+ end # FindPattern
17
+ end # Emitter
18
+ end # Unparser
@@ -4,12 +4,19 @@ module Unparser
4
4
  class Emitter
5
5
  # Emitter for flip flops
6
6
  class FlipFlop < self
7
- include Unterminated
8
-
9
- MAP = IceNine.deep_freeze(
7
+ MAP = {
10
8
  iflipflop: '..',
11
9
  eflipflop: '...'
12
- ).freeze
10
+ }.freeze
11
+
12
+ SYMBOLS = {
13
+ eflipflop: :tDOT3,
14
+ iflipflop: :tDOT2
15
+ }.freeze
16
+
17
+ def symbol_name
18
+ true
19
+ end
13
20
 
14
21
  handle(*MAP.keys)
15
22
 
@@ -17,12 +24,6 @@ module Unparser
17
24
 
18
25
  private
19
26
 
20
- # Perform dispatch
21
- #
22
- # @return [undefined]
23
- #
24
- # @api private
25
- #
26
27
  def dispatch
27
28
  visit(left)
28
29
  write(MAP.fetch(node.type))
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Unparser
4
+ class Emitter
5
+ # Emiter for float literals
6
+ class Float < self
7
+ handle :float
8
+
9
+ children :value
10
+
11
+ INFINITY = ::Float::INFINITY
12
+ NEG_INFINITY = -::Float::INFINITY
13
+
14
+ private
15
+
16
+ def dispatch
17
+ case value
18
+ when INFINITY
19
+ write('10e1000000000000000000')
20
+ when NEG_INFINITY
21
+ write('-10e1000000000000000000')
22
+ else
23
+ write(value.inspect)
24
+ end
25
+ end
26
+
27
+ end # Float
28
+ end # Emitter
29
+ end # Unparser