ripper_ruby_parser 1.7.2 → 1.10.0

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 (48) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +50 -0
  3. data/README.md +4 -4
  4. data/lib/ripper_ruby_parser/commenting_ripper_parser.rb +24 -12
  5. data/lib/ripper_ruby_parser/sexp_handlers/assignment.rb +2 -2
  6. data/lib/ripper_ruby_parser/sexp_handlers/blocks.rb +47 -53
  7. data/lib/ripper_ruby_parser/sexp_handlers/conditionals.rb +17 -19
  8. data/lib/ripper_ruby_parser/sexp_handlers/helper_methods.rb +34 -1
  9. data/lib/ripper_ruby_parser/sexp_handlers/literals.rb +1 -1
  10. data/lib/ripper_ruby_parser/sexp_handlers/method_calls.rb +9 -5
  11. data/lib/ripper_ruby_parser/sexp_handlers/methods.rb +17 -15
  12. data/lib/ripper_ruby_parser/sexp_handlers/operators.rb +3 -3
  13. data/lib/ripper_ruby_parser/sexp_handlers/string_literals.rb +24 -28
  14. data/lib/ripper_ruby_parser/sexp_processor.rb +5 -18
  15. data/lib/ripper_ruby_parser/unescape.rb +63 -22
  16. data/lib/ripper_ruby_parser/version.rb +1 -1
  17. metadata +140 -79
  18. data/Rakefile +0 -33
  19. data/test/end_to_end/comments_test.rb +0 -59
  20. data/test/end_to_end/comparison_test.rb +0 -104
  21. data/test/end_to_end/lib_comparison_test.rb +0 -18
  22. data/test/end_to_end/line_numbering_test.rb +0 -31
  23. data/test/end_to_end/samples_comparison_test.rb +0 -13
  24. data/test/end_to_end/test_comparison_test.rb +0 -18
  25. data/test/pt_testcase/pt_test.rb +0 -44
  26. data/test/ripper_ruby_parser/commenting_ripper_parser_test.rb +0 -200
  27. data/test/ripper_ruby_parser/parser_test.rb +0 -576
  28. data/test/ripper_ruby_parser/sexp_handlers/assignment_test.rb +0 -597
  29. data/test/ripper_ruby_parser/sexp_handlers/blocks_test.rb +0 -717
  30. data/test/ripper_ruby_parser/sexp_handlers/conditionals_test.rb +0 -536
  31. data/test/ripper_ruby_parser/sexp_handlers/literals_test.rb +0 -165
  32. data/test/ripper_ruby_parser/sexp_handlers/loops_test.rb +0 -209
  33. data/test/ripper_ruby_parser/sexp_handlers/method_calls_test.rb +0 -237
  34. data/test/ripper_ruby_parser/sexp_handlers/methods_test.rb +0 -429
  35. data/test/ripper_ruby_parser/sexp_handlers/operators_test.rb +0 -405
  36. data/test/ripper_ruby_parser/sexp_handlers/string_literals_test.rb +0 -973
  37. data/test/ripper_ruby_parser/sexp_processor_test.rb +0 -327
  38. data/test/ripper_ruby_parser/version_test.rb +0 -7
  39. data/test/samples/assignment.rb +0 -22
  40. data/test/samples/comments.rb +0 -13
  41. data/test/samples/conditionals.rb +0 -23
  42. data/test/samples/lambdas.rb +0 -5
  43. data/test/samples/loops.rb +0 -36
  44. data/test/samples/misc.rb +0 -285
  45. data/test/samples/number.rb +0 -9
  46. data/test/samples/operators.rb +0 -18
  47. data/test/samples/strings.rb +0 -147
  48. data/test/test_helper.rb +0 -111
@@ -1,327 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require File.expand_path("../test_helper.rb", File.dirname(__FILE__))
4
-
5
- class TestProcessor < RipperRubyParser::SexpProcessor
6
- def process_foo(exp)
7
- exp.shift
8
- s(:foo_p)
9
- end
10
-
11
- def process_bar(exp)
12
- exp.shift
13
- s(:bar_p)
14
- end
15
-
16
- def process_baz(exp)
17
- exp.shift
18
- s(:baz_p)
19
- end
20
- end
21
-
22
- describe RipperRubyParser::SexpProcessor do
23
- let :processor do
24
- TestProcessor.new
25
- end
26
-
27
- describe "#process" do
28
- describe "for a :program sexp" do
29
- it "strips off the outer :program node" do
30
- sexp = s(:program, s(:stmts, s(:foo)))
31
- result = processor.process sexp
32
- _(result).must_equal s(:foo_p)
33
- end
34
-
35
- it "transforms a multi-statement :program into a :block sexp" do
36
- sexp = s(:program, s(:stmts, s(:foo), s(:bar)))
37
- result = processor.process sexp
38
- _(result).must_equal s(:block, s(:foo_p), s(:bar_p))
39
- end
40
- end
41
-
42
- describe "for a :string_literal sexp" do
43
- it "transforms a simple sexp to :str" do
44
- sexp = s(:string_literal,
45
- s(:string_content,
46
- s(:@tstring_content, "foo", s(1, 1), '"')))
47
- result = processor.process sexp
48
- _(result).must_equal s(:str, "foo")
49
- end
50
- end
51
-
52
- describe "for a :command sexp" do
53
- it "transforms a sexp to a :call" do
54
- sexp = s(:command, s(:@ident, "foo", s(1, 0)), s(:arglist, s(:foo)))
55
- result = processor.process sexp
56
- _(result).must_equal s(:call, nil, :foo, s(:foo_p))
57
- end
58
- end
59
-
60
- describe "for a :var_ref sexp" do
61
- it "transforms the sexp to a :lvar sexp" do
62
- sexp = s(:var_ref, s(:@ident, "bar", s(1, 4)))
63
- result = processor.process sexp
64
- _(result).must_equal s(:lvar, :bar)
65
- end
66
- end
67
-
68
- describe "for a :vcall sexp" do
69
- it "transforms the sexp to a :call sexp" do
70
- sexp = s(:vcall, s(:@ident, "bar", s(1, 4)))
71
- result = processor.process sexp
72
- _(result).must_equal s(:call, nil, :bar)
73
- end
74
- end
75
-
76
- describe "for a :module sexp" do
77
- it "does not create body elements for an empty definition" do
78
- sexp = s(:module,
79
- s(:const_ref, s(:@const, "Foo", s(1, 13))),
80
- s(:bodystmt, s(:stmts, s(:void_stmt, s(2, 3))), nil, nil, nil))
81
- result = processor.process sexp
82
- _(result).must_equal s(:module, :Foo)
83
- end
84
-
85
- it "creates a single body element for a definition with one statement" do
86
- sexp = s(:module,
87
- s(:const_ref, s(:@const, "Foo", s(1, 13))),
88
- s(:bodystmt, s(:stmts, s(:foo)), nil, nil, nil))
89
- result = processor.process sexp
90
- _(result).must_equal s(:module, :Foo, s(:foo_p))
91
- end
92
-
93
- it "creates multiple body elements for a definition with more than one statement" do
94
- sexp = s(:module,
95
- s(:const_ref, s(:@const, "Foo", s(1, 13))),
96
- s(:bodystmt, s(:stmts, s(:foo), s(:bar)), nil, nil, nil))
97
- result = processor.process sexp
98
- _(result).must_equal s(:module, :Foo, s(:foo_p), s(:bar_p))
99
- end
100
- end
101
-
102
- describe "for a :class sexp" do
103
- it "does not create body eleents for an empty definition" do
104
- sexp = s(:class,
105
- s(:const_ref, s(:@const, "Foo", s(1, 13))), nil,
106
- s(:bodystmt, s(:stmts, s(:void_stmt, s(2, 8))), nil, nil, nil))
107
- result = processor.process sexp
108
- _(result).must_equal s(:class, :Foo, nil)
109
- end
110
-
111
- it "creates a single body element for a definition with one statement" do
112
- sexp = s(:class,
113
- s(:const_ref, s(:@const, "Foo", s(1, 13))), nil,
114
- s(:bodystmt, s(:stmts, s(:foo)), nil, nil, nil))
115
- result = processor.process sexp
116
- _(result).must_equal s(:class, :Foo, nil, s(:foo_p))
117
- end
118
-
119
- it "creates multiple body elements for a definition with more than one statement" do
120
- sexp = s(:class,
121
- s(:const_ref, s(:@const, "Foo", s(1, 13))), nil,
122
- s(:bodystmt, s(:stmts, s(:foo), s(:bar)), nil, nil, nil))
123
- result = processor.process sexp
124
- _(result).must_equal s(:class, :Foo, nil, s(:foo_p), s(:bar_p))
125
- end
126
-
127
- it "passes on the given ancestor" do
128
- sexp = s(:class,
129
- s(:const_ref, s(:@const, "Foo", s(1, 13))),
130
- s(:var_ref, s(:@const, "Bar", s(1, 12))),
131
- s(:bodystmt, s(:stmts, s(:void_stmt, s(2, 7))), nil, nil, nil))
132
- result = processor.process sexp
133
- _(result).must_equal s(:class, :Foo, s(:const, :Bar))
134
- end
135
- end
136
-
137
- describe "for a :bodystmt sexp" do
138
- it "creates a :block sexp when multiple statements are present" do
139
- sexp = s(:bodystmt, s(:stmts, s(:foo), s(:bar)), nil, nil, nil)
140
- result = processor.process sexp
141
- _(result).must_equal s(:block, s(:foo_p), s(:bar_p))
142
- end
143
-
144
- it "removes nested :void_stmt sexps" do
145
- sexp = s(:bodystmt, s(:stmts, s(:void_stmt), s(:foo)), nil, nil, nil)
146
- result = processor.process sexp
147
- _(result).must_equal s(:foo_p)
148
- end
149
- end
150
-
151
- describe "for a :def sexp" do
152
- it "transforms the sexp for a basic function definition" do
153
- sexp = s(:def,
154
- s(:@ident, "foo", s(1, 4)),
155
- s(:params, nil, nil, nil, nil, nil),
156
- s(:bodystmt, s(:stmts, s(:void_stmt, s(2, 3))), nil, nil, nil))
157
- result = processor.process sexp
158
- _(result).must_equal s(:defn, :foo, s(:args), s(:nil))
159
- end
160
- end
161
-
162
- describe "for a :params sexp" do
163
- describe "with a normal arguments" do
164
- it "creates :lvar sexps" do
165
- sexp = s(:params, s(s(:@ident, "bar", s(1, 8))), nil, nil, nil, nil)
166
- result = processor.process sexp
167
- _(result).must_equal s(:args, s(:lvar, :bar))
168
- end
169
- end
170
-
171
- describe "with a ruby 2.4-style doublesplat argument" do
172
- it "creates :lvar sexps" do
173
- sexp = s(:params,
174
- nil, nil, nil, nil, nil,
175
- s(:@ident, "bar", s(1, 8)),
176
- nil)
177
- result = processor.process sexp
178
- _(result).must_equal s(:args, s(:dsplat, s(:lvar, :bar)))
179
- end
180
- end
181
- describe "with a ruby 2.5-style kwrest argument" do
182
- it "creates :lvar sexps" do
183
- sexp = s(:params,
184
- nil, nil, nil, nil, nil,
185
- s(:kwrest_param, s(:@ident, "bar", s(1, 8))),
186
- nil)
187
- result = processor.process sexp
188
- _(result).must_equal s(:args, s(:dsplat, s(:lvar, :bar)))
189
- end
190
- end
191
- end
192
-
193
- describe "for an :assign sexp" do
194
- it "creates a :lasgn sexp" do
195
- sexp = s(:assign,
196
- s(:var_field, s(:@ident, "a", s(1, 0))),
197
- s(:@int, "1", s(1, 4)))
198
- result = processor.process sexp
199
- _(result).must_equal s(:lasgn, :a, s(:lit, 1))
200
- end
201
- end
202
-
203
- describe "for a :binary sexp" do
204
- it "creates a :call sexp" do
205
- sexp = s(:binary, s(:bar), :==, s(:foo))
206
- result = processor.process sexp
207
- _(result).must_equal s(:call, s(:bar_p), :==, s(:foo_p))
208
- end
209
- end
210
-
211
- describe "for a :method_add_block sexp" do
212
- it "creates an :iter sexp" do
213
- sexp = s(:method_add_block,
214
- s(:call, s(:foo), :".", s(:@ident, "baz", s(1, 2))),
215
- s(:brace_block, nil, s(:stmts, s(:bar))))
216
- result = processor.process sexp
217
- _(result).must_equal s(:iter,
218
- s(:call, s(:foo_p), :baz), 0,
219
- s(:bar_p))
220
- end
221
-
222
- describe "with a block parameter" do
223
- it "creates an :iter sexp with an :args sexp for the block parameter" do
224
- sexp = s(:method_add_block,
225
- s(:call, s(:foo), :".", s(:@ident, "baz", s(1, 2))),
226
- s(:brace_block,
227
- s(:block_var,
228
- s(:params, s(s(:@ident, "i", s(1, 6))), nil, nil, nil, nil),
229
- nil),
230
- s(:stmts, s(:bar))))
231
- result = processor.process sexp
232
- _(result).must_equal s(:iter,
233
- s(:call, s(:foo_p), :baz),
234
- s(:args, :i),
235
- s(:bar_p))
236
- end
237
- end
238
- end
239
-
240
- describe "for an :if sexp" do
241
- describe "with a single statement in the if body" do
242
- it "uses the statement sexp as the body" do
243
- sexp = s(:if, s(:foo), s(:stmts, s(:bar)), nil)
244
- result = processor.process sexp
245
- _(result).must_equal s(:if, s(:foo_p), s(:bar_p), nil)
246
- end
247
- end
248
-
249
- describe "with multiple statements in the if body" do
250
- it "uses a block containing the statement sexps as the body" do
251
- sexp = s(:if, s(:foo), s(:stmts, s(:bar), s(:baz)), nil)
252
- result = processor.process sexp
253
- _(result).must_equal s(:if, s(:foo_p), s(:block, s(:bar_p), s(:baz_p)), nil)
254
- end
255
- end
256
- end
257
-
258
- describe "for an :array sexp" do
259
- it "pulls up the element sexps" do
260
- sexp = s(:array, s(:words, s(:foo), s(:bar), s(:baz)))
261
- result = processor.process sexp
262
- _(result).must_equal s(:array, s(:foo_p), s(:bar_p), s(:baz_p))
263
- end
264
- end
265
-
266
- describe "for a :const_path_ref sexp" do
267
- it "returns a :colon2 sexp" do
268
- sexp = s(:const_path_ref,
269
- s(:var_ref, s(:@const, "Foo", s(1, 0))),
270
- s(:@const, "Bar", s(1, 5)))
271
- result = processor.process sexp
272
- _(result).must_equal s(:colon2, s(:const, :Foo), :Bar)
273
- end
274
- end
275
-
276
- describe "for a :when sexp" do
277
- it "turns nested :when clauses into a list" do
278
- sexp = s(:when, s(:args, s(:foo)), s(:stmts, s(:bar)),
279
- s(:when, s(:args, s(:foo)), s(:stmts, s(:bar)),
280
- s(:when, s(:args, s(:foo)), s(:stmts, s(:bar)), nil)))
281
- result = processor.process sexp
282
- _(result).must_equal s(s(:when, s(:array, s(:foo_p)), s(:bar_p)),
283
- s(:when, s(:array, s(:foo_p)), s(:bar_p)),
284
- s(:when, s(:array, s(:foo_p)), s(:bar_p)),
285
- nil)
286
- end
287
- end
288
-
289
- it "processes a Ruby 2.5 style period Sexp" do
290
- sexp = s(:call,
291
- s(:vcall, s(:@ident, "foo", s(1, 0))),
292
- :'.',
293
- s(:@ident, "bar", s(1, 4)))
294
- _(processor.process(sexp)).must_equal s(:call, s(:call, nil, :foo), :bar)
295
- end
296
-
297
- it "processes a Ruby 2.6 style period Sexp" do
298
- sexp = s(:call,
299
- s(:vcall, s(:@ident, "foo", s(1, 0))),
300
- s(:@period, ".", s(1, 3)),
301
- s(:@ident, "bar", s(1, 4)))
302
- _(processor.process(sexp)).must_equal s(:call, s(:call, nil, :foo), :bar)
303
- end
304
-
305
- it "raises an error for an unknown call operator" do
306
- sexp = s(:call,
307
- s(:vcall, s(:@ident, "foo", s(1, 0))),
308
- :'>.',
309
- s(:@ident, "bar", s(1, 4)))
310
- _(-> { processor.process(sexp) }).must_raise KeyError
311
- end
312
- end
313
-
314
- describe "#extract_node_symbol" do
315
- it "processes an lvar sexp to a bare symbol" do
316
- sexp = s(:lvar, "foo")
317
- result = processor.send :extract_node_symbol, sexp
318
- _(result).must_equal :foo
319
- end
320
-
321
- it "processes a const sexp to a bare symbol" do
322
- sexp = s(:const, "Foo")
323
- result = processor.send :extract_node_symbol, sexp
324
- _(result).must_equal :Foo
325
- end
326
- end
327
- end
@@ -1,7 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- describe RipperRubyParser do
4
- it "knows its own version" do
5
- _(RipperRubyParser::VERSION).wont_be_nil
6
- end
7
- end
@@ -1,22 +0,0 @@
1
- # Samples of assignment
2
- foo[bar] = baz
3
- foo[bar] += baz
4
- foo[bar] ||= foo bar
5
- foo[bar] ||= foo(bar)
6
- foo[bar] ||= baz.qux quuz
7
- foo[bar] ||= baz.qux(quuz)
8
-
9
- # Destructuring assignments
10
- foo, bar = baz
11
- (foo, bar) = baz
12
- ((foo, bar)) = baz
13
- (((foo, bar))) = baz
14
- foo, (bar, baz) = qux
15
- foo, ((bar, baz)) = qux
16
- foo, (((bar, baz))) = qux
17
- foo, (bar, (baz, qux)) = quuz
18
-
19
- # Safe attribute assignment
20
- foo&.bar = baz
21
- foo[bar]&.baz = qux
22
- foo[bar, baz]&.qux = quuz
@@ -1,13 +0,0 @@
1
- =begin
2
- This is an unusual type of comment that needs to be handled correctly
3
- =end
4
-
5
- class Foo
6
-
7
- end
8
-
9
- # This is a more common type of comment
10
-
11
- class Bar
12
-
13
- end
@@ -1,23 +0,0 @@
1
- # Conditionals
2
-
3
- if begin foo end
4
- bar
5
- end
6
-
7
- if begin foo..bar end
8
- baz
9
- end
10
-
11
- if foo
12
- elsif begin bar end
13
- end
14
-
15
- if foo
16
- elsif begin bar..baz end
17
- end
18
-
19
- if 1
20
- bar
21
- else
22
- baz
23
- end
@@ -1,5 +0,0 @@
1
- -> { }
2
- ->() { }
3
- ->(foo) { foo + bar }
4
- lambda { }
5
- lambda { |foo| foo + bar }
@@ -1,36 +0,0 @@
1
- # Loop samples
2
-
3
- def for_samples
4
- for foo in bar
5
- end
6
-
7
- for foo, bar in baz
8
- end
9
-
10
- for foo, in bar
11
- end
12
- end
13
-
14
- # begin..end in conditions
15
- #
16
- def while_until_samples
17
- while begin foo end
18
- bar
19
- end
20
-
21
- until begin foo end
22
- bar
23
- end
24
-
25
- while begin foo end do
26
- bar
27
- end
28
-
29
- until begin foo end do
30
- bar
31
- end
32
-
33
- foo while begin bar end
34
-
35
- foo until begin bar end
36
- end