unparser 0.4.5 → 0.5.0

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 -3
  3. data/bin/unparser +1 -1
  4. data/lib/unparser.rb +117 -62
  5. data/lib/unparser/ast.rb +1 -2
  6. data/lib/unparser/ast/local_variable_scope.rb +9 -79
  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 +25 -428
  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 +17 -179
  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 +49 -8
  75. data/lib/unparser/validation.rb +151 -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 +229 -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 +152 -101
  88. data/.circleci/config.yml +0 -41
  89. data/.gitignore +0 -37
  90. data/.rspec +0 -4
  91. data/.rubocop.yml +0 -9
  92. data/Changelog.md +0 -146
  93. data/Gemfile +0 -11
  94. data/Gemfile.lock +0 -180
  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 -87
  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 -1841
  143. data/unparser.gemspec +0 -30
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ce1de83bf10221446d1c5f7a5925dfd3df7022d51342678b5fd9eb0f2f1fbcce
4
- data.tar.gz: '083da9ef8026a9afd957b3585e8915f379c126745f8c7863ae0c896258cd31db'
3
+ metadata.gz: c326e601dd3bcfdc7363e456e07d1b15ef323ae095e39026e094205de5206119
4
+ data.tar.gz: a839f69163fab291b893a7e0702771848fc4632161414dff4b4528ad12568573
5
5
  SHA512:
6
- metadata.gz: dafb7bb7320e6b238e52f92f5e31257f53309b276c4693238550459a1c4bb5d8c16ee616d2a5bc8262254c7796705b63ef1e18f0d3b59f8db8423460e0119371
7
- data.tar.gz: 6af30e50074a3ed71557a7bb8f078bf6509bcf2adf8c5ceaf641a1e862a39ed021da672a9bcb29d8e2925b7769f9152a32050eb6adef52fb7b7933bded06ac0b
6
+ metadata.gz: b6821013d903d32988111efbea734cc1daaeb02d5fc4b3073c215365f365fd86d52a40c4b495175610d30c30a467670ea2c37357acbb8191623940673119cfae
7
+ data.tar.gz: 924afece12fe65ab3c4783420ca6ce200db08249830eb0a0cdd16b69ddb05f7377dc0900e832abd0957c97b0d4fe259eaa0c320c67e714d9daeed033575bd235
data/README.md CHANGED
@@ -1,9 +1,7 @@
1
1
  unparser
2
2
  ========
3
3
 
4
- [![Build Status](https://secure.travis-ci.org/mbj/unparser.png?branch=master)](http://travis-ci.org/mbj/unparser)
5
- [![Dependency Status](https://gemnasium.com/mbj/unparser.png)](https://gemnasium.com/mbj/unparser)
6
- [![Code Climate](https://codeclimate.com/github/mbj/unparser.png)](https://codeclimate.com/github/mbj/unparser)
4
+ ![CI](https://github.com/mbj/unparser/workflows/CI/badge.svg)
7
5
  [![Gem Version](https://img.shields.io/gem/v/unparser.svg)](https://rubygems.org/gems/unparser)
8
6
 
9
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,49 @@ 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 capturing errors
54
+ #
55
+ # This is mostly useful for writing testing tools against unparser.
56
+ #
57
+ # @param [Parser::AST::Node, nil] node
58
+ #
59
+ # @return [Either<Exception, String>]
60
+ def self.unparse_either(node)
61
+ MPrelude::Either
62
+ .wrap_error(Exception) { unparse(node) }
37
63
  end
38
64
 
39
65
  # Parse string into AST
40
66
  #
41
67
  # @param [String] source
42
68
  #
43
- # @return [Parser::AST::Node]
69
+ # @return [Parser::AST::Node, nil]
44
70
  def self.parse(source)
45
71
  parser.parse(buffer(source))
46
72
  end
47
73
 
74
+ # Parse string into either syntax error or AST
75
+ #
76
+ # @param [String] source
77
+ #
78
+ # @return [MPrelude::Either<Parser::SyntaxError, (Parser::ASTNode, nil)>]
79
+ def self.parse_either(source)
80
+ MPrelude::Either.wrap_error(Parser::SyntaxError) do
81
+ parser.parse(buffer(source))
82
+ end
83
+ end
84
+
48
85
  # Parse string into AST, with comments
49
86
  #
50
87
  # @param [String] source
@@ -59,8 +96,6 @@ module Unparser
59
96
  # @return [Parser::Base]
60
97
  #
61
98
  # @api private
62
- #
63
- # ignore :reek:NestedIterators
64
99
  def self.parser
65
100
  Parser::CurrentRuby.new(Builder.new).tap do |parser|
66
101
  parser.diagnostics.tap do |diagnostics|
@@ -85,72 +120,92 @@ module Unparser
85
120
  # @param [String] source
86
121
  #
87
122
  # @return [Parser::Source::Buffer]
88
- def self.buffer(source)
89
- Parser::Source::Buffer.new('(string)').tap do |buffer|
90
- buffer.source = source
91
- end
123
+ def self.buffer(source, identification = '(string)')
124
+ Parser::Source::Buffer.new(identification, source: source)
92
125
  end
93
126
  end # Unparser
94
127
 
95
- require 'unparser/buffer'
96
128
  require 'unparser/node_helpers'
97
- require 'unparser/preprocessor'
129
+ require 'unparser/ast'
130
+ require 'unparser/ast/local_variable_scope'
131
+ require 'unparser/buffer'
132
+ require 'unparser/generation'
133
+ require 'unparser/color'
98
134
  require 'unparser/comments'
99
135
  require 'unparser/constants'
136
+ require 'unparser/diff'
100
137
  require 'unparser/dsl'
101
- require 'unparser/ast'
102
- require 'unparser/ast/local_variable_scope'
103
138
  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'
139
+ require 'unparser/emitter/alias'
140
+ require 'unparser/emitter/args'
126
141
  require 'unparser/emitter/argument'
142
+ require 'unparser/emitter/array'
143
+ require 'unparser/emitter/array_pattern'
144
+ require 'unparser/emitter/assignment'
127
145
  require 'unparser/emitter/begin'
128
- require 'unparser/emitter/flow_modifier'
129
- require 'unparser/emitter/undef'
130
- require 'unparser/emitter/def'
146
+ require 'unparser/emitter/binary'
147
+ require 'unparser/emitter/block'
148
+ require 'unparser/emitter/case'
149
+ require 'unparser/emitter/case_guard'
150
+ require 'unparser/emitter/case_match'
151
+ require 'unparser/emitter/cbase'
131
152
  require 'unparser/emitter/class'
132
- require 'unparser/emitter/module'
133
- require 'unparser/emitter/op_assign'
153
+ require 'unparser/emitter/const_pattern'
154
+ require 'unparser/emitter/def'
134
155
  require 'unparser/emitter/defined'
156
+ require 'unparser/emitter/dstr'
157
+ require 'unparser/emitter/dsym'
158
+ require 'unparser/emitter/flipflop'
159
+ require 'unparser/emitter/float'
160
+ require 'unparser/emitter/flow_modifier'
161
+ require 'unparser/emitter/for'
162
+ require 'unparser/emitter/hash'
163
+ require 'unparser/emitter/hash_pattern'
135
164
  require 'unparser/emitter/hookexe'
136
- require 'unparser/emitter/super'
137
- require 'unparser/emitter/retry'
138
- require 'unparser/emitter/redo'
139
165
  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'
166
+ require 'unparser/emitter/in_match'
167
+ require 'unparser/emitter/in_pattern'
153
168
  require 'unparser/emitter/index'
169
+ require 'unparser/emitter/kwbegin'
154
170
  require 'unparser/emitter/lambda'
171
+ require 'unparser/emitter/masgn'
172
+ require 'unparser/emitter/match'
173
+ require 'unparser/emitter/match_alt'
174
+ require 'unparser/emitter/match_as'
175
+ require 'unparser/emitter/match_rest'
176
+ require 'unparser/emitter/match_var'
177
+ require 'unparser/emitter/mlhs'
178
+ require 'unparser/emitter/module'
179
+ require 'unparser/emitter/op_assign'
180
+ require 'unparser/emitter/pin'
181
+ require 'unparser/emitter/primitive'
182
+ require 'unparser/emitter/range'
183
+ require 'unparser/emitter/regexp'
184
+ require 'unparser/emitter/repetition'
185
+ require 'unparser/emitter/rescue'
186
+ require 'unparser/emitter/root'
187
+ require 'unparser/emitter/send'
188
+ require 'unparser/emitter/simple'
189
+ require 'unparser/emitter/splat'
190
+ require 'unparser/emitter/super'
191
+ require 'unparser/emitter/undef'
192
+ require 'unparser/emitter/variable'
193
+ require 'unparser/emitter/xstr'
194
+ require 'unparser/emitter/yield'
195
+ require 'unparser/writer'
196
+ require 'unparser/writer/binary'
197
+ require 'unparser/writer/dynamic_string'
198
+ require 'unparser/writer/resbody'
199
+ require 'unparser/writer/rescue'
200
+ require 'unparser/writer/send'
201
+ require 'unparser/writer/send/attribute_assignment'
202
+ require 'unparser/writer/send/binary'
203
+ require 'unparser/writer/send/regular'
204
+ require 'unparser/writer/send/unary'
205
+ require 'unparser/node_details'
206
+ require 'unparser/node_details/send'
207
+ require 'unparser/cli'
208
+
209
+ require 'unparser/validation'
155
210
  # make it easy for zombie
156
211
  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
@@ -50,7 +49,7 @@ module Unparser
50
49
 
51
50
  # Return local variables that get assigned in scope
52
51
  #
53
- # @param [Parser::AST::Node]
52
+ # @param [Parser::AST::Node] node
54
53
  #
55
54
  # @return [Set<Symbol>]
56
55
  #
@@ -56,40 +56,27 @@ module Unparser
56
56
 
57
57
  # Test if local variables where first assigned in body and read by conditional
58
58
  #
59
- # @param [Parser::AST::Node] conditional
60
59
  # @param [Parser::AST::Node] body
60
+ # @param [Parser::AST::Node] condition
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] node
82
- # if block given
83
- #
84
- # @return [Boolean]
85
- #
86
- # @api private
87
- #
88
- def match(neddle)
76
+ def match(needle)
89
77
  @items.each do |node, current, before|
90
- return yield(current, before) if node.equal?(neddle)
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]
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]
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