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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +50 -0
- data/README.md +4 -4
- data/lib/ripper_ruby_parser/commenting_ripper_parser.rb +24 -12
- data/lib/ripper_ruby_parser/sexp_handlers/assignment.rb +2 -2
- data/lib/ripper_ruby_parser/sexp_handlers/blocks.rb +47 -53
- 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/literals.rb +1 -1
- data/lib/ripper_ruby_parser/sexp_handlers/method_calls.rb +9 -5
- data/lib/ripper_ruby_parser/sexp_handlers/methods.rb +17 -15
- data/lib/ripper_ruby_parser/sexp_handlers/operators.rb +3 -3
- data/lib/ripper_ruby_parser/sexp_handlers/string_literals.rb +24 -28
- data/lib/ripper_ruby_parser/sexp_processor.rb +5 -18
- data/lib/ripper_ruby_parser/unescape.rb +63 -22
- data/lib/ripper_ruby_parser/version.rb +1 -1
- metadata +140 -79
- 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: a110a987032924880be79cfbb79948e14f90868e8105055a0833284a6f939731
|
4
|
+
data.tar.gz: f38c7fa39cb0f1f6fc78cbe72956c77fe15fe74fe99507a3bd59d057618aed0a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7bf9631eb8941e2ed07ec265519ce8860f9d417cb224b2bbd1bbb8b32277374d76936be126c7893f73bcbcaa1414a25d4ca2280c9e0e701462cdbf5d34c3c77f
|
7
|
+
data.tar.gz: e517b02e7854fc644763932d8935dd5b145e2c7c4546874b419932a1d0f0d53b523cba356949f5b941e1fe6405c5b308cade8c42ba3d02078a8e7abe5df176a6
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,36 @@
|
|
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.10.0 / 2022-03-13
|
10
|
+
|
11
|
+
* Handle shadow arguments ([#161])
|
12
|
+
* Drop support for Ruby 2.5 ([#165])
|
13
|
+
* Support running on Ruby 3.1([#180])
|
14
|
+
|
15
|
+
## 1.9.0 / 2021-08-10
|
16
|
+
|
17
|
+
* Fix escape sequence handling in non-interpolating strings and word lists
|
18
|
+
([#152])
|
19
|
+
* Handle strings with mixed valid and invalid utf8 ([#153])
|
20
|
+
* Handle argument forwarding, updating the RubyParser compatibility target to
|
21
|
+
3.17.0 ([#154])
|
22
|
+
* Fix encoding for non-interpolating strings as well ([#155])
|
23
|
+
|
24
|
+
## 1.8.0 / 2021-05-18
|
25
|
+
|
26
|
+
### Changes
|
27
|
+
|
28
|
+
* Drop support for Ruby 2.4 ([2cf6b4050] and [#145])
|
29
|
+
* Update RubyParser compatibility target to 3.15.0 ([#105])
|
30
|
+
* Fix handling of dedented heredoc ([#106])
|
31
|
+
* Add support for running on Ruby 3.0 ([#123])
|
32
|
+
* Various code improvements and other internal changes
|
33
|
+
|
3
34
|
## 1.7.2 / 2020-02-28
|
4
35
|
|
5
36
|
### Bug fixes
|
@@ -201,6 +232,17 @@
|
|
201
232
|
* Initial release
|
202
233
|
|
203
234
|
<!-- Pull request links -->
|
235
|
+
[#180]: https://github.com/mvz/ripper_ruby_parser/pull/180
|
236
|
+
[#165]: https://github.com/mvz/ripper_ruby_parser/pull/165
|
237
|
+
[#161]: https://github.com/mvz/ripper_ruby_parser/pull/161
|
238
|
+
[#155]: https://github.com/mvz/ripper_ruby_parser/pull/155
|
239
|
+
[#154]: https://github.com/mvz/ripper_ruby_parser/pull/154
|
240
|
+
[#153]: https://github.com/mvz/ripper_ruby_parser/pull/153
|
241
|
+
[#152]: https://github.com/mvz/ripper_ruby_parser/pull/152
|
242
|
+
[#145]: https://github.com/mvz/ripper_ruby_parser/pull/145
|
243
|
+
[#123]: https://github.com/mvz/ripper_ruby_parser/pull/123
|
244
|
+
[#106]: https://github.com/mvz/ripper_ruby_parser/pull/106
|
245
|
+
[#105]: https://github.com/mvz/ripper_ruby_parser/pull/105
|
204
246
|
[#101]: https://github.com/mvz/ripper_ruby_parser/pull/101
|
205
247
|
[#100]: https://github.com/mvz/ripper_ruby_parser/pull/100
|
206
248
|
[#99]: https://github.com/mvz/ripper_ruby_parser/pull/99
|
@@ -231,3 +273,11 @@
|
|
231
273
|
[#67]: https://github.com/mvz/ripper_ruby_parser/pull/67
|
232
274
|
[#66]: https://github.com/mvz/ripper_ruby_parser/pull/66
|
233
275
|
[#65]: https://github.com/mvz/ripper_ruby_parser/pull/65
|
276
|
+
|
277
|
+
<!-- Git sha links -->
|
278
|
+
[2cf6b4050]: https://github.com/mvz/ripper_ruby_parser/commit/2cf6b40501576003b916196e23222276b51aa53c
|
279
|
+
|
280
|
+
<!-- Other links -->
|
281
|
+
|
282
|
+
[1]: https://semver.org/spec/v2.0.0.html
|
283
|
+
[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.6 or higher
|
14
|
+
* Compatible with RubyParser 3.18.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-2022 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 = ""
|
@@ -14,16 +14,20 @@ module RipperRubyParser
|
|
14
14
|
make_iter call, args, safe_unwrap_void_stmt(stmt)
|
15
15
|
end
|
16
16
|
|
17
|
+
# NOTE: Argument forwarding is handled differently in Ruby 3.0 and 3.1
|
18
|
+
# 3.0: s(:params, nil, nil, s(:args_forward), nil, nil, nil, nil)
|
19
|
+
# 3.1: s(:params, nil, nil, nil, nil, nil, s(:args_forward), :&)
|
17
20
|
def process_params(exp)
|
18
21
|
_, normal, defaults, splat, rest, kwargs, doublesplat, block = exp.shift 8
|
19
22
|
|
20
|
-
args =
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
23
|
+
args =
|
24
|
+
handle_normal_arguments(normal) +
|
25
|
+
handle_default_arguments(defaults) +
|
26
|
+
handle_splat(splat) +
|
27
|
+
handle_normal_arguments(rest) +
|
28
|
+
handle_kwargs(kwargs) +
|
29
|
+
handle_double_splat(doublesplat) +
|
30
|
+
handle_block_argument(block)
|
27
31
|
|
28
32
|
s(:args, *args)
|
29
33
|
end
|
@@ -39,17 +43,22 @@ module RipperRubyParser
|
|
39
43
|
end
|
40
44
|
|
41
45
|
def process_block_var(exp)
|
42
|
-
_, args, = exp.shift 3
|
46
|
+
_, args, shadowargs = exp.shift 3
|
43
47
|
|
44
48
|
names = process(args)
|
45
49
|
|
50
|
+
if shadowargs
|
51
|
+
shadowargs = map_process_list(shadowargs).map { |item| item[1] }
|
52
|
+
names << s(:shadow, *shadowargs)
|
53
|
+
end
|
54
|
+
|
46
55
|
convert_arguments names
|
47
56
|
end
|
48
57
|
|
49
58
|
def process_begin(exp)
|
50
59
|
_, body, pos = exp.shift 3
|
51
60
|
|
52
|
-
body =
|
61
|
+
body = convert_void_stmt_to_nil_symbol process(body)
|
53
62
|
with_position pos, s(:begin, body)
|
54
63
|
end
|
55
64
|
|
@@ -58,19 +67,7 @@ module RipperRubyParser
|
|
58
67
|
rescue_block = map_process_list_compact block.sexp_body
|
59
68
|
rescue_block << nil if rescue_block.empty?
|
60
69
|
|
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
|
70
|
+
capture = handle_rescue_class_list eclass
|
74
71
|
|
75
72
|
capture << create_assignment_sub_type(process(evar), s(:gvar, :$!)) if evar
|
76
73
|
|
@@ -80,23 +77,22 @@ module RipperRubyParser
|
|
80
77
|
def process_bodystmt(exp)
|
81
78
|
_, main, rescue_block, else_block, ensure_block = exp.shift 5
|
82
79
|
|
83
|
-
|
80
|
+
body_list = []
|
84
81
|
|
85
|
-
|
86
|
-
line =
|
87
|
-
|
88
|
-
body << main if main
|
82
|
+
main_block = process(main)
|
83
|
+
line = main_block.line
|
84
|
+
body_list << main_block if main_block.sexp_type != :void_stmt
|
89
85
|
|
90
|
-
|
91
|
-
|
92
|
-
|
86
|
+
body_list.push(*process(rescue_block)) if rescue_block
|
87
|
+
body_list << process(else_block) if else_block
|
88
|
+
body_list = [s(:rescue, *body_list)] if rescue_block
|
93
89
|
|
94
90
|
if ensure_block
|
95
|
-
|
96
|
-
|
91
|
+
body_list << process(ensure_block)
|
92
|
+
body_list = [s(:ensure, *body_list)]
|
97
93
|
end
|
98
94
|
|
99
|
-
wrap_in_block(
|
95
|
+
wrap_in_block(body_list, line)
|
100
96
|
end
|
101
97
|
|
102
98
|
def process_rescue_mod(exp)
|
@@ -189,26 +185,35 @@ module RipperRubyParser
|
|
189
185
|
def handle_double_splat(doublesplat)
|
190
186
|
return [] unless doublesplat
|
191
187
|
|
192
|
-
|
193
|
-
|
194
|
-
|
188
|
+
contents = process(doublesplat)
|
189
|
+
case contents.sexp_type
|
190
|
+
when :forward_args # Argument forwarding in Ruby 3.1
|
191
|
+
[contents]
|
195
192
|
else
|
196
|
-
[s(:dsplat,
|
193
|
+
[s(:dsplat, contents)]
|
197
194
|
end
|
198
195
|
end
|
199
196
|
|
200
197
|
def handle_block_argument(block)
|
201
198
|
return [] unless block
|
199
|
+
return [] if block == :& # Part of argument forwarding in Ruby 3.1; ignore
|
202
200
|
|
203
201
|
[process(block)]
|
204
202
|
end
|
205
203
|
|
206
|
-
def
|
207
|
-
|
208
|
-
|
209
|
-
|
204
|
+
def handle_rescue_class_list(eclass)
|
205
|
+
if eclass.nil?
|
206
|
+
s(:array)
|
207
|
+
elsif eclass.first.is_a? Symbol
|
208
|
+
eclass = process(eclass)
|
209
|
+
body = eclass.sexp_body
|
210
|
+
if eclass.sexp_type == :mrhs
|
211
|
+
body.first
|
212
|
+
else
|
213
|
+
s(:array, *body)
|
214
|
+
end
|
210
215
|
else
|
211
|
-
|
216
|
+
s(:array, process(eclass.first))
|
212
217
|
end
|
213
218
|
end
|
214
219
|
|
@@ -221,17 +226,6 @@ module RipperRubyParser
|
|
221
226
|
s(:iter, call, args, stmt)
|
222
227
|
end
|
223
228
|
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
229
|
end
|
236
230
|
end
|
237
231
|
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
|
|
@@ -17,7 +17,7 @@ module RipperRubyParser
|
|
17
17
|
|
18
18
|
def process_arg_paren(exp)
|
19
19
|
_, args = exp.shift 2
|
20
|
-
return s() if args.nil?
|
20
|
+
return s(:arglist) if args.nil?
|
21
21
|
|
22
22
|
process(args)
|
23
23
|
end
|
@@ -26,7 +26,11 @@ module RipperRubyParser
|
|
26
26
|
_, call, parens = exp.shift 3
|
27
27
|
call = process(call)
|
28
28
|
parens = process(parens)
|
29
|
-
|
29
|
+
if parens.sexp_type == :forward_args
|
30
|
+
call.push(parens)
|
31
|
+
else
|
32
|
+
call.push(*parens.sexp_body)
|
33
|
+
end
|
30
34
|
end
|
31
35
|
|
32
36
|
# Handle implied hashes, such as at the end of argument lists.
|
@@ -36,9 +40,9 @@ module RipperRubyParser
|
|
36
40
|
end
|
37
41
|
|
38
42
|
CALL_OP_MAP = {
|
39
|
-
|
40
|
-
|
41
|
-
|
43
|
+
".": :call,
|
44
|
+
"::": :call,
|
45
|
+
"&.": :safe_call
|
42
46
|
}.freeze
|
43
47
|
|
44
48
|
def process_call(exp)
|
@@ -72,6 +72,11 @@ module RipperRubyParser
|
|
72
72
|
s(:alias, process(left), process(right))
|
73
73
|
end
|
74
74
|
|
75
|
+
def process_args_forward(exp)
|
76
|
+
_ = exp.shift
|
77
|
+
s(:forward_args)
|
78
|
+
end
|
79
|
+
|
75
80
|
private
|
76
81
|
|
77
82
|
def in_method
|
@@ -83,8 +88,8 @@ module RipperRubyParser
|
|
83
88
|
|
84
89
|
def method_body(exp)
|
85
90
|
block = process exp
|
86
|
-
case block.
|
87
|
-
when
|
91
|
+
case block.sexp_type
|
92
|
+
when :void_stmt
|
88
93
|
[s(:nil).line(block.line)]
|
89
94
|
else
|
90
95
|
unwrap_block block
|
@@ -99,23 +104,20 @@ module RipperRubyParser
|
|
99
104
|
|
100
105
|
def convert_arguments(args)
|
101
106
|
args.line ||= args.sexp_body.first&.line
|
102
|
-
args.map
|
107
|
+
args.sexp_body = args.sexp_body.map { |item| convert_argument item }
|
108
|
+
args
|
103
109
|
end
|
104
110
|
|
105
111
|
def convert_argument(item)
|
106
|
-
|
107
|
-
|
112
|
+
case item.sexp_type
|
113
|
+
when :lvar
|
114
|
+
item.last
|
115
|
+
when *SPECIAL_ARG_MARKER.keys
|
116
|
+
convert_marked_argument(item)
|
117
|
+
when :masgn
|
118
|
+
convert_masgn_argument(item)
|
108
119
|
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
|
120
|
+
item
|
119
121
|
end
|
120
122
|
end
|
121
123
|
|
@@ -5,8 +5,8 @@ module RipperRubyParser
|
|
5
5
|
# Sexp handlers for operators
|
6
6
|
module Operators
|
7
7
|
BINARY_OPERATOR_MAP = {
|
8
|
-
|
9
|
-
|
8
|
+
"&&": :and,
|
9
|
+
"||": :or,
|
10
10
|
and: :and,
|
11
11
|
or: :or
|
12
12
|
}.freeze
|
@@ -16,7 +16,7 @@ module RipperRubyParser
|
|
16
16
|
}.freeze
|
17
17
|
|
18
18
|
NEGATED_BINARY_OPERATOR_MAP = {
|
19
|
-
|
19
|
+
"!~": :=~
|
20
20
|
}.freeze
|
21
21
|
|
22
22
|
SHIFT_OPERATORS = [:<<, :>>].freeze
|
@@ -123,8 +123,7 @@ module RipperRubyParser
|
|
123
123
|
|
124
124
|
def process_at_tstring_content(exp)
|
125
125
|
_, content, pos, delim = exp.shift 4
|
126
|
-
string = handle_string_unescaping(content, delim)
|
127
|
-
string = handle_string_encoding(string, delim)
|
126
|
+
string = fix_encoding handle_string_unescaping(content, delim)
|
128
127
|
with_position(pos, s(:str, string))
|
129
128
|
end
|
130
129
|
|
@@ -135,8 +134,25 @@ module RipperRubyParser
|
|
135
134
|
|
136
135
|
list = merge_raw_string_literals list
|
137
136
|
list = map_process_list list
|
137
|
+
parts = unpack_dstr list
|
138
|
+
merge_initial_string_literals(parts)
|
139
|
+
end
|
138
140
|
|
139
|
-
|
141
|
+
def merge_raw_string_literals(list)
|
142
|
+
chunks = list.chunk { |it| it.sexp_type == :@tstring_content }
|
143
|
+
chunks.flat_map do |is_simple, items|
|
144
|
+
if is_simple && items.count > 1
|
145
|
+
head = items.first
|
146
|
+
contents = items.map { |it| it[1] }.join
|
147
|
+
[s(:@tstring_content, contents, head[2], head[3])]
|
148
|
+
else
|
149
|
+
items
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
def unpack_dstr(list)
|
155
|
+
list.flat_map do |item|
|
140
156
|
type, val, *rest = item
|
141
157
|
if type == :dstr
|
142
158
|
if val.empty?
|
@@ -148,7 +164,9 @@ module RipperRubyParser
|
|
148
164
|
[item]
|
149
165
|
end
|
150
166
|
end
|
167
|
+
end
|
151
168
|
|
169
|
+
def merge_initial_string_literals(parts)
|
152
170
|
string = ""
|
153
171
|
while parts.first&.sexp_type == :str
|
154
172
|
str = parts.shift
|
@@ -159,19 +177,6 @@ module RipperRubyParser
|
|
159
177
|
return line, string, parts
|
160
178
|
end
|
161
179
|
|
162
|
-
def merge_raw_string_literals(list)
|
163
|
-
chunks = list.chunk { |it| it.sexp_type == :@tstring_content }
|
164
|
-
chunks.flat_map do |is_simple, items|
|
165
|
-
if is_simple && items.count > 1
|
166
|
-
head = items.first
|
167
|
-
contents = items.map { |it| it[1] }.join
|
168
|
-
[s(:@tstring_content, contents, head[2], head[3])]
|
169
|
-
else
|
170
|
-
items
|
171
|
-
end
|
172
|
-
end
|
173
|
-
end
|
174
|
-
|
175
180
|
def character_flags_to_numerical(flags)
|
176
181
|
numflags = 0
|
177
182
|
|
@@ -196,7 +201,7 @@ module RipperRubyParser
|
|
196
201
|
end
|
197
202
|
|
198
203
|
def handle_symbol_content(node)
|
199
|
-
if node.sexp_type ==
|
204
|
+
if node.sexp_type == :@kw
|
200
205
|
symbol, position = extract_node_symbol_with_position(node)
|
201
206
|
with_position(position, s(:lit, symbol))
|
202
207
|
else
|
@@ -237,24 +242,15 @@ module RipperRubyParser
|
|
237
242
|
when INTERPOLATING_WORD_LIST
|
238
243
|
unescape_wordlist_word(content)
|
239
244
|
when *NON_INTERPOLATING_STRINGS
|
240
|
-
simple_unescape(content)
|
245
|
+
simple_unescape(content, delim)
|
241
246
|
when *REGEXP_LITERALS
|
242
247
|
unescape_regexp(content)
|
243
248
|
when NON_INTERPOLATING_WORD_LIST
|
244
|
-
simple_unescape_wordlist_word(content)
|
249
|
+
simple_unescape_wordlist_word(content, delim)
|
245
250
|
else
|
246
251
|
content
|
247
252
|
end
|
248
253
|
end
|
249
|
-
|
250
|
-
def handle_string_encoding(string, delim)
|
251
|
-
case delim
|
252
|
-
when INTERPOLATING_HEREDOC, INTERPOLATING_WORD_LIST, *INTERPOLATING_STRINGS
|
253
|
-
fix_encoding string
|
254
|
-
else
|
255
|
-
string
|
256
|
-
end
|
257
|
-
end
|
258
254
|
end
|
259
255
|
end
|
260
256
|
end
|