ripper_ruby_parser 1.7.2 → 1.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +28 -0
- data/README.md +4 -4
- data/lib/ripper_ruby_parser/commenting_ripper_parser.rb +24 -12
- data/lib/ripper_ruby_parser/sexp_handlers/blocks.rb +33 -54
- data/lib/ripper_ruby_parser/sexp_handlers/conditionals.rb +17 -19
- data/lib/ripper_ruby_parser/sexp_handlers/helper_methods.rb +34 -1
- data/lib/ripper_ruby_parser/sexp_handlers/method_calls.rb +1 -1
- data/lib/ripper_ruby_parser/sexp_handlers/methods.rb +12 -15
- data/lib/ripper_ruby_parser/sexp_handlers/string_literals.rb +21 -15
- data/lib/ripper_ruby_parser/sexp_processor.rb +4 -17
- data/lib/ripper_ruby_parser/unescape.rb +36 -12
- data/lib/ripper_ruby_parser/version.rb +1 -1
- metadata +110 -78
- data/Rakefile +0 -33
- data/test/end_to_end/comments_test.rb +0 -59
- data/test/end_to_end/comparison_test.rb +0 -104
- data/test/end_to_end/lib_comparison_test.rb +0 -18
- data/test/end_to_end/line_numbering_test.rb +0 -31
- data/test/end_to_end/samples_comparison_test.rb +0 -13
- data/test/end_to_end/test_comparison_test.rb +0 -18
- data/test/pt_testcase/pt_test.rb +0 -44
- data/test/ripper_ruby_parser/commenting_ripper_parser_test.rb +0 -200
- data/test/ripper_ruby_parser/parser_test.rb +0 -576
- data/test/ripper_ruby_parser/sexp_handlers/assignment_test.rb +0 -597
- data/test/ripper_ruby_parser/sexp_handlers/blocks_test.rb +0 -717
- data/test/ripper_ruby_parser/sexp_handlers/conditionals_test.rb +0 -536
- data/test/ripper_ruby_parser/sexp_handlers/literals_test.rb +0 -165
- data/test/ripper_ruby_parser/sexp_handlers/loops_test.rb +0 -209
- data/test/ripper_ruby_parser/sexp_handlers/method_calls_test.rb +0 -237
- data/test/ripper_ruby_parser/sexp_handlers/methods_test.rb +0 -429
- data/test/ripper_ruby_parser/sexp_handlers/operators_test.rb +0 -405
- data/test/ripper_ruby_parser/sexp_handlers/string_literals_test.rb +0 -973
- data/test/ripper_ruby_parser/sexp_processor_test.rb +0 -327
- data/test/ripper_ruby_parser/version_test.rb +0 -7
- data/test/samples/assignment.rb +0 -22
- data/test/samples/comments.rb +0 -13
- data/test/samples/conditionals.rb +0 -23
- data/test/samples/lambdas.rb +0 -5
- data/test/samples/loops.rb +0 -36
- data/test/samples/misc.rb +0 -285
- data/test/samples/number.rb +0 -9
- data/test/samples/operators.rb +0 -18
- data/test/samples/strings.rb +0 -147
- data/test/test_helper.rb +0 -111
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 799011b06831426c0ebecad641082d58bfaa8da0aea9359a3a2d152ea01bd196
|
4
|
+
data.tar.gz: eec3804031490d2382f59ddc450af14f73b696b9e14f0d2919b64a3df3557853
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eab6dc676f7c5806bcd09f9adf87e5b67dd5320e043c07370014fdfc8e5ca1dffbaa9583754ac74bc354a30c6b27392c3310a7172b20699d475d9122e9dae748
|
7
|
+
data.tar.gz: b776c9d833e7808c7b2ac17ec6bb5a358a93cb1bb925ee94199aeddf85c0cca2e102cdcdfff17ca8d17ac406e0f76c4b981b640085fbd02d2868bca36fdd840d
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,21 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
Notable changes to this project will be documented in this file.
|
4
|
+
|
5
|
+
This project adheres to [Semantic Versioning 2.0.0][1].
|
6
|
+
|
7
|
+
This document is formatted based on [Keep A CHANGELOG][2].
|
8
|
+
|
9
|
+
## 1.8.0 / 2021-05-18
|
10
|
+
|
11
|
+
### Changes
|
12
|
+
|
13
|
+
* Drop support for Ruby 2.4 ([2cf6b4050] and [#145])
|
14
|
+
* Update RubyParser compatibility target to 3.15.0 ([#105])
|
15
|
+
* Fix handling of dedented heredoc ([#106])
|
16
|
+
* Add support for running on Ruby 3.0 ([#123])
|
17
|
+
* Various code improvements and other internal changes
|
18
|
+
|
3
19
|
## 1.7.2 / 2020-02-28
|
4
20
|
|
5
21
|
### Bug fixes
|
@@ -201,6 +217,10 @@
|
|
201
217
|
* Initial release
|
202
218
|
|
203
219
|
<!-- Pull request links -->
|
220
|
+
[#145]: https://github.com/mvz/ripper_ruby_parser/pull/145
|
221
|
+
[#123]: https://github.com/mvz/ripper_ruby_parser/pull/123
|
222
|
+
[#106]: https://github.com/mvz/ripper_ruby_parser/pull/106
|
223
|
+
[#105]: https://github.com/mvz/ripper_ruby_parser/pull/105
|
204
224
|
[#101]: https://github.com/mvz/ripper_ruby_parser/pull/101
|
205
225
|
[#100]: https://github.com/mvz/ripper_ruby_parser/pull/100
|
206
226
|
[#99]: https://github.com/mvz/ripper_ruby_parser/pull/99
|
@@ -231,3 +251,11 @@
|
|
231
251
|
[#67]: https://github.com/mvz/ripper_ruby_parser/pull/67
|
232
252
|
[#66]: https://github.com/mvz/ripper_ruby_parser/pull/66
|
233
253
|
[#65]: https://github.com/mvz/ripper_ruby_parser/pull/65
|
254
|
+
|
255
|
+
<!-- Git sha links -->
|
256
|
+
[2cf6b4050]: https://github.com/mvz/ripper_ruby_parser/commit/2cf6b40501576003b916196e23222276b51aa53c
|
257
|
+
|
258
|
+
<!-- Other links -->
|
259
|
+
|
260
|
+
[1]: https://semver.org/spec/v2.0.0.html
|
261
|
+
[2]: https://keepachangelog.com/en/1.0.0/
|
data/README.md
CHANGED
@@ -10,8 +10,8 @@ Parse with Ripper, produce sexps that are compatible with RubyParser.
|
|
10
10
|
|
11
11
|
* Drop-in replacement for RubyParser
|
12
12
|
* Should handle 1.9 and later syntax gracefully
|
13
|
-
* Requires Ruby 2.
|
14
|
-
* Compatible with RubyParser 3.
|
13
|
+
* Requires Ruby 2.5 or higher
|
14
|
+
* Compatible with RubyParser 3.15.0
|
15
15
|
|
16
16
|
## Known incompatibilities
|
17
17
|
|
@@ -44,7 +44,7 @@ parser.parse "foo[bar] += baz qux"
|
|
44
44
|
|
45
45
|
## Requirements
|
46
46
|
|
47
|
-
* Ruby 2.
|
47
|
+
* Ruby 2.5 or higher
|
48
48
|
* `sexp_processor`
|
49
49
|
|
50
50
|
## Hacking and contributing
|
@@ -64,7 +64,7 @@ If you want to send pull requests or patches, please:
|
|
64
64
|
|
65
65
|
(The MIT License)
|
66
66
|
|
67
|
-
Copyright (c) 2012, 2014-
|
67
|
+
Copyright (c) 2012, 2014-2020 Matijs van Zuijlen
|
68
68
|
|
69
69
|
Permission is hereby granted, free of charge, to any person obtaining
|
70
70
|
a copy of this software and associated documentation files (the
|
@@ -27,6 +27,8 @@ module RipperRubyParser
|
|
27
27
|
Sexp.from_array(result)
|
28
28
|
end
|
29
29
|
|
30
|
+
private
|
31
|
+
|
30
32
|
def on_backtick(delimiter)
|
31
33
|
@delimiter_stack.push delimiter
|
32
34
|
super
|
@@ -101,6 +103,18 @@ module RipperRubyParser
|
|
101
103
|
@delimiter_stack.push delimiter
|
102
104
|
end
|
103
105
|
|
106
|
+
def on_heredoc_dedent(val, width)
|
107
|
+
next_dedent = true
|
108
|
+
val.map! do |e|
|
109
|
+
if e.is_a?(Array) && e[0] == :@tstring_content
|
110
|
+
e = dedent_element(e, width) if next_dedent
|
111
|
+
next_dedent = e[1].end_with? "\n"
|
112
|
+
end
|
113
|
+
e
|
114
|
+
end
|
115
|
+
val
|
116
|
+
end
|
117
|
+
|
104
118
|
def on_heredoc_end(_delimiter)
|
105
119
|
@delimiter_stack.pop
|
106
120
|
end
|
@@ -293,28 +307,26 @@ module RipperRubyParser
|
|
293
307
|
commentize(:END, super)
|
294
308
|
end
|
295
309
|
|
296
|
-
def on_parse_error(
|
297
|
-
raise SyntaxError,
|
310
|
+
def on_parse_error(message)
|
311
|
+
raise SyntaxError, message
|
298
312
|
end
|
299
313
|
|
300
|
-
def on_class_name_error(*
|
301
|
-
raise SyntaxError,
|
314
|
+
def on_class_name_error(message, *)
|
315
|
+
raise SyntaxError, message
|
302
316
|
end
|
303
317
|
|
304
|
-
def on_alias_error(*
|
305
|
-
raise SyntaxError,
|
318
|
+
def on_alias_error(message, *)
|
319
|
+
raise SyntaxError, message
|
306
320
|
end
|
307
321
|
|
308
|
-
def on_assign_error(*
|
309
|
-
raise SyntaxError,
|
322
|
+
def on_assign_error(message, *)
|
323
|
+
raise SyntaxError, message
|
310
324
|
end
|
311
325
|
|
312
|
-
def on_param_error(*
|
313
|
-
raise SyntaxError,
|
326
|
+
def on_param_error(message, *)
|
327
|
+
raise SyntaxError, message
|
314
328
|
end
|
315
329
|
|
316
|
-
private
|
317
|
-
|
318
330
|
def commentize(_name, exp)
|
319
331
|
(_, _kw, loc), comment = @comment_stack.pop
|
320
332
|
@comment = ""
|
@@ -17,13 +17,14 @@ module RipperRubyParser
|
|
17
17
|
def process_params(exp)
|
18
18
|
_, normal, defaults, splat, rest, kwargs, doublesplat, block = exp.shift 8
|
19
19
|
|
20
|
-
args =
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
20
|
+
args =
|
21
|
+
handle_normal_arguments(normal) +
|
22
|
+
handle_default_arguments(defaults) +
|
23
|
+
handle_splat(splat) +
|
24
|
+
handle_normal_arguments(rest) +
|
25
|
+
handle_kwargs(kwargs) +
|
26
|
+
handle_double_splat(doublesplat) +
|
27
|
+
handle_block_argument(block)
|
27
28
|
|
28
29
|
s(:args, *args)
|
29
30
|
end
|
@@ -49,7 +50,7 @@ module RipperRubyParser
|
|
49
50
|
def process_begin(exp)
|
50
51
|
_, body, pos = exp.shift 3
|
51
52
|
|
52
|
-
body =
|
53
|
+
body = convert_void_stmt_to_nil_symbol process(body)
|
53
54
|
with_position pos, s(:begin, body)
|
54
55
|
end
|
55
56
|
|
@@ -58,19 +59,7 @@ module RipperRubyParser
|
|
58
59
|
rescue_block = map_process_list_compact block.sexp_body
|
59
60
|
rescue_block << nil if rescue_block.empty?
|
60
61
|
|
61
|
-
capture =
|
62
|
-
s(:array)
|
63
|
-
elsif eclass.first.is_a? Symbol
|
64
|
-
eclass = process(eclass)
|
65
|
-
body = eclass.sexp_body
|
66
|
-
if eclass.sexp_type == :mrhs
|
67
|
-
body.first
|
68
|
-
else
|
69
|
-
s(:array, *body)
|
70
|
-
end
|
71
|
-
else
|
72
|
-
s(:array, process(eclass.first))
|
73
|
-
end
|
62
|
+
capture = handle_rescue_class_list eclass
|
74
63
|
|
75
64
|
capture << create_assignment_sub_type(process(evar), s(:gvar, :$!)) if evar
|
76
65
|
|
@@ -80,23 +69,22 @@ module RipperRubyParser
|
|
80
69
|
def process_bodystmt(exp)
|
81
70
|
_, main, rescue_block, else_block, ensure_block = exp.shift 5
|
82
71
|
|
83
|
-
|
72
|
+
body_list = []
|
84
73
|
|
85
|
-
|
86
|
-
line =
|
87
|
-
|
88
|
-
body << main if main
|
74
|
+
main_block = process(main)
|
75
|
+
line = main_block.line
|
76
|
+
body_list << main_block if main_block.sexp_type != :void_stmt
|
89
77
|
|
90
|
-
|
91
|
-
|
92
|
-
|
78
|
+
body_list.push(*process(rescue_block)) if rescue_block
|
79
|
+
body_list << process(else_block) if else_block
|
80
|
+
body_list = [s(:rescue, *body_list)] if rescue_block
|
93
81
|
|
94
82
|
if ensure_block
|
95
|
-
|
96
|
-
|
83
|
+
body_list << process(ensure_block)
|
84
|
+
body_list = [s(:ensure, *body_list)]
|
97
85
|
end
|
98
86
|
|
99
|
-
wrap_in_block(
|
87
|
+
wrap_in_block(body_list, line)
|
100
88
|
end
|
101
89
|
|
102
90
|
def process_rescue_mod(exp)
|
@@ -189,12 +177,7 @@ module RipperRubyParser
|
|
189
177
|
def handle_double_splat(doublesplat)
|
190
178
|
return [] unless doublesplat
|
191
179
|
|
192
|
-
|
193
|
-
if RUBY_VERSION < "2.5.0" && doublesplat.is_a?(Integer)
|
194
|
-
[s(:dsplat, s(:lvar, :""))]
|
195
|
-
else
|
196
|
-
[s(:dsplat, process(doublesplat))]
|
197
|
-
end
|
180
|
+
[s(:dsplat, process(doublesplat))]
|
198
181
|
end
|
199
182
|
|
200
183
|
def handle_block_argument(block)
|
@@ -203,12 +186,19 @@ module RipperRubyParser
|
|
203
186
|
[process(block)]
|
204
187
|
end
|
205
188
|
|
206
|
-
def
|
207
|
-
|
208
|
-
|
209
|
-
|
189
|
+
def handle_rescue_class_list(eclass)
|
190
|
+
if eclass.nil?
|
191
|
+
s(:array)
|
192
|
+
elsif eclass.first.is_a? Symbol
|
193
|
+
eclass = process(eclass)
|
194
|
+
body = eclass.sexp_body
|
195
|
+
if eclass.sexp_type == :mrhs
|
196
|
+
body.first
|
197
|
+
else
|
198
|
+
s(:array, *body)
|
199
|
+
end
|
210
200
|
else
|
211
|
-
|
201
|
+
s(:array, process(eclass.first))
|
212
202
|
end
|
213
203
|
end
|
214
204
|
|
@@ -221,17 +211,6 @@ module RipperRubyParser
|
|
221
211
|
s(:iter, call, args, stmt)
|
222
212
|
end
|
223
213
|
end
|
224
|
-
|
225
|
-
def wrap_in_block(statements)
|
226
|
-
case statements.length
|
227
|
-
when 0
|
228
|
-
nil
|
229
|
-
when 1
|
230
|
-
statements.first
|
231
|
-
else
|
232
|
-
s(:block, *statements)
|
233
|
-
end
|
234
|
-
end
|
235
214
|
end
|
236
215
|
end
|
237
216
|
end
|
@@ -47,33 +47,20 @@ module RipperRubyParser
|
|
47
47
|
|
48
48
|
def process_case(exp)
|
49
49
|
_, expr, clauses = exp.shift 3
|
50
|
-
s(:case, process(expr), *process(clauses))
|
50
|
+
s(:case, process(expr), *process(clauses).sexp_body)
|
51
51
|
end
|
52
52
|
|
53
53
|
def process_when(exp)
|
54
54
|
_, values, truepart, falsepart = exp.shift 4
|
55
55
|
|
56
|
-
falsepart
|
57
|
-
falsepart = unwrap_nil falsepart if falsepart
|
58
|
-
|
59
|
-
if falsepart.nil?
|
60
|
-
falsepart = [nil]
|
61
|
-
elsif falsepart.first.is_a? Symbol
|
62
|
-
falsepart = s(falsepart)
|
63
|
-
end
|
56
|
+
falsepart ||= s(:void_stmt)
|
64
57
|
|
58
|
+
falsepart = unwrap_case_body process(falsepart)
|
65
59
|
values = process(values).sexp_body
|
60
|
+
truepart = unwrap_block process(truepart)
|
66
61
|
|
67
|
-
|
68
|
-
|
69
|
-
[nil]
|
70
|
-
else
|
71
|
-
unwrap_block(truepart.shift) + truepart
|
72
|
-
end
|
73
|
-
|
74
|
-
s(s(:when,
|
75
|
-
s(:array, *values),
|
76
|
-
*truepart),
|
62
|
+
s(:case_body,
|
63
|
+
s(:when, s(:array, *values), *truepart),
|
77
64
|
*falsepart)
|
78
65
|
end
|
79
66
|
|
@@ -109,6 +96,17 @@ module RipperRubyParser
|
|
109
96
|
s(:if, cond, truepart, falsepart)
|
110
97
|
end
|
111
98
|
end
|
99
|
+
|
100
|
+
def unwrap_case_body(exp)
|
101
|
+
case exp.sexp_type
|
102
|
+
when :case_body
|
103
|
+
exp.sexp_body
|
104
|
+
when :void_stmt
|
105
|
+
[nil]
|
106
|
+
else
|
107
|
+
[exp]
|
108
|
+
end
|
109
|
+
end
|
112
110
|
end
|
113
111
|
end
|
114
112
|
end
|
@@ -81,13 +81,46 @@ module RipperRubyParser
|
|
81
81
|
end
|
82
82
|
|
83
83
|
def unwrap_block(exp)
|
84
|
-
|
84
|
+
case exp.sexp_type
|
85
|
+
when :block
|
85
86
|
exp.sexp_body
|
87
|
+
when :void_stmt
|
88
|
+
[nil]
|
86
89
|
else
|
87
90
|
[exp]
|
88
91
|
end
|
89
92
|
end
|
90
93
|
|
94
|
+
def wrap_in_block(statements, line)
|
95
|
+
case statements.length
|
96
|
+
when 0
|
97
|
+
s(:void_stmt).line(line)
|
98
|
+
when 1
|
99
|
+
statements.first
|
100
|
+
else
|
101
|
+
first = statements.shift
|
102
|
+
s(:block, *unwrap_block(first), *statements)
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
106
|
+
def convert_void_stmt_to_nil_symbol(block)
|
107
|
+
case block.sexp_type
|
108
|
+
when :void_stmt
|
109
|
+
s(:nil)
|
110
|
+
else
|
111
|
+
block
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
def convert_empty_to_nil_symbol(block)
|
116
|
+
case block.length
|
117
|
+
when 0
|
118
|
+
s(:nil)
|
119
|
+
else
|
120
|
+
block
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
91
124
|
def handle_return_argument_list(arglist)
|
92
125
|
args = process(arglist).sexp_body
|
93
126
|
|
@@ -83,8 +83,8 @@ module RipperRubyParser
|
|
83
83
|
|
84
84
|
def method_body(exp)
|
85
85
|
block = process exp
|
86
|
-
case block.
|
87
|
-
when
|
86
|
+
case block.sexp_type
|
87
|
+
when :void_stmt
|
88
88
|
[s(:nil).line(block.line)]
|
89
89
|
else
|
90
90
|
unwrap_block block
|
@@ -99,23 +99,20 @@ module RipperRubyParser
|
|
99
99
|
|
100
100
|
def convert_arguments(args)
|
101
101
|
args.line ||= args.sexp_body.first&.line
|
102
|
-
args.map
|
102
|
+
args.sexp_body = args.sexp_body.map { |item| convert_argument item }
|
103
|
+
args
|
103
104
|
end
|
104
105
|
|
105
106
|
def convert_argument(item)
|
106
|
-
|
107
|
-
|
107
|
+
case item.sexp_type
|
108
|
+
when :lvar
|
109
|
+
item.last
|
110
|
+
when *SPECIAL_ARG_MARKER.keys
|
111
|
+
convert_marked_argument(item)
|
112
|
+
when :masgn
|
113
|
+
convert_masgn_argument(item)
|
108
114
|
else
|
109
|
-
|
110
|
-
when :lvar
|
111
|
-
item.last
|
112
|
-
when *SPECIAL_ARG_MARKER.keys
|
113
|
-
convert_marked_argument(item)
|
114
|
-
when :masgn
|
115
|
-
convert_masgn_argument(item)
|
116
|
-
else
|
117
|
-
item
|
118
|
-
end
|
115
|
+
item
|
119
116
|
end
|
120
117
|
end
|
121
118
|
|