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
data/test/samples/misc.rb DELETED
@@ -1,285 +0,0 @@
1
- # Miscellaneous samples
2
-
3
- BEGIN {
4
- begin
5
- foo
6
- end
7
- }
8
-
9
- BEGIN {}
10
-
11
- END {
12
- begin
13
- bar
14
- end
15
- }
16
-
17
- END {}
18
-
19
- # regular expressions with different encoding flags
20
- regular = /foo/
21
- noenc = /foo/n
22
- utf8 = /foo/u
23
- euc = /foo/e
24
- sjis = /foo/s
25
-
26
- bar = 'bar'
27
- regular = /foo#{bar}/
28
- noenc = /foo#{bar}/n
29
- utf8 = /foo#{bar}/u
30
- euc = /foo#{bar}/e
31
- sjis = /foo#{bar}/s
32
-
33
- # Use of __ENCODING__
34
- enc = __ENCODING__
35
-
36
- class Foo
37
- # calling #[] on self
38
- # https://github.com/seattlerb/ruby_parser/issues/250
39
- def bar
40
- self[:foo]
41
- end
42
-
43
- # required keyword arguments and no parentheses
44
- # https://github.com/seattlerb/ruby_parser/pull/254
45
- def foo a:, b:
46
- puts "A: #{a}, B: #{b}"
47
- end
48
-
49
- # Combinations of begin..end and diverse operators
50
- def qux
51
- begin end
52
- begin; foo; end
53
- begin; foo; bar; end
54
- - begin; foo; end
55
- begin; bar; end + foo
56
- foo + begin; bar; end
57
- begin; foo; end ? bar : baz
58
- foo ? begin; bar; end : baz
59
- foo ? bar : begin; baz; end
60
- begin; bar; end and foo
61
- foo and begin; bar; end
62
- begin; foo; end if bar
63
- begin; foo; end unless bar
64
- begin; foo; end.bar
65
- foo ||= begin; bar; end
66
- foo += begin; bar; end
67
- foo[qux] ||= begin; bar; end
68
- foo = begin; bar; end
69
- foo = begin; if bar; baz; end; end
70
- baz = begin; foo; ensure; bar; end
71
- foo = *begin; bar; end
72
- foo = bar, *begin; baz; end
73
- foo, bar = *begin; baz; end
74
- foo if begin bar end
75
- end
76
-
77
- # Nested do and begin blocks
78
- def quuz
79
- foo do
80
- bar
81
-
82
- begin
83
- baz
84
- rescue
85
- qux
86
- end
87
-
88
- quuz
89
- end
90
- end
91
-
92
- # Nested begin/rescue blocks
93
- def quuz
94
- begin
95
- bar
96
- rescue
97
- begin
98
- baz
99
- end
100
- end
101
-
102
- begin
103
- bar
104
- rescue
105
- begin
106
- baz
107
- rescue
108
- qux
109
- end
110
- end
111
-
112
- begin
113
- bar
114
- rescue
115
- begin
116
- baz
117
- end
118
- begin
119
- qux
120
- end
121
- end
122
- end
123
-
124
- # Begin/end blocks and case statements
125
- def quuz
126
- case foo
127
- when bar
128
- begin
129
- baz
130
- end
131
- end
132
-
133
- case foo
134
- when bar
135
- begin
136
- baz
137
- qux
138
- end
139
- end
140
-
141
- case foo
142
- when bar
143
- begin
144
- baz
145
- qux
146
- end
147
- quuz
148
- end
149
-
150
- case foo
151
- when bar
152
- else
153
- begin
154
- baz
155
- qux
156
- end
157
- end
158
-
159
- case foo
160
- when bar
161
- else
162
- begin
163
- baz
164
- qux
165
- end
166
- quuz
167
- end
168
- end
169
-
170
- # Using splat and double-splat args
171
- def barbaz(*foo, **bar)
172
- puts [foo, bar]
173
- foo.each do |baz, **qux|
174
- puts [foo, bar, baz, qux]
175
- end
176
- puts [foo, bar]
177
- end
178
-
179
- def barbaz_block(*foo, **bar, &block)
180
- puts [foo, bar]
181
- end
182
-
183
- def self.barbaz(*foo, **bar)
184
- puts [foo, bar]
185
- foo.each do |baz, **qux|
186
- puts [foo, bar, baz, qux]
187
- end
188
- puts [foo, bar]
189
- end
190
-
191
- def foobarbaz(**)
192
- end
193
-
194
- # rescue
195
- def barfoo
196
- foo
197
- rescue *bar
198
- baz
199
- rescue *quuz, Bar
200
- zyxxy
201
- rescue *qux => err
202
- puts err
203
- end
204
-
205
- # begin/rescue with multiple assignment
206
- foo, bar = begin
207
- baz
208
- rescue qux
209
- quuz
210
- end
211
-
212
- # alias
213
- alias foo bar
214
- alias :foo bar
215
- alias :foo :bar
216
- alias foo :bar
217
- alias :+ -
218
- alias next bar
219
-
220
- # rescue with assignment
221
- foo = bar rescue baz
222
- foo = bar baz rescue qux
223
- foo = bar(baz) rescue qux
224
- foo, bar = baz qux rescue quuz
225
- @foo = bar baz rescue qux
226
- @@foo = bar baz rescue qux
227
- FOO = bar baz rescue qux
228
- $foo = bar baz rescue qux
229
- foo = Foo.bar(baz) rescue qux
230
- foo = Foo.bar baz rescue qux
231
-
232
- # Assignment to class variables inside method argument
233
- # definitions.
234
- def foo(bar = (@@baz = qux))
235
- end
236
-
237
- def self.foo(bar = (@@baz = qux))
238
- end
239
-
240
- def (bar = (@@baz = qux)).foo
241
- end
242
-
243
- # Assignment to global variables inside method argument
244
- # definitions.
245
- def foo(bar = ($baz = qux))
246
- end
247
-
248
- # Argument destructuring
249
- def foo((bar, baz))
250
- end
251
-
252
- def foo((bar, baz), (qux, quuz))
253
- end
254
-
255
- def foo((bar, *qux))
256
- end
257
-
258
- def foo((bar, (baz, qux)))
259
- end
260
-
261
- def foo((bar, (baz, *qux)))
262
- end
263
-
264
- def self.foo((bar, baz))
265
- end
266
-
267
- def self.foo((bar, baz), (qux, quuz))
268
- end
269
-
270
- def self.foo((bar, *qux))
271
- end
272
-
273
- def self.foo((bar, (baz, qux)))
274
- end
275
-
276
- def self.foo((bar, (baz, *qux)))
277
- end
278
- end
279
-
280
- # Special symbols
281
- [:`, :|, :*, :&, :%, :'^', :-@, :+@, :'~@']
282
-
283
- # Blocks
284
- foo do |bar, | end
285
- foo do |bar, **| end
@@ -1,9 +0,0 @@
1
- # Samples of number-like literals
2
-
3
- 3.14
4
- 42
5
- 100r
6
- 0700
7
- 0x100
8
- 1+3i
9
- 3.2-4.2i
@@ -1,18 +0,0 @@
1
- # Samples of different operators
2
-
3
- # range operator (..)
4
- 0..4
5
- -1..-3
6
- 'a'..'z'
7
- 0.0..4.0
8
- foo..bar
9
- 0..4.0
10
- 0.0..4
11
-
12
- # exclusive range operator (...)
13
- 0...4
14
- -1...-3
15
- 'a'...'z'
16
- 0.0...4.0
17
- foo...bar
18
- 0...4.0
@@ -1,147 +0,0 @@
1
- # Samples of strings demonstrating handling of escape sequences, encoding and
2
- # line continuations.
3
-
4
- # Escape sequences
5
- %W(foo\nbar baz)
6
- %w(foo\nbar baz)
7
-
8
- "foo\u273bbar"
9
- "foo\a\b\e\f\r\s\t\vbar\nbaz"
10
- "\0"
11
- "foo#{bar}\0"
12
- "foo#{bar}baz\0"
13
- "2\302\275"
14
- "#{foo}2\302\275"
15
- %W(2\302\275)
16
- /2\302\275/
17
- "foo\u{101D1}bar"
18
-
19
- # Encoding
20
- "日本語"
21
- /日本語/
22
- "\xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E" # => "日本語"
23
- "\xAB\xE6\x97\xA5" # Invalid in UTF8
24
-
25
- <<EOS
26
- 日本語
27
- EOS
28
-
29
- <<EOS
30
- \xE6\x97\xA5\xE6\x9C\xAC\xE8\xAA\x9E
31
- EOS
32
-
33
- # Quotes around heredoc names
34
- <<'FOO'
35
- \n
36
- FOO
37
-
38
- <<"FOO"
39
- \n
40
- FOO
41
-
42
- # Escape sequences in heredocs, in particular carriage returns
43
- #
44
- <<FOO
45
- foo\rbar\tbaz\r
46
- FOO
47
-
48
- <<'FOO'
49
- foo\rbar\tbaz\r
50
- FOO
51
-
52
- # Dedented heredocs
53
- foo = <<~BAR
54
- baz
55
- #{qux}
56
- quuz
57
- BAR
58
-
59
- # Line continuation
60
- "foo\
61
- bar"
62
-
63
- 'foo2\
64
- bar'
65
-
66
- /foo3\
67
- bar/
68
-
69
- <<EOS
70
- foo4\
71
- bar
72
- EOS
73
-
74
- <<'EOS'
75
- foo4\
76
- bar
77
- EOS
78
-
79
- <<EOS
80
- #{bar}
81
- baz \
82
- qux
83
- EOS
84
-
85
- <<-EOS
86
- #{bar}
87
- baz \
88
- qux
89
- EOS
90
-
91
- %Q[foo5\
92
- bar]
93
-
94
- %W[fooa\
95
- bar baz]
96
-
97
- %I[foob\
98
- bar baz]
99
-
100
- %q[fooc\
101
- bar]
102
-
103
- %w[food\
104
- bar baz]
105
-
106
- %i[fooe\
107
- bar baz]
108
-
109
- %r[foof\
110
- bar baz]
111
-
112
- # Escaped line continuation
113
- "foo6\\
114
- bar"
115
- 'foo7\\
116
- bar'
117
- /foo8\\
118
- bar/
119
- <<EOS
120
- foo9\\
121
- bar
122
- EOS
123
- %Q[foo10\\
124
- bar]
125
- %W[foog\\
126
- bar baz]
127
- %I[fooh\\
128
- bar baz]
129
- %q[fooi\\
130
- bar]
131
- %w[fooj\\
132
- bar baz]
133
- %i[fook\\
134
- bar baz]
135
- %r[fool\\
136
- bar baz]
137
-
138
- eval(<<FOO, __FILE__, __LINE__)
139
- bar
140
- baz
141
- FOO
142
-
143
- # Interpolation
144
- "foo#{bar}"
145
- "foo#{"bar#{baz}"}"
146
- "foo#{"bar#{"baz#{qux}"}"}"
147
- "foo#{"bar#{baz}"}foo#{"bar#{baz}"}"
data/test/test_helper.rb DELETED
@@ -1,111 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "simplecov"
4
- SimpleCov.start do
5
- add_filter "/test/"
6
- end
7
-
8
- require "minitest/autorun"
9
-
10
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), "..", "lib"))
11
-
12
- require "ripper_ruby_parser"
13
-
14
- module MiniTest
15
- class Spec
16
- def inspect_with_line_numbers(exp)
17
- parts = exp.map do |sub_exp|
18
- if sub_exp.is_a? Sexp
19
- inspect_with_line_numbers(sub_exp)
20
- else
21
- sub_exp.inspect
22
- end
23
- end
24
-
25
- plain = "s(#{parts.join(', ')})"
26
- if exp.line
27
- "#{plain}.line(#{exp.line})"
28
- else
29
- plain
30
- end
31
- end
32
-
33
- def formatted(exp, with_line_numbers: false)
34
- inspection = if with_line_numbers
35
- inspect_with_line_numbers(exp)
36
- else
37
- exp.inspect
38
- end
39
- inspection.gsub(/\), /, "),\n")
40
- end
41
-
42
- def fix_lines(exp)
43
- if exp.sexp_type == :lit && exp.line == exp[1]
44
- return s(:lit, :__LINE__).line(exp.line)
45
- end
46
-
47
- exp.sexp_body = exp.sexp_body.map do |sub_exp|
48
- if sub_exp.is_a? Sexp
49
- fix_lines sub_exp
50
- else
51
- sub_exp
52
- end
53
- end
54
-
55
- exp
56
- end
57
-
58
- def to_comments(exp)
59
- comments = exp.comments.to_s.gsub(/\n\s*\n/, "\n")
60
-
61
- exp.sexp_body = exp.sexp_body.map do |sub_exp|
62
- if sub_exp.is_a? Sexp
63
- to_comments sub_exp
64
- else
65
- sub_exp
66
- end
67
- end
68
-
69
- if comments.empty?
70
- exp
71
- else
72
- s(:comment, comments, exp)
73
- end
74
- end
75
-
76
- def assert_parsed_as(sexp, code, with_line_numbers: false)
77
- parser = RipperRubyParser::Parser.new
78
- result = parser.parse code
79
- if sexp.nil?
80
- assert_nil result
81
- else
82
- assert_equal sexp, result
83
- assert_equal(formatted(sexp, with_line_numbers: with_line_numbers),
84
- formatted(result, with_line_numbers: with_line_numbers))
85
- end
86
- end
87
-
88
- def assert_parsed_as_before(code, with_line_numbers: false)
89
- oldparser = RubyParser.for_current_ruby
90
- newparser = RipperRubyParser::Parser.new
91
- newparser.extra_compatible = true
92
- expected = oldparser.parse code.dup
93
- result = newparser.parse code
94
- expected = to_comments fix_lines expected
95
- result = to_comments fix_lines result
96
- assert_equal expected, result
97
- assert_equal(formatted(expected, with_line_numbers: with_line_numbers),
98
- formatted(result, with_line_numbers: with_line_numbers))
99
- end
100
- end
101
-
102
- Expectation.class_eval do
103
- def must_be_parsed_as(sexp, with_line_numbers: false)
104
- ctx.assert_parsed_as(sexp, target, with_line_numbers: with_line_numbers)
105
- end
106
-
107
- def must_be_parsed_as_before(with_line_numbers: false)
108
- ctx.assert_parsed_as_before(target, with_line_numbers: with_line_numbers)
109
- end
110
- end
111
- end