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.
- checksums.yaml +4 -4
- data/README.md +1 -2
- data/bin/unparser +1 -1
- data/lib/unparser.rb +134 -62
- data/lib/unparser/ast.rb +0 -1
- data/lib/unparser/ast/local_variable_scope.rb +6 -76
- data/lib/unparser/buffer.rb +19 -16
- data/lib/unparser/cli.rb +84 -77
- data/lib/unparser/{cli/color.rb → color.rb} +0 -13
- data/lib/unparser/comments.rb +0 -26
- data/lib/unparser/constants.rb +4 -53
- data/lib/unparser/diff.rb +98 -0
- data/lib/unparser/dsl.rb +0 -32
- data/lib/unparser/emitter.rb +24 -425
- data/lib/unparser/emitter/alias.rb +2 -8
- data/lib/unparser/emitter/args.rb +45 -0
- data/lib/unparser/emitter/argument.rb +8 -166
- data/lib/unparser/emitter/array.rb +27 -0
- data/lib/unparser/emitter/array_pattern.rb +29 -0
- data/lib/unparser/emitter/assignment.rb +36 -127
- data/lib/unparser/emitter/begin.rb +9 -84
- data/lib/unparser/emitter/binary.rb +7 -20
- data/lib/unparser/emitter/block.rb +57 -41
- data/lib/unparser/emitter/case.rb +6 -48
- data/lib/unparser/emitter/case_guard.rb +27 -0
- data/lib/unparser/emitter/case_match.rb +40 -0
- data/lib/unparser/emitter/cbase.rb +1 -3
- data/lib/unparser/emitter/class.rb +6 -26
- data/lib/unparser/emitter/const_pattern.rb +24 -0
- data/lib/unparser/emitter/def.rb +7 -51
- data/lib/unparser/emitter/defined.rb +2 -12
- data/lib/unparser/emitter/dstr.rb +22 -0
- data/lib/unparser/emitter/dsym.rb +41 -0
- data/lib/unparser/emitter/flipflop.rb +11 -10
- data/lib/unparser/emitter/float.rb +29 -0
- data/lib/unparser/emitter/flow_modifier.rb +8 -55
- data/lib/unparser/emitter/for.rb +5 -19
- data/lib/unparser/emitter/hash.rb +74 -0
- data/lib/unparser/emitter/hash_pattern.rb +67 -0
- data/lib/unparser/emitter/hookexe.rb +5 -11
- data/lib/unparser/emitter/if.rb +9 -73
- data/lib/unparser/emitter/in_match.rb +21 -0
- data/lib/unparser/emitter/in_pattern.rb +34 -0
- data/lib/unparser/emitter/index.rb +21 -88
- data/lib/unparser/emitter/kwbegin.rb +31 -0
- data/lib/unparser/emitter/lambda.rb +0 -8
- data/lib/unparser/emitter/masgn.rb +20 -0
- data/lib/unparser/emitter/match.rb +3 -17
- data/lib/unparser/emitter/match_alt.rb +23 -0
- data/lib/unparser/emitter/match_as.rb +21 -0
- data/lib/unparser/emitter/match_rest.rb +26 -0
- data/lib/unparser/emitter/match_var.rb +19 -0
- data/lib/unparser/emitter/mlhs.rb +40 -0
- data/lib/unparser/emitter/module.rb +3 -9
- data/lib/unparser/emitter/op_assign.rb +12 -27
- data/lib/unparser/emitter/pin.rb +19 -0
- data/lib/unparser/emitter/primitive.rb +93 -0
- data/lib/unparser/emitter/range.rb +35 -0
- data/lib/unparser/emitter/regexp.rb +35 -0
- data/lib/unparser/emitter/repetition.rb +17 -57
- data/lib/unparser/emitter/rescue.rb +1 -97
- data/lib/unparser/emitter/root.rb +17 -1
- data/lib/unparser/emitter/send.rb +10 -219
- data/lib/unparser/emitter/simple.rb +33 -0
- data/lib/unparser/emitter/splat.rb +2 -18
- data/lib/unparser/emitter/super.rb +1 -29
- data/lib/unparser/emitter/undef.rb +1 -9
- data/lib/unparser/emitter/variable.rb +1 -31
- data/lib/unparser/emitter/xstr.rb +72 -0
- data/lib/unparser/emitter/yield.rb +1 -9
- data/lib/unparser/generation.rb +250 -0
- data/lib/unparser/node_details.rb +21 -0
- data/lib/unparser/node_details/send.rb +62 -0
- data/lib/unparser/node_helpers.rb +45 -6
- data/lib/unparser/validation.rb +172 -0
- data/lib/unparser/writer.rb +15 -0
- data/lib/unparser/writer/binary.rb +99 -0
- data/lib/unparser/writer/dynamic_string.rb +233 -0
- data/lib/unparser/writer/resbody.rb +40 -0
- data/lib/unparser/writer/rescue.rb +39 -0
- data/lib/unparser/writer/send.rb +124 -0
- data/lib/unparser/{emitter → writer}/send/attribute_assignment.rb +11 -26
- data/lib/unparser/writer/send/binary.rb +27 -0
- data/lib/unparser/writer/send/conditional.rb +25 -0
- data/lib/unparser/writer/send/regular.rb +33 -0
- data/lib/unparser/{emitter → writer}/send/unary.rb +10 -17
- metadata +127 -104
- data/.circleci/config.yml +0 -49
- data/.gitignore +0 -37
- data/.rspec +0 -4
- data/.rubocop.yml +0 -9
- data/Changelog.md +0 -156
- data/Gemfile +0 -9
- data/Gemfile.lock +0 -181
- data/LICENSE +0 -20
- data/Rakefile +0 -22
- data/config/devtools.yml +0 -2
- data/config/flay.yml +0 -3
- data/config/flog.yml +0 -2
- data/config/mutant.yml +0 -6
- data/config/reek.yml +0 -98
- data/config/rubocop.yml +0 -122
- data/config/yardstick.yml +0 -2
- data/lib/unparser/cli/differ.rb +0 -152
- data/lib/unparser/cli/source.rb +0 -267
- data/lib/unparser/emitter/empty.rb +0 -23
- data/lib/unparser/emitter/ensure.rb +0 -37
- data/lib/unparser/emitter/literal.rb +0 -10
- data/lib/unparser/emitter/literal/array.rb +0 -29
- data/lib/unparser/emitter/literal/dynamic.rb +0 -53
- data/lib/unparser/emitter/literal/dynamic_body.rb +0 -132
- data/lib/unparser/emitter/literal/execute_string.rb +0 -38
- data/lib/unparser/emitter/literal/hash.rb +0 -156
- data/lib/unparser/emitter/literal/primitive.rb +0 -145
- data/lib/unparser/emitter/literal/range.rb +0 -36
- data/lib/unparser/emitter/literal/regexp.rb +0 -114
- data/lib/unparser/emitter/literal/singleton.rb +0 -26
- data/lib/unparser/emitter/meta.rb +0 -16
- data/lib/unparser/emitter/redo.rb +0 -25
- data/lib/unparser/emitter/resbody.rb +0 -76
- data/lib/unparser/emitter/retry.rb +0 -25
- data/lib/unparser/emitter/send/binary.rb +0 -57
- data/lib/unparser/emitter/send/conditional.rb +0 -40
- data/lib/unparser/emitter/send/regular.rb +0 -40
- data/lib/unparser/preprocessor.rb +0 -159
- data/spec/integration/unparser/corpus_spec.rb +0 -111
- data/spec/integrations.yml +0 -92
- data/spec/spec_helper.rb +0 -20
- data/spec/unit/unparser/buffer/append_spec.rb +0 -24
- data/spec/unit/unparser/buffer/append_without_prefix_spec.rb +0 -23
- data/spec/unit/unparser/buffer/capture_content_spec.rb +0 -17
- data/spec/unit/unparser/buffer/content_spec.rb +0 -38
- data/spec/unit/unparser/buffer/fresh_line_spec.rb +0 -20
- data/spec/unit/unparser/buffer/indent_spec.rb +0 -20
- data/spec/unit/unparser/buffer/nl_spec.rb +0 -16
- data/spec/unit/unparser/buffer/unindent_spec.rb +0 -20
- data/spec/unit/unparser/comments/consume_spec.rb +0 -22
- data/spec/unit/unparser/comments/take_all_spec.rb +0 -19
- data/spec/unit/unparser/comments/take_before_spec.rb +0 -46
- data/spec/unit/unparser/comments/take_eol_comments_spec.rb +0 -32
- data/spec/unit/unparser/emitter/class_methods/handle_spec.rb +0 -17
- data/spec/unit/unparser_spec.rb +0 -1849
- data/unparser.gemspec +0 -32
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 87327818d4054325cbf2017759e01a434fd80242e6319747ea97326770752e35
|
|
4
|
+
data.tar.gz: 8832d57dfb3f1a4e5755ad5c6737cea20ee4302a2b67d6ff2bb7a0a6cc71dc74
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
|
|
5
|
-
[](https://codeclimate.com/github/mbj/unparser)
|
|
4
|
+

|
|
6
5
|
[](https://rubygems.org/gems/unparser)
|
|
7
6
|
|
|
8
7
|
Generate equivalent source for ASTs from whitequarks [parser](https://github.com/whitequark/parser).
|
data/bin/unparser
CHANGED
data/lib/unparser.rb
CHANGED
|
@@ -1,16 +1,27 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
require 'set'
|
|
4
3
|
require 'abstract_type'
|
|
5
|
-
require '
|
|
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
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
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(
|
|
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/
|
|
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/
|
|
105
|
-
require 'unparser/emitter/
|
|
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/
|
|
129
|
-
require 'unparser/emitter/
|
|
130
|
-
require 'unparser/emitter/
|
|
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/
|
|
133
|
-
require 'unparser/emitter/
|
|
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/
|
|
141
|
-
require 'unparser/emitter/
|
|
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'
|
data/lib/unparser/ast.rb
CHANGED
|
@@ -61,35 +61,22 @@ module Unparser
|
|
|
61
61
|
#
|
|
62
62
|
# @api private
|
|
63
63
|
#
|
|
64
|
-
def
|
|
65
|
-
condition_reads = AST.local_variable_reads(
|
|
64
|
+
def first_assignment_in?(left, right)
|
|
65
|
+
condition_reads = AST.local_variable_reads(right)
|
|
66
66
|
|
|
67
|
-
candidates = AST.local_variable_assignments(
|
|
68
|
-
|
|
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?
|
|
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
|
|
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
|
data/lib/unparser/buffer.rb
CHANGED
|
@@ -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
|
-
|
|
118
|
-
|
|
119
|
-
INDENT_SPACE = ' '.freeze
|
|
120
|
-
|
|
121
|
-
# Write prefix
|
|
122
|
-
#
|
|
123
|
-
# @return [String]
|
|
122
|
+
# Write raw fragment to buffer
|
|
124
123
|
#
|
|
125
|
-
#
|
|
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
|