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
data/lib/unparser.rb CHANGED
@@ -1,22 +1,50 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'set'
4
- require 'abstract_type'
5
- require 'procto'
6
- require 'concord'
3
+ require 'diff/lcs'
4
+ require 'diff/lcs/hunk'
5
+ require 'optparse'
7
6
  require 'parser/current'
7
+ require 'set'
8
+
9
+ require 'unparser/equalizer'
10
+ require 'unparser/adamantium'
11
+ require 'unparser/adamantium/method_builder'
12
+ require 'unparser/abstract_type'
13
+
14
+ require 'unparser/concord'
15
+ require 'unparser/either'
16
+ require 'unparser/anima'
17
+ require 'unparser/anima/attribute'
18
+ require 'unparser/anima/error'
8
19
 
9
20
  # Library namespace
10
21
  module Unparser
11
22
  # Unparser specific AST builder defaulting to modern AST format
12
23
  class Builder < Parser::Builders::Default
13
24
  modernize
25
+
26
+ def initialize
27
+ super
28
+
29
+ self.emit_file_line_as_literals = false
30
+ end
14
31
  end
15
32
 
16
33
  EMPTY_STRING = ''.freeze
17
34
  EMPTY_ARRAY = [].freeze
18
35
 
19
- private_constant(*constants(false))
36
+ private_constant(*constants(false) - %i[Adamantium AbstractType Anima Concord Either Equalizer Memoizable])
37
+
38
+ # Error raised when unparser encounters an invalid AST
39
+ class InvalidNodeError < RuntimeError
40
+ attr_reader :node
41
+
42
+ def initialize(message, node)
43
+ super(message)
44
+ @node = node
45
+ freeze
46
+ end
47
+ end
20
48
 
21
49
  # Unparse an AST (and, optionally, comments) into a string
22
50
  #
@@ -25,26 +53,70 @@ module Unparser
25
53
  #
26
54
  # @return [String]
27
55
  #
28
- # @api private
56
+ # @raise InvalidNodeError
57
+ # if the node passed is invalid
29
58
  #
59
+ # @api public
30
60
  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
61
+ return '' if node.nil?
62
+
63
+ Buffer.new.tap do |buffer|
64
+ Emitter::Root.new(
65
+ buffer,
66
+ node,
67
+ Comments.new(comment_array)
68
+ ).write_to_buffer
69
+ end.content
70
+ end
71
+
72
+ # Unparse with validation
73
+ #
74
+ # @param [Parser::AST::Node, nil] node
75
+ # @param [Array] comment_array
76
+ #
77
+ # @return [Either<Validation,String>]
78
+ def self.unparse_validate(node, comment_array = [])
79
+ generated = unparse(node, comment_array)
80
+ validation = Validation.from_string(generated)
81
+
82
+ if validation.success?
83
+ Either::Right.new(generated)
84
+ else
85
+ Either::Left.new(validation)
86
+ end
87
+ end
88
+
89
+ # Unparse capturing errors
90
+ #
91
+ # This is mostly useful for writing testing tools against unparser.
92
+ #
93
+ # @param [Parser::AST::Node, nil] node
94
+ #
95
+ # @return [Either<Exception, String>]
96
+ def self.unparse_either(node)
97
+ Either.wrap_error(Exception) { unparse(node) }
37
98
  end
38
99
 
39
100
  # Parse string into AST
40
101
  #
41
102
  # @param [String] source
42
103
  #
43
- # @return [Parser::AST::Node]
104
+ # @return [Parser::AST::Node, nil]
44
105
  def self.parse(source)
45
106
  parser.parse(buffer(source))
46
107
  end
47
108
 
109
+ # Parse string into either syntax error or AST
110
+ #
111
+ # @param [String] source
112
+ #
113
+ # @return [Either<Parser::SyntaxError, (Parser::ASTNode, nil)>]
114
+ def self.parse_either(source)
115
+ Either.wrap_error(Parser::SyntaxError) do
116
+ parser.parse(buffer(source))
117
+ end
118
+ end
119
+
48
120
  # Parse string into AST, with comments
49
121
  #
50
122
  # @param [String] source
@@ -59,98 +131,110 @@ module Unparser
59
131
  # @return [Parser::Base]
60
132
  #
61
133
  # @api private
62
- #
63
- # ignore :reek:NestedIterators
64
134
  def self.parser
65
135
  Parser::CurrentRuby.new(Builder.new).tap do |parser|
66
136
  parser.diagnostics.tap do |diagnostics|
67
137
  diagnostics.all_errors_are_fatal = true
68
- diagnostics.consumer = method(:consume_diagnostic)
69
138
  end
70
139
  end
71
140
  end
72
141
 
73
- # Consume diagnostic
74
- #
75
- # @param [Parser::Diagnostic] diagnostic
76
- #
77
- # @return [undefined]
78
- def self.consume_diagnostic(diagnostic)
79
- Kernel.warn(diagnostic.render)
80
- end
81
- private_class_method :consume_diagnostic
82
-
83
142
  # Construct a parser buffer from string
84
143
  #
85
144
  # @param [String] source
86
145
  #
87
146
  # @return [Parser::Source::Buffer]
88
- def self.buffer(source)
89
- Parser::Source::Buffer.new('(string)').tap do |buffer|
90
- buffer.source = source
91
- end
147
+ def self.buffer(source, identification = '(string)')
148
+ Parser::Source::Buffer.new(identification, source: source)
92
149
  end
93
150
  end # Unparser
94
151
 
95
- require 'unparser/buffer'
96
152
  require 'unparser/node_helpers'
97
- require 'unparser/preprocessor'
153
+ require 'unparser/ast'
154
+ require 'unparser/ast/local_variable_scope'
155
+ require 'unparser/buffer'
156
+ require 'unparser/generation'
157
+ require 'unparser/color'
98
158
  require 'unparser/comments'
99
159
  require 'unparser/constants'
160
+ require 'unparser/diff'
100
161
  require 'unparser/dsl'
101
- require 'unparser/ast'
102
- require 'unparser/ast/local_variable_scope'
103
162
  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'
163
+ require 'unparser/emitter/alias'
164
+ require 'unparser/emitter/args'
126
165
  require 'unparser/emitter/argument'
166
+ require 'unparser/emitter/array'
167
+ require 'unparser/emitter/array_pattern'
168
+ require 'unparser/emitter/assignment'
127
169
  require 'unparser/emitter/begin'
128
- require 'unparser/emitter/flow_modifier'
129
- require 'unparser/emitter/undef'
130
- require 'unparser/emitter/def'
170
+ require 'unparser/emitter/binary'
171
+ require 'unparser/emitter/block'
172
+ require 'unparser/emitter/case'
173
+ require 'unparser/emitter/case_guard'
174
+ require 'unparser/emitter/case_match'
175
+ require 'unparser/emitter/cbase'
131
176
  require 'unparser/emitter/class'
132
- require 'unparser/emitter/module'
133
- require 'unparser/emitter/op_assign'
177
+ require 'unparser/emitter/const_pattern'
178
+ require 'unparser/emitter/def'
134
179
  require 'unparser/emitter/defined'
180
+ require 'unparser/emitter/dstr'
181
+ require 'unparser/emitter/dsym'
182
+ require 'unparser/emitter/flipflop'
183
+ require 'unparser/emitter/float'
184
+ require 'unparser/emitter/flow_modifier'
185
+ require 'unparser/emitter/for'
186
+ require 'unparser/emitter/hash'
187
+ require 'unparser/emitter/hash_pattern'
135
188
  require 'unparser/emitter/hookexe'
136
- require 'unparser/emitter/super'
137
- require 'unparser/emitter/retry'
138
- require 'unparser/emitter/redo'
139
189
  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'
190
+ require 'unparser/emitter/in_match'
191
+ require 'unparser/emitter/in_pattern'
153
192
  require 'unparser/emitter/index'
193
+ require 'unparser/emitter/kwbegin'
154
194
  require 'unparser/emitter/lambda'
195
+ require 'unparser/emitter/masgn'
196
+ require 'unparser/emitter/match'
197
+ require 'unparser/emitter/match_alt'
198
+ require 'unparser/emitter/match_as'
199
+ require 'unparser/emitter/match_rest'
200
+ require 'unparser/emitter/match_var'
201
+ require 'unparser/emitter/mlhs'
202
+ require 'unparser/emitter/module'
203
+ require 'unparser/emitter/op_assign'
204
+ require 'unparser/emitter/pin'
205
+ require 'unparser/emitter/primitive'
206
+ require 'unparser/emitter/range'
207
+ require 'unparser/emitter/regexp'
208
+ require 'unparser/emitter/repetition'
209
+ require 'unparser/emitter/rescue'
210
+ require 'unparser/emitter/root'
211
+ require 'unparser/emitter/send'
212
+ require 'unparser/emitter/simple'
213
+ require 'unparser/emitter/splat'
214
+ require 'unparser/emitter/super'
215
+ require 'unparser/emitter/undef'
216
+ require 'unparser/emitter/variable'
217
+ require 'unparser/emitter/xstr'
218
+ require 'unparser/emitter/yield'
219
+ require 'unparser/emitter/kwargs'
220
+ require 'unparser/emitter/pair'
221
+ require 'unparser/emitter/find_pattern'
222
+ require 'unparser/emitter/match_pattern'
223
+ require 'unparser/emitter/match_pattern_p'
224
+ require 'unparser/writer'
225
+ require 'unparser/writer/binary'
226
+ require 'unparser/writer/dynamic_string'
227
+ require 'unparser/writer/resbody'
228
+ require 'unparser/writer/rescue'
229
+ require 'unparser/writer/send'
230
+ require 'unparser/writer/send/attribute_assignment'
231
+ require 'unparser/writer/send/binary'
232
+ require 'unparser/writer/send/regular'
233
+ require 'unparser/writer/send/unary'
234
+ require 'unparser/node_details'
235
+ require 'unparser/node_details/send'
236
+ require 'unparser/cli'
237
+
238
+ require 'unparser/validation'
155
239
  # make it easy for zombie
156
240
  require 'unparser/finalize'