ripper_ruby_parser 1.7.2 → 1.10.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 +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
|