unparser 0.4.7 → 0.5.2

Sign up to get free protection for your applications and to get access to all the features.
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