unparser 0.4.7 → 0.6.7

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