unparser 0.4.7 → 0.5.2

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 (143) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -2
  3. data/bin/unparser +1 -1
  4. data/lib/unparser.rb +134 -62
  5. data/lib/unparser/ast.rb +0 -1
  6. data/lib/unparser/ast/local_variable_scope.rb +6 -76
  7. data/lib/unparser/buffer.rb +19 -16
  8. data/lib/unparser/cli.rb +84 -77
  9. data/lib/unparser/{cli/color.rb → color.rb} +0 -13
  10. data/lib/unparser/comments.rb +0 -26
  11. data/lib/unparser/constants.rb +4 -53
  12. data/lib/unparser/diff.rb +98 -0
  13. data/lib/unparser/dsl.rb +0 -32
  14. data/lib/unparser/emitter.rb +24 -425
  15. data/lib/unparser/emitter/alias.rb +2 -8
  16. data/lib/unparser/emitter/args.rb +45 -0
  17. data/lib/unparser/emitter/argument.rb +8 -166
  18. data/lib/unparser/emitter/array.rb +27 -0
  19. data/lib/unparser/emitter/array_pattern.rb +29 -0
  20. data/lib/unparser/emitter/assignment.rb +36 -127
  21. data/lib/unparser/emitter/begin.rb +9 -84
  22. data/lib/unparser/emitter/binary.rb +7 -20
  23. data/lib/unparser/emitter/block.rb +57 -41
  24. data/lib/unparser/emitter/case.rb +6 -48
  25. data/lib/unparser/emitter/case_guard.rb +27 -0
  26. data/lib/unparser/emitter/case_match.rb +40 -0
  27. data/lib/unparser/emitter/cbase.rb +1 -3
  28. data/lib/unparser/emitter/class.rb +6 -26
  29. data/lib/unparser/emitter/const_pattern.rb +24 -0
  30. data/lib/unparser/emitter/def.rb +7 -51
  31. data/lib/unparser/emitter/defined.rb +2 -12
  32. data/lib/unparser/emitter/dstr.rb +22 -0
  33. data/lib/unparser/emitter/dsym.rb +41 -0
  34. data/lib/unparser/emitter/flipflop.rb +11 -10
  35. data/lib/unparser/emitter/float.rb +29 -0
  36. data/lib/unparser/emitter/flow_modifier.rb +8 -55
  37. data/lib/unparser/emitter/for.rb +5 -19
  38. data/lib/unparser/emitter/hash.rb +74 -0
  39. data/lib/unparser/emitter/hash_pattern.rb +67 -0
  40. data/lib/unparser/emitter/hookexe.rb +5 -11
  41. data/lib/unparser/emitter/if.rb +9 -73
  42. data/lib/unparser/emitter/in_match.rb +21 -0
  43. data/lib/unparser/emitter/in_pattern.rb +34 -0
  44. data/lib/unparser/emitter/index.rb +21 -88
  45. data/lib/unparser/emitter/kwbegin.rb +31 -0
  46. data/lib/unparser/emitter/lambda.rb +0 -8
  47. data/lib/unparser/emitter/masgn.rb +20 -0
  48. data/lib/unparser/emitter/match.rb +3 -17
  49. data/lib/unparser/emitter/match_alt.rb +23 -0
  50. data/lib/unparser/emitter/match_as.rb +21 -0
  51. data/lib/unparser/emitter/match_rest.rb +26 -0
  52. data/lib/unparser/emitter/match_var.rb +19 -0
  53. data/lib/unparser/emitter/mlhs.rb +40 -0
  54. data/lib/unparser/emitter/module.rb +3 -9
  55. data/lib/unparser/emitter/op_assign.rb +12 -27
  56. data/lib/unparser/emitter/pin.rb +19 -0
  57. data/lib/unparser/emitter/primitive.rb +93 -0
  58. data/lib/unparser/emitter/range.rb +35 -0
  59. data/lib/unparser/emitter/regexp.rb +35 -0
  60. data/lib/unparser/emitter/repetition.rb +17 -57
  61. data/lib/unparser/emitter/rescue.rb +1 -97
  62. data/lib/unparser/emitter/root.rb +17 -1
  63. data/lib/unparser/emitter/send.rb +10 -219
  64. data/lib/unparser/emitter/simple.rb +33 -0
  65. data/lib/unparser/emitter/splat.rb +2 -18
  66. data/lib/unparser/emitter/super.rb +1 -29
  67. data/lib/unparser/emitter/undef.rb +1 -9
  68. data/lib/unparser/emitter/variable.rb +1 -31
  69. data/lib/unparser/emitter/xstr.rb +72 -0
  70. data/lib/unparser/emitter/yield.rb +1 -9
  71. data/lib/unparser/generation.rb +250 -0
  72. data/lib/unparser/node_details.rb +21 -0
  73. data/lib/unparser/node_details/send.rb +62 -0
  74. data/lib/unparser/node_helpers.rb +45 -6
  75. data/lib/unparser/validation.rb +172 -0
  76. data/lib/unparser/writer.rb +15 -0
  77. data/lib/unparser/writer/binary.rb +99 -0
  78. data/lib/unparser/writer/dynamic_string.rb +233 -0
  79. data/lib/unparser/writer/resbody.rb +40 -0
  80. data/lib/unparser/writer/rescue.rb +39 -0
  81. data/lib/unparser/writer/send.rb +124 -0
  82. data/lib/unparser/{emitter → writer}/send/attribute_assignment.rb +11 -26
  83. data/lib/unparser/writer/send/binary.rb +27 -0
  84. data/lib/unparser/writer/send/conditional.rb +25 -0
  85. data/lib/unparser/writer/send/regular.rb +33 -0
  86. data/lib/unparser/{emitter → writer}/send/unary.rb +10 -17
  87. metadata +127 -104
  88. data/.circleci/config.yml +0 -49
  89. data/.gitignore +0 -37
  90. data/.rspec +0 -4
  91. data/.rubocop.yml +0 -9
  92. data/Changelog.md +0 -156
  93. data/Gemfile +0 -9
  94. data/Gemfile.lock +0 -181
  95. data/LICENSE +0 -20
  96. data/Rakefile +0 -22
  97. data/config/devtools.yml +0 -2
  98. data/config/flay.yml +0 -3
  99. data/config/flog.yml +0 -2
  100. data/config/mutant.yml +0 -6
  101. data/config/reek.yml +0 -98
  102. data/config/rubocop.yml +0 -122
  103. data/config/yardstick.yml +0 -2
  104. data/lib/unparser/cli/differ.rb +0 -152
  105. data/lib/unparser/cli/source.rb +0 -267
  106. data/lib/unparser/emitter/empty.rb +0 -23
  107. data/lib/unparser/emitter/ensure.rb +0 -37
  108. data/lib/unparser/emitter/literal.rb +0 -10
  109. data/lib/unparser/emitter/literal/array.rb +0 -29
  110. data/lib/unparser/emitter/literal/dynamic.rb +0 -53
  111. data/lib/unparser/emitter/literal/dynamic_body.rb +0 -132
  112. data/lib/unparser/emitter/literal/execute_string.rb +0 -38
  113. data/lib/unparser/emitter/literal/hash.rb +0 -156
  114. data/lib/unparser/emitter/literal/primitive.rb +0 -145
  115. data/lib/unparser/emitter/literal/range.rb +0 -36
  116. data/lib/unparser/emitter/literal/regexp.rb +0 -114
  117. data/lib/unparser/emitter/literal/singleton.rb +0 -26
  118. data/lib/unparser/emitter/meta.rb +0 -16
  119. data/lib/unparser/emitter/redo.rb +0 -25
  120. data/lib/unparser/emitter/resbody.rb +0 -76
  121. data/lib/unparser/emitter/retry.rb +0 -25
  122. data/lib/unparser/emitter/send/binary.rb +0 -57
  123. data/lib/unparser/emitter/send/conditional.rb +0 -40
  124. data/lib/unparser/emitter/send/regular.rb +0 -40
  125. data/lib/unparser/preprocessor.rb +0 -159
  126. data/spec/integration/unparser/corpus_spec.rb +0 -111
  127. data/spec/integrations.yml +0 -92
  128. data/spec/spec_helper.rb +0 -20
  129. data/spec/unit/unparser/buffer/append_spec.rb +0 -24
  130. data/spec/unit/unparser/buffer/append_without_prefix_spec.rb +0 -23
  131. data/spec/unit/unparser/buffer/capture_content_spec.rb +0 -17
  132. data/spec/unit/unparser/buffer/content_spec.rb +0 -38
  133. data/spec/unit/unparser/buffer/fresh_line_spec.rb +0 -20
  134. data/spec/unit/unparser/buffer/indent_spec.rb +0 -20
  135. data/spec/unit/unparser/buffer/nl_spec.rb +0 -16
  136. data/spec/unit/unparser/buffer/unindent_spec.rb +0 -20
  137. data/spec/unit/unparser/comments/consume_spec.rb +0 -22
  138. data/spec/unit/unparser/comments/take_all_spec.rb +0 -19
  139. data/spec/unit/unparser/comments/take_before_spec.rb +0 -46
  140. data/spec/unit/unparser/comments/take_eol_comments_spec.rb +0 -32
  141. data/spec/unit/unparser/emitter/class_methods/handle_spec.rb +0 -17
  142. data/spec/unit/unparser_spec.rb +0 -1849
  143. data/unparser.gemspec +0 -32
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cc149df7cd940bb78d005b8f3d30635a877c270d37f40cfe8e7d9ba8b305ab8a
4
- data.tar.gz: c8a1d3dd4aba58f7fd6a6188341916566857057663d660bd24a2d40f6247158a
3
+ metadata.gz: 87327818d4054325cbf2017759e01a434fd80242e6319747ea97326770752e35
4
+ data.tar.gz: 8832d57dfb3f1a4e5755ad5c6737cea20ee4302a2b67d6ff2bb7a0a6cc71dc74
5
5
  SHA512:
6
- metadata.gz: 1cba4e5c9f029441dbca0eb39304478562e76c13023ec22b83dc5eeb58d7640d5c0d83878dad104e45ae6369662f3be0e7141398fb7cf37f6e4932075e305b0b
7
- data.tar.gz: 2c61445c8d43bf01f24bb2f79dd2c49ba96fceef9479c6f1b94a77d7b5eba43fb79f0bbbf7d3995e143b81d208da6ad04852ec761daaf210741f46a049da0893
6
+ metadata.gz: e3e889b7a0130dbe3a77c32ae8d38cc0260b39b2785fba78e8f9033e29f1364699564dc6e2269b0c6a99a989d91f684a5dbbb78dc584c71b53ed05b102eaa9f7
7
+ data.tar.gz: d34a0f19d72855c962ceb9165d909133859ca38f055426b05b905266c9f9145655f1370219a70f2de1d04f2b4cd29cbd818c623b9a77a95385f70d457182ab02
data/README.md CHANGED
@@ -1,8 +1,7 @@
1
1
  unparser
2
2
  ========
3
3
 
4
- [![Build Status](https://secure.travis-ci.org/mbj/unparser.svg?branch=master)](http://travis-ci.org/mbj/unparser)
5
- [![Code Climate](https://codeclimate.com/github/mbj/unparser.svg)](https://codeclimate.com/github/mbj/unparser)
4
+ ![CI](https://github.com/mbj/unparser/workflows/CI/badge.svg)
6
5
  [![Gem Version](https://img.shields.io/gem/v/unparser.svg)](https://rubygems.org/gems/unparser)
7
6
 
8
7
  Generate equivalent source for ASTs from whitequarks [parser](https://github.com/whitequark/parser).
@@ -5,6 +5,6 @@ trap('INT') do |status|
5
5
  exit! 128 + status
6
6
  end
7
7
 
8
- require 'unparser/cli'
8
+ require 'unparser'
9
9
 
10
10
  exit Unparser::CLI.run(ARGV)
@@ -1,16 +1,27 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'set'
4
3
  require 'abstract_type'
5
- require 'procto'
4
+ require 'anima'
6
5
  require 'concord'
6
+ require 'diff/lcs'
7
+ require 'diff/lcs/hunk'
8
+ require 'mprelude'
9
+ require 'optparse'
7
10
  require 'parser/current'
11
+ require 'procto'
12
+ require 'set'
8
13
 
9
14
  # Library namespace
10
15
  module Unparser
11
16
  # Unparser specific AST builder defaulting to modern AST format
12
17
  class Builder < Parser::Builders::Default
13
18
  modernize
19
+
20
+ def initialize
21
+ super
22
+
23
+ self.emit_file_line_as_literals = false
24
+ end
14
25
  end
15
26
 
16
27
  EMPTY_STRING = ''.freeze
@@ -28,23 +39,66 @@ module Unparser
28
39
  # @api private
29
40
  #
30
41
  def self.unparse(node, comment_array = [])
31
- node = Preprocessor.run(node)
32
- buffer = Buffer.new
33
- comments = Comments.new(comment_array)
34
- root = Emitter::Root.new(Parser::AST::Node.new(:root, [node]), buffer, comments)
35
- Emitter.emitter(node, root).write_to_buffer
36
- buffer.content
42
+ return '' if node.nil?
43
+
44
+ Buffer.new.tap do |buffer|
45
+ Emitter::Root.new(
46
+ buffer,
47
+ node,
48
+ Comments.new(comment_array)
49
+ ).write_to_buffer
50
+ end.content
51
+ end
52
+
53
+ # Unparse with validation
54
+ #
55
+ # @param [Parser::AST::Node, nil] node
56
+ # @param [Array] comment_array
57
+ #
58
+ # @return [Either<Validation,String>]
59
+ def self.unparse_validate(node, comment_array = [])
60
+ generated = unparse(node, comment_array)
61
+ validation = Validation.from_string(generated)
62
+
63
+ if validation.success?
64
+ MPrelude::Either::Right.new(generated)
65
+ else
66
+ MPrelude::Either::Left.new(validation)
67
+ end
68
+ end
69
+
70
+ # Unparse capturing errors
71
+ #
72
+ # This is mostly useful for writing testing tools against unparser.
73
+ #
74
+ # @param [Parser::AST::Node, nil] node
75
+ #
76
+ # @return [Either<Exception, String>]
77
+ def self.unparse_either(node)
78
+ MPrelude::Either
79
+ .wrap_error(Exception) { unparse(node) }
37
80
  end
38
81
 
39
82
  # Parse string into AST
40
83
  #
41
84
  # @param [String] source
42
85
  #
43
- # @return [Parser::AST::Node]
86
+ # @return [Parser::AST::Node, nil]
44
87
  def self.parse(source)
45
88
  parser.parse(buffer(source))
46
89
  end
47
90
 
91
+ # Parse string into either syntax error or AST
92
+ #
93
+ # @param [String] source
94
+ #
95
+ # @return [MPrelude::Either<Parser::SyntaxError, (Parser::ASTNode, nil)>]
96
+ def self.parse_either(source)
97
+ MPrelude::Either.wrap_error(Parser::SyntaxError) do
98
+ parser.parse(buffer(source))
99
+ end
100
+ end
101
+
48
102
  # Parse string into AST, with comments
49
103
  #
50
104
  # @param [String] source
@@ -59,8 +113,6 @@ module Unparser
59
113
  # @return [Parser::Base]
60
114
  #
61
115
  # @api private
62
- #
63
- # ignore :reek:NestedIterators
64
116
  def self.parser
65
117
  Parser::CurrentRuby.new(Builder.new).tap do |parser|
66
118
  parser.diagnostics.tap do |diagnostics|
@@ -85,72 +137,92 @@ module Unparser
85
137
  # @param [String] source
86
138
  #
87
139
  # @return [Parser::Source::Buffer]
88
- def self.buffer(source)
89
- Parser::Source::Buffer.new('(string)').tap do |buffer|
90
- buffer.source = source
91
- end
140
+ def self.buffer(source, identification = '(string)')
141
+ Parser::Source::Buffer.new(identification, source: source)
92
142
  end
93
143
  end # Unparser
94
144
 
95
- require 'unparser/buffer'
96
145
  require 'unparser/node_helpers'
97
- require 'unparser/preprocessor'
146
+ require 'unparser/ast'
147
+ require 'unparser/ast/local_variable_scope'
148
+ require 'unparser/buffer'
149
+ require 'unparser/generation'
150
+ require 'unparser/color'
98
151
  require 'unparser/comments'
99
152
  require 'unparser/constants'
153
+ require 'unparser/diff'
100
154
  require 'unparser/dsl'
101
- require 'unparser/ast'
102
- require 'unparser/ast/local_variable_scope'
103
155
  require 'unparser/emitter'
104
- require 'unparser/emitter/literal'
105
- require 'unparser/emitter/literal/primitive'
106
- require 'unparser/emitter/literal/singleton'
107
- require 'unparser/emitter/literal/dynamic'
108
- require 'unparser/emitter/literal/regexp'
109
- require 'unparser/emitter/literal/array'
110
- require 'unparser/emitter/literal/hash'
111
- require 'unparser/emitter/literal/range'
112
- require 'unparser/emitter/literal/dynamic_body'
113
- require 'unparser/emitter/literal/execute_string'
114
- require 'unparser/emitter/meta'
115
- require 'unparser/emitter/send'
116
- require 'unparser/emitter/send/unary'
117
- require 'unparser/emitter/send/binary'
118
- require 'unparser/emitter/send/regular'
119
- require 'unparser/emitter/send/conditional'
120
- require 'unparser/emitter/send/attribute_assignment'
121
- require 'unparser/emitter/block'
122
- require 'unparser/emitter/assignment'
123
- require 'unparser/emitter/variable'
124
- require 'unparser/emitter/splat'
125
- require 'unparser/emitter/cbase'
156
+ require 'unparser/emitter/alias'
157
+ require 'unparser/emitter/args'
126
158
  require 'unparser/emitter/argument'
159
+ require 'unparser/emitter/array'
160
+ require 'unparser/emitter/array_pattern'
161
+ require 'unparser/emitter/assignment'
127
162
  require 'unparser/emitter/begin'
128
- require 'unparser/emitter/flow_modifier'
129
- require 'unparser/emitter/undef'
130
- require 'unparser/emitter/def'
163
+ require 'unparser/emitter/binary'
164
+ require 'unparser/emitter/block'
165
+ require 'unparser/emitter/case'
166
+ require 'unparser/emitter/case_guard'
167
+ require 'unparser/emitter/case_match'
168
+ require 'unparser/emitter/cbase'
131
169
  require 'unparser/emitter/class'
132
- require 'unparser/emitter/module'
133
- require 'unparser/emitter/op_assign'
170
+ require 'unparser/emitter/const_pattern'
171
+ require 'unparser/emitter/def'
134
172
  require 'unparser/emitter/defined'
173
+ require 'unparser/emitter/dstr'
174
+ require 'unparser/emitter/dsym'
175
+ require 'unparser/emitter/flipflop'
176
+ require 'unparser/emitter/float'
177
+ require 'unparser/emitter/flow_modifier'
178
+ require 'unparser/emitter/for'
179
+ require 'unparser/emitter/hash'
180
+ require 'unparser/emitter/hash_pattern'
135
181
  require 'unparser/emitter/hookexe'
136
- require 'unparser/emitter/super'
137
- require 'unparser/emitter/retry'
138
- require 'unparser/emitter/redo'
139
182
  require 'unparser/emitter/if'
140
- require 'unparser/emitter/alias'
141
- require 'unparser/emitter/yield'
142
- require 'unparser/emitter/binary'
143
- require 'unparser/emitter/case'
144
- require 'unparser/emitter/for'
145
- require 'unparser/emitter/repetition'
146
- require 'unparser/emitter/root'
147
- require 'unparser/emitter/match'
148
- require 'unparser/emitter/empty'
149
- require 'unparser/emitter/flipflop'
150
- require 'unparser/emitter/rescue'
151
- require 'unparser/emitter/resbody'
152
- require 'unparser/emitter/ensure'
183
+ require 'unparser/emitter/in_match'
184
+ require 'unparser/emitter/in_pattern'
153
185
  require 'unparser/emitter/index'
186
+ require 'unparser/emitter/kwbegin'
154
187
  require 'unparser/emitter/lambda'
188
+ require 'unparser/emitter/masgn'
189
+ require 'unparser/emitter/match'
190
+ require 'unparser/emitter/match_alt'
191
+ require 'unparser/emitter/match_as'
192
+ require 'unparser/emitter/match_rest'
193
+ require 'unparser/emitter/match_var'
194
+ require 'unparser/emitter/mlhs'
195
+ require 'unparser/emitter/module'
196
+ require 'unparser/emitter/op_assign'
197
+ require 'unparser/emitter/pin'
198
+ require 'unparser/emitter/primitive'
199
+ require 'unparser/emitter/range'
200
+ require 'unparser/emitter/regexp'
201
+ require 'unparser/emitter/repetition'
202
+ require 'unparser/emitter/rescue'
203
+ require 'unparser/emitter/root'
204
+ require 'unparser/emitter/send'
205
+ require 'unparser/emitter/simple'
206
+ require 'unparser/emitter/splat'
207
+ require 'unparser/emitter/super'
208
+ require 'unparser/emitter/undef'
209
+ require 'unparser/emitter/variable'
210
+ require 'unparser/emitter/xstr'
211
+ require 'unparser/emitter/yield'
212
+ require 'unparser/writer'
213
+ require 'unparser/writer/binary'
214
+ require 'unparser/writer/dynamic_string'
215
+ require 'unparser/writer/resbody'
216
+ require 'unparser/writer/rescue'
217
+ require 'unparser/writer/send'
218
+ require 'unparser/writer/send/attribute_assignment'
219
+ require 'unparser/writer/send/binary'
220
+ require 'unparser/writer/send/regular'
221
+ require 'unparser/writer/send/unary'
222
+ require 'unparser/node_details'
223
+ require 'unparser/node_details/send'
224
+ require 'unparser/cli'
225
+
226
+ require 'unparser/validation'
155
227
  # make it easy for zombie
156
228
  require 'unparser/finalize'
@@ -2,7 +2,6 @@
2
2
 
3
3
  module Unparser
4
4
  # Namespace for AST processing tools
5
- # :reek:TooManyConstants
6
5
  module AST
7
6
 
8
7
  FIRST_CHILD = ->(node) { node.children.first }.freeze
@@ -61,35 +61,22 @@ module Unparser
61
61
  #
62
62
  # @api private
63
63
  #
64
- def first_assignment_in_body_and_used_in_condition?(body, condition)
65
- condition_reads = AST.local_variable_reads(condition)
64
+ def first_assignment_in?(left, right)
65
+ condition_reads = AST.local_variable_reads(right)
66
66
 
67
- candidates = AST.local_variable_assignments(body).select do |node|
68
- name = node.children.first
69
- condition_reads.include?(name)
67
+ candidates = AST.local_variable_assignments(left).select do |node|
68
+ condition_reads.include?(node.children.first)
70
69
  end
71
70
 
72
- candidates.any? do |node|
73
- first_assignment?(node)
74
- end
71
+ candidates.any?(&public_method(:first_assignment?))
75
72
  end
76
73
 
77
74
  private
78
75
 
79
- # Match node
80
- #
81
- # @param [Parser::AST::Node] needle
82
- # if block given
83
- #
84
- # @return [Boolean]
85
- #
86
- # @api private
87
- #
88
76
  def match(needle)
89
77
  @items.each do |node, current, before|
90
78
  return yield(current, before) if node.equal?(needle)
91
79
  end
92
- false
93
80
  end
94
81
 
95
82
  end # LocalVariableScope
@@ -137,25 +124,10 @@ module Unparser
137
124
 
138
125
  private
139
126
 
140
- # Return current set of local variables
141
- #
142
- # @return [Set<Symbol>]
143
- #
144
- # @api private
145
- #
146
127
  def current
147
128
  @stack.last
148
129
  end
149
130
 
150
- # Visit node and record local variable state
151
- #
152
- # @param [Parser::AST::Node] node
153
- #
154
- # @return [undefined]
155
- #
156
- # @api private
157
- #
158
- # ignore :reek:LongYieldList
159
131
  def visit(node, &block)
160
132
  before = current.dup
161
133
  enter(node)
@@ -166,75 +138,33 @@ module Unparser
166
138
  leave(node)
167
139
  end
168
140
 
169
- # Record local variable state
170
- #
171
- # @param [Parser::AST::Node] node
172
- #
173
- # @return [undefined]
174
- #
175
- # @api private
176
- #
177
141
  def enter(node)
178
142
  case node.type
179
143
  when *RESET_NODES
180
144
  push_reset
181
- when *ASSIGN_NODES
145
+ when ASSIGN_NODES
182
146
  define(node.children.first)
183
147
  when *INHERIT_NODES
184
148
  push_inherit
185
149
  end
186
150
  end
187
151
 
188
- # Pop from local variable state
189
- #
190
- # @param [Parser::AST::Node] node
191
- #
192
- # @return [undefined]
193
- #
194
- # @api private
195
- #
196
152
  def leave(node)
197
153
  pop if CLOSE_NODES.include?(node.type)
198
154
  end
199
155
 
200
- # Define a local variable on current stack
201
- #
202
- # @param [Symbol] name
203
- #
204
- # @return [undefined]
205
- #
206
- # @api private
207
- #
208
156
  def define(name)
209
157
  current << name
210
158
  end
211
159
 
212
- # Push reset scope on stack
213
- #
214
- # @return [undefined]
215
- #
216
- # @api private
217
- #
218
160
  def push_reset
219
161
  @stack << Set.new
220
162
  end
221
163
 
222
- # Push inherited lvar scope on stack
223
- #
224
- # @return [undefined]
225
- #
226
- # @api private
227
- #
228
164
  def push_inherit
229
165
  @stack << current.dup
230
166
  end
231
167
 
232
- # Pop lvar scope from stack
233
- #
234
- # @return [undefined]
235
- #
236
- # @api private
237
- #
238
168
  def pop
239
169
  @stack.pop
240
170
  end
@@ -3,8 +3,6 @@
3
3
  module Unparser
4
4
 
5
5
  # Buffer used to emit into
6
- #
7
- # ignore :reek:TooManyMethods
8
6
  class Buffer
9
7
 
10
8
  NL = "\n".freeze
@@ -82,6 +80,13 @@ module Unparser
82
80
  self
83
81
  end
84
82
 
83
+ def root_indent
84
+ before = @indent
85
+ @indent = 0
86
+ yield
87
+ @indent = before
88
+ end
89
+
85
90
  # Test for a fresh line
86
91
  #
87
92
  # @return [Boolean]
@@ -114,26 +119,24 @@ module Unparser
114
119
  @content[size_before..-1]
115
120
  end
116
121
 
117
- private
118
-
119
- INDENT_SPACE = ' '.freeze
120
-
121
- # Write prefix
122
- #
123
- # @return [String]
122
+ # Write raw fragment to buffer
124
123
  #
125
- # @api private
126
- #
127
- def prefix
128
- write(INDENT_SPACE * @indent)
129
- end
130
-
131
- # Write to content buffer
124
+ # Does not do indentation logic.
132
125
  #
133
126
  # @param [String] fragment
134
127
  #
128
+ # @return [self]
135
129
  def write(fragment)
136
130
  @content << fragment
131
+ self
132
+ end
133
+
134
+ private
135
+
136
+ INDENT_SPACE = ' '.freeze
137
+
138
+ def prefix
139
+ write(INDENT_SPACE * @indent)
137
140
  end
138
141
 
139
142
  end # Buffer