ripper_ruby_parser 1.6.0 → 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 +86 -0
- data/README.md +8 -25
- data/lib/ripper_ruby_parser.rb +2 -2
- data/lib/ripper_ruby_parser/commenting_ripper_parser.rb +54 -23
- data/lib/ripper_ruby_parser/parser.rb +3 -3
- data/lib/ripper_ruby_parser/sexp_handlers.rb +11 -9
- data/lib/ripper_ruby_parser/sexp_handlers/assignment.rb +10 -11
- data/lib/ripper_ruby_parser/sexp_handlers/blocks.rb +48 -63
- data/lib/ripper_ruby_parser/sexp_handlers/conditionals.rb +17 -19
- data/lib/ripper_ruby_parser/sexp_handlers/helper_methods.rb +35 -2
- data/lib/ripper_ruby_parser/sexp_handlers/literals.rb +15 -242
- data/lib/ripper_ruby_parser/sexp_handlers/loops.rb +4 -2
- data/lib/ripper_ruby_parser/sexp_handlers/method_calls.rb +1 -1
- data/lib/ripper_ruby_parser/sexp_handlers/methods.rb +24 -24
- data/lib/ripper_ruby_parser/sexp_handlers/string_literals.rb +266 -0
- data/lib/ripper_ruby_parser/sexp_processor.rb +47 -78
- data/lib/ripper_ruby_parser/unescape.rb +79 -50
- data/lib/ripper_ruby_parser/version.rb +1 -1
- metadata +115 -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 -29
- data/test/end_to_end/line_numbering_test.rb +0 -64
- data/test/end_to_end/samples_comparison_test.rb +0 -13
- data/test/end_to_end/test_comparison_test.rb +0 -32
- data/test/pt_testcase/pt_test.rb +0 -44
- data/test/ripper_ruby_parser/commenting_ripper_parser_test.rb +0 -190
- data/test/ripper_ruby_parser/parser_test.rb +0 -469
- data/test/ripper_ruby_parser/sexp_handlers/assignment_test.rb +0 -649
- data/test/ripper_ruby_parser/sexp_handlers/blocks_test.rb +0 -661
- data/test/ripper_ruby_parser/sexp_handlers/conditionals_test.rb +0 -536
- data/test/ripper_ruby_parser/sexp_handlers/literals_test.rb +0 -1117
- data/test/ripper_ruby_parser/sexp_handlers/loops_test.rb +0 -209
- data/test/ripper_ruby_parser/sexp_handlers/method_calls_test.rb +0 -267
- data/test/ripper_ruby_parser/sexp_handlers/methods_test.rb +0 -427
- data/test/ripper_ruby_parser/sexp_handlers/operators_test.rb +0 -399
- data/test/ripper_ruby_parser/sexp_processor_test.rb +0 -303
- data/test/ripper_ruby_parser/version_test.rb +0 -7
- data/test/samples/assignment.rb +0 -17
- data/test/samples/comments.rb +0 -13
- data/test/samples/conditionals.rb +0 -23
- data/test/samples/loops.rb +0 -36
- data/test/samples/misc.rb +0 -278
- data/test/samples/number.rb +0 -7
- data/test/samples/operators.rb +0 -18
- data/test/samples/strings.rb +0 -140
- data/test/test_helper.rb +0 -79
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,64 @@
|
|
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
|
+
|
19
|
+
## 1.7.2 / 2020-02-28
|
20
|
+
|
21
|
+
### Bug fixes
|
22
|
+
|
23
|
+
* Support imaginary number literals ([#100])
|
24
|
+
* Handle anonymous kwrest arguments ([#95])
|
25
|
+
|
26
|
+
### Internal changes
|
27
|
+
|
28
|
+
* Update tests ([#101])
|
29
|
+
* Prepare for testing on Ruby 2.7 ([#99])
|
30
|
+
* Various improvements ([#98])
|
31
|
+
* Split long module ([#97])
|
32
|
+
|
33
|
+
## 1.7.1 / 2019-11-03
|
34
|
+
|
35
|
+
* Handle unicode escapes with five or six hex digits ([#94])
|
36
|
+
* Handle safe attribute assignment ([#92])
|
37
|
+
* Handle endless ranges on Ruby 2.6+ ([#90])
|
38
|
+
* Add preliminary support for Ruby 2.7 ([#89])
|
39
|
+
* Improve line number handling for stabby lambdas ([#88])
|
40
|
+
|
41
|
+
## 1.7.0 / 2019-11-01
|
42
|
+
|
43
|
+
* Make results compatible with RubyParser 3.14.0 ([#85])
|
44
|
+
- Remove obsolete extra-compatible behavior
|
45
|
+
- Parse stabby lambda as :lambda-typed sexp
|
46
|
+
- Emit nil argument for block arguments with trailing comma
|
47
|
+
* Require Ruby 2.4 or higher ([#86])
|
48
|
+
|
49
|
+
## 1.6.1 / 2019-04-22
|
50
|
+
|
51
|
+
* Improve line numbering for some block structures ([#82])
|
52
|
+
- Fix line numbering for empty method bodies
|
53
|
+
- Assign correct line numbers to END blocks
|
54
|
+
- Assign correct line numbers to begin blocks
|
55
|
+
- Assign correct line numbers to BEGIN blocks
|
56
|
+
* Fix line numbering for several literals ([#80])
|
57
|
+
- Fix line numbering for plain regexp literals
|
58
|
+
- Fix line numbering for backtick literals
|
59
|
+
- Fix line numbering for simple string literals
|
60
|
+
- Fix line numbering for keyword-like symbols
|
61
|
+
|
3
62
|
## 1.6.0 / 2019-04-12
|
4
63
|
|
5
64
|
* Fix line numbering for range literals ([#79])
|
@@ -158,6 +217,25 @@
|
|
158
217
|
* Initial release
|
159
218
|
|
160
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
|
224
|
+
[#101]: https://github.com/mvz/ripper_ruby_parser/pull/101
|
225
|
+
[#100]: https://github.com/mvz/ripper_ruby_parser/pull/100
|
226
|
+
[#99]: https://github.com/mvz/ripper_ruby_parser/pull/99
|
227
|
+
[#98]: https://github.com/mvz/ripper_ruby_parser/pull/98
|
228
|
+
[#97]: https://github.com/mvz/ripper_ruby_parser/pull/97
|
229
|
+
[#95]: https://github.com/mvz/ripper_ruby_parser/pull/95
|
230
|
+
[#94]: https://github.com/mvz/ripper_ruby_parser/pull/94
|
231
|
+
[#92]: https://github.com/mvz/ripper_ruby_parser/pull/92
|
232
|
+
[#90]: https://github.com/mvz/ripper_ruby_parser/pull/90
|
233
|
+
[#89]: https://github.com/mvz/ripper_ruby_parser/pull/89
|
234
|
+
[#88]: https://github.com/mvz/ripper_ruby_parser/pull/88
|
235
|
+
[#86]: https://github.com/mvz/ripper_ruby_parser/pull/86
|
236
|
+
[#85]: https://github.com/mvz/ripper_ruby_parser/pull/85
|
237
|
+
[#82]: https://github.com/mvz/ripper_ruby_parser/pull/82
|
238
|
+
[#80]: https://github.com/mvz/ripper_ruby_parser/pull/80
|
161
239
|
[#79]: https://github.com/mvz/ripper_ruby_parser/pull/79
|
162
240
|
[#78]: https://github.com/mvz/ripper_ruby_parser/pull/78
|
163
241
|
[#77]: https://github.com/mvz/ripper_ruby_parser/pull/77
|
@@ -173,3 +251,11 @@
|
|
173
251
|
[#67]: https://github.com/mvz/ripper_ruby_parser/pull/67
|
174
252
|
[#66]: https://github.com/mvz/ripper_ruby_parser/pull/66
|
175
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,28 +10,18 @@ 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
|
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
|
|
18
|
-
RipperRubyParser has
|
19
|
-
the behavior can be changed by turning on extra-compatible mode.
|
20
|
-
|
21
|
-
The following incompatibilities cannot be changed:
|
18
|
+
RipperRubyParser has a few incompatibilities with RubyParser.
|
22
19
|
|
23
20
|
* RipperRubyParser won't handle non-UTF-8 files without an encoding comment,
|
24
21
|
just like regular Ruby
|
25
|
-
* RipperRubyParser does not
|
26
|
-
* RipperRubyParser
|
27
|
-
|
28
|
-
The following incompatibilities can be made compatible by turning on
|
29
|
-
extra-compatible mode:
|
30
|
-
|
31
|
-
* Operator assignment of a method call without parentheses to a collection
|
32
|
-
element uses and `:array` S-expression instead of `:arglist`
|
33
|
-
* RipperRubyParser keeps carriage return characters in heredocs that include
|
34
|
-
them
|
22
|
+
* RipperRubyParser does not always match RubyParser's line numbering
|
23
|
+
* RipperRubyParser dedents auto-dedenting heredocs
|
24
|
+
* RipperRubyParser does not include postfix comments
|
35
25
|
|
36
26
|
## Install
|
37
27
|
|
@@ -50,18 +40,11 @@ parser.parse "foo[bar] += baz qux"
|
|
50
40
|
# s(:arglist, s(:call, nil, :bar)),
|
51
41
|
# :+,
|
52
42
|
# s(:call, nil, :baz, s(:call, nil, :qux)))
|
53
|
-
parser.extra_compatible = true
|
54
|
-
|
55
|
-
parser.parse "foo[bar] += baz qux"
|
56
|
-
# => s(:op_asgn1, s(:call, nil, :foo),
|
57
|
-
# s(:array, s(:call, nil, :bar)),
|
58
|
-
# :+,
|
59
|
-
# s(:call, nil, :baz, s(:call, nil, :qux)))
|
60
43
|
```
|
61
44
|
|
62
45
|
## Requirements
|
63
46
|
|
64
|
-
* Ruby 2.
|
47
|
+
* Ruby 2.5 or higher
|
65
48
|
* `sexp_processor`
|
66
49
|
|
67
50
|
## Hacking and contributing
|
@@ -81,7 +64,7 @@ If you want to send pull requests or patches, please:
|
|
81
64
|
|
82
65
|
(The MIT License)
|
83
66
|
|
84
|
-
Copyright (c) 2012, 2014-
|
67
|
+
Copyright (c) 2012, 2014-2020 Matijs van Zuijlen
|
85
68
|
|
86
69
|
Permission is hereby granted, free of charge, to any person obtaining
|
87
70
|
a copy of this software and associated documentation files (the
|
data/lib/ripper_ruby_parser.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
5
|
-
require
|
3
|
+
require "ripper"
|
4
|
+
require "ripper_ruby_parser/syntax_error"
|
5
|
+
require "ripper_ruby_parser/unescape"
|
6
6
|
|
7
7
|
module RipperRubyParser
|
8
8
|
# Variant of Ripper's SexpBuilder parser class that inserts comments as
|
@@ -12,7 +12,7 @@ module RipperRubyParser
|
|
12
12
|
class CommentingRipperParser < Ripper::SexpBuilder
|
13
13
|
def initialize(*args)
|
14
14
|
super
|
15
|
-
@comment =
|
15
|
+
@comment = ""
|
16
16
|
@comment_stack = []
|
17
17
|
@delimiter_stack = []
|
18
18
|
@space_before = false
|
@@ -22,16 +22,27 @@ module RipperRubyParser
|
|
22
22
|
|
23
23
|
def parse
|
24
24
|
result = super
|
25
|
-
raise
|
25
|
+
raise "Ripper parse failed." unless result
|
26
26
|
|
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
|
33
35
|
end
|
34
36
|
|
37
|
+
def on_begin(*args)
|
38
|
+
commentize(:begin, super)
|
39
|
+
end
|
40
|
+
|
41
|
+
def on_void_stmt
|
42
|
+
result = super
|
43
|
+
result << [lineno, column]
|
44
|
+
end
|
45
|
+
|
35
46
|
def on_comment(tok)
|
36
47
|
@comment += tok
|
37
48
|
end
|
@@ -49,14 +60,15 @@ module RipperRubyParser
|
|
49
60
|
end
|
50
61
|
|
51
62
|
def on_kw(tok)
|
63
|
+
result = super
|
52
64
|
case tok
|
53
|
-
when
|
65
|
+
when "class", "def", "module", "BEGIN", "begin", "END"
|
54
66
|
unless @in_symbol
|
55
|
-
@comment_stack.push [
|
56
|
-
@comment =
|
67
|
+
@comment_stack.push [result, @comment]
|
68
|
+
@comment = ""
|
57
69
|
end
|
58
70
|
end
|
59
|
-
|
71
|
+
result
|
60
72
|
end
|
61
73
|
|
62
74
|
def on_module(*args)
|
@@ -91,6 +103,18 @@ module RipperRubyParser
|
|
91
103
|
@delimiter_stack.push delimiter
|
92
104
|
end
|
93
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
|
+
|
94
118
|
def on_heredoc_end(_delimiter)
|
95
119
|
@delimiter_stack.pop
|
96
120
|
end
|
@@ -245,7 +269,7 @@ module RipperRubyParser
|
|
245
269
|
def on_unary(operator, value)
|
246
270
|
if !@space_before && operator == :-@ && NUMBER_LITERAL_TYPES.include?(value.first)
|
247
271
|
type, literal, lines = value
|
248
|
-
if literal[0] ==
|
272
|
+
if literal[0] == "-"
|
249
273
|
super
|
250
274
|
else
|
251
275
|
[type, "-#{literal}", lines]
|
@@ -275,31 +299,38 @@ module RipperRubyParser
|
|
275
299
|
super
|
276
300
|
end
|
277
301
|
|
278
|
-
def
|
279
|
-
|
302
|
+
def on_BEGIN(*args)
|
303
|
+
commentize(:BEGIN, super)
|
280
304
|
end
|
281
305
|
|
282
|
-
def
|
283
|
-
|
306
|
+
def on_END(*args)
|
307
|
+
commentize(:END, super)
|
284
308
|
end
|
285
309
|
|
286
|
-
def
|
287
|
-
raise SyntaxError,
|
310
|
+
def on_parse_error(message)
|
311
|
+
raise SyntaxError, message
|
288
312
|
end
|
289
313
|
|
290
|
-
def
|
291
|
-
raise SyntaxError,
|
314
|
+
def on_class_name_error(message, *)
|
315
|
+
raise SyntaxError, message
|
292
316
|
end
|
293
317
|
|
294
|
-
def
|
295
|
-
raise SyntaxError,
|
318
|
+
def on_alias_error(message, *)
|
319
|
+
raise SyntaxError, message
|
296
320
|
end
|
297
321
|
|
298
|
-
|
322
|
+
def on_assign_error(message, *)
|
323
|
+
raise SyntaxError, message
|
324
|
+
end
|
325
|
+
|
326
|
+
def on_param_error(message, *)
|
327
|
+
raise SyntaxError, message
|
328
|
+
end
|
299
329
|
|
300
330
|
def commentize(_name, exp)
|
301
|
-
|
302
|
-
@comment =
|
331
|
+
(_, _kw, loc), comment = @comment_stack.pop
|
332
|
+
@comment = ""
|
333
|
+
exp.push loc
|
303
334
|
[:comment, comment, exp]
|
304
335
|
end
|
305
336
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
4
|
-
require
|
3
|
+
require "ripper_ruby_parser/commenting_ripper_parser"
|
4
|
+
require "ripper_ruby_parser/sexp_processor"
|
5
5
|
|
6
6
|
module RipperRubyParser
|
7
7
|
# Main parser class. Brings together Ripper and our
|
@@ -13,7 +13,7 @@ module RipperRubyParser
|
|
13
13
|
@extra_compatible = false
|
14
14
|
end
|
15
15
|
|
16
|
-
def parse(source, filename =
|
16
|
+
def parse(source, filename = "(string)", lineno = 1)
|
17
17
|
parser = CommentingRipperParser.new(source, filename, lineno)
|
18
18
|
exp = parser.parse
|
19
19
|
|
@@ -1,15 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require
|
3
|
+
require "ripper_ruby_parser/sexp_handlers/helper_methods"
|
4
4
|
|
5
|
-
require
|
6
|
-
require
|
7
|
-
require
|
8
|
-
require
|
9
|
-
require
|
10
|
-
require
|
11
|
-
require
|
12
|
-
require
|
5
|
+
require "ripper_ruby_parser/sexp_handlers/assignment"
|
6
|
+
require "ripper_ruby_parser/sexp_handlers/blocks"
|
7
|
+
require "ripper_ruby_parser/sexp_handlers/conditionals"
|
8
|
+
require "ripper_ruby_parser/sexp_handlers/literals"
|
9
|
+
require "ripper_ruby_parser/sexp_handlers/loops"
|
10
|
+
require "ripper_ruby_parser/sexp_handlers/method_calls"
|
11
|
+
require "ripper_ruby_parser/sexp_handlers/methods"
|
12
|
+
require "ripper_ruby_parser/sexp_handlers/operators"
|
13
|
+
require "ripper_ruby_parser/sexp_handlers/string_literals"
|
13
14
|
|
14
15
|
module RipperRubyParser
|
15
16
|
# Umbrella module for handlers of particular sexp types
|
@@ -28,6 +29,7 @@ module RipperRubyParser
|
|
28
29
|
include MethodCalls
|
29
30
|
include Methods
|
30
31
|
include Operators
|
32
|
+
include StringLiterals
|
31
33
|
end
|
32
34
|
end
|
33
35
|
end
|
@@ -96,11 +96,10 @@ module RipperRubyParser
|
|
96
96
|
_, lvalue, (_, operator,), value = exp.shift 4
|
97
97
|
|
98
98
|
lvalue = process(lvalue)
|
99
|
-
original_value_type = value.sexp_type
|
100
99
|
value = process(value)
|
101
100
|
operator = operator.chop.to_sym
|
102
101
|
|
103
|
-
create_operator_assignment_sub_type lvalue, value, operator
|
102
|
+
create_operator_assignment_sub_type lvalue, value, operator
|
104
103
|
end
|
105
104
|
|
106
105
|
private
|
@@ -123,16 +122,11 @@ module RipperRubyParser
|
|
123
122
|
'&&': :op_asgn_and
|
124
123
|
}.freeze
|
125
124
|
|
126
|
-
def create_operator_assignment_sub_type(lvalue, value, operator
|
125
|
+
def create_operator_assignment_sub_type(lvalue, value, operator)
|
127
126
|
case lvalue.sexp_type
|
128
127
|
when :aref_field
|
129
128
|
_, arr, arglist = lvalue
|
130
|
-
arglist.sexp_type =
|
131
|
-
[:command, :command_call].include?(original_value_type)
|
132
|
-
:array
|
133
|
-
else
|
134
|
-
:arglist
|
135
|
-
end
|
129
|
+
arglist.sexp_type = :arglist
|
136
130
|
s(:op_asgn1, arr, arglist, operator, value)
|
137
131
|
when :field
|
138
132
|
_, obj, _, (_, field) = lvalue
|
@@ -156,8 +150,13 @@ module RipperRubyParser
|
|
156
150
|
arglist.shift
|
157
151
|
s(:attrasgn, arr, :[]=, *arglist)
|
158
152
|
when :field
|
159
|
-
_, obj,
|
160
|
-
|
153
|
+
_, obj, call_op, (_, field) = lvalue
|
154
|
+
case call_op
|
155
|
+
when :"&.", s(:op, :"&.") # Handle both 2.5 and 2.6 style ops
|
156
|
+
s(:safe_attrasgn, obj, :"#{field}=", value)
|
157
|
+
else
|
158
|
+
s(:attrasgn, obj, :"#{field}=", value)
|
159
|
+
end
|
161
160
|
else
|
162
161
|
create_assignment_sub_type lvalue, value
|
163
162
|
end
|
@@ -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
|
@@ -35,7 +36,7 @@ module RipperRubyParser
|
|
35
36
|
|
36
37
|
def process_kwrest_param(exp)
|
37
38
|
_, sym, = exp.shift 3
|
38
|
-
process(sym)
|
39
|
+
process(sym) || s(:lvar, :"")
|
39
40
|
end
|
40
41
|
|
41
42
|
def process_block_var(exp)
|
@@ -47,10 +48,10 @@ module RipperRubyParser
|
|
47
48
|
end
|
48
49
|
|
49
50
|
def process_begin(exp)
|
50
|
-
_, body = exp.shift
|
51
|
+
_, body, pos = exp.shift 3
|
51
52
|
|
52
|
-
body =
|
53
|
-
s(:begin, body)
|
53
|
+
body = convert_void_stmt_to_nil_symbol process(body)
|
54
|
+
with_position pos, s(:begin, body)
|
54
55
|
end
|
55
56
|
|
56
57
|
def process_rescue(exp)
|
@@ -58,51 +59,32 @@ 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
|
-
if eclass.first.is_a? Symbol
|
63
|
-
eclass = process(eclass)
|
64
|
-
body = eclass.sexp_body
|
65
|
-
if eclass.sexp_type == :mrhs
|
66
|
-
body.first
|
67
|
-
else
|
68
|
-
s(:array, *body)
|
69
|
-
end
|
70
|
-
else
|
71
|
-
s(:array, process(eclass.first))
|
72
|
-
end
|
73
|
-
else
|
74
|
-
s(:array)
|
75
|
-
end
|
62
|
+
capture = handle_rescue_class_list eclass
|
76
63
|
|
77
64
|
capture << create_assignment_sub_type(process(evar), s(:gvar, :$!)) if evar
|
78
65
|
|
79
|
-
s(
|
80
|
-
s(:resbody, capture, *rescue_block),
|
81
|
-
*process(after))
|
66
|
+
s(s(:resbody, capture, *rescue_block), *process(after))
|
82
67
|
end
|
83
68
|
|
84
69
|
def process_bodystmt(exp)
|
85
70
|
_, main, rescue_block, else_block, ensure_block = exp.shift 5
|
86
71
|
|
87
|
-
|
72
|
+
body_list = []
|
88
73
|
|
89
|
-
|
90
|
-
|
74
|
+
main_block = process(main)
|
75
|
+
line = main_block.line
|
76
|
+
body_list << main_block if main_block.sexp_type != :void_stmt
|
91
77
|
|
92
|
-
if rescue_block
|
93
|
-
|
94
|
-
|
95
|
-
body = s(s(:rescue, *body))
|
96
|
-
elsif else_block
|
97
|
-
body << process(else_block)
|
98
|
-
end
|
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
|
99
81
|
|
100
82
|
if ensure_block
|
101
|
-
|
102
|
-
|
83
|
+
body_list << process(ensure_block)
|
84
|
+
body_list = [s(:ensure, *body_list)]
|
103
85
|
end
|
104
86
|
|
105
|
-
wrap_in_block(
|
87
|
+
wrap_in_block(body_list, line)
|
106
88
|
end
|
107
89
|
|
108
90
|
def process_rescue_mod(exp)
|
@@ -138,12 +120,16 @@ module RipperRubyParser
|
|
138
120
|
|
139
121
|
def process_lambda(exp)
|
140
122
|
_, args, statements = exp.shift 3
|
123
|
+
|
141
124
|
old_type = args.sexp_type
|
142
125
|
args = convert_arguments(process(args))
|
126
|
+
statements = process(statements)
|
127
|
+
line = args.line || statements.line
|
143
128
|
args = nil if args == s(:args) && old_type == :params
|
144
|
-
|
145
|
-
|
146
|
-
|
129
|
+
call = s(:lambda)
|
130
|
+
call.line = line
|
131
|
+
|
132
|
+
make_iter call, args, safe_unwrap_void_stmt(statements)
|
147
133
|
end
|
148
134
|
|
149
135
|
private
|
@@ -165,7 +151,10 @@ module RipperRubyParser
|
|
165
151
|
end
|
166
152
|
|
167
153
|
def handle_splat(splat)
|
168
|
-
if splat
|
154
|
+
if splat == 0
|
155
|
+
# Only relevant for Ruby < 2.6
|
156
|
+
[s(:excessed_comma)]
|
157
|
+
elsif splat
|
169
158
|
[process(splat)]
|
170
159
|
else
|
171
160
|
[]
|
@@ -197,17 +186,24 @@ module RipperRubyParser
|
|
197
186
|
[process(block)]
|
198
187
|
end
|
199
188
|
|
200
|
-
def
|
201
|
-
|
202
|
-
|
203
|
-
|
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
|
204
200
|
else
|
205
|
-
|
201
|
+
s(:array, process(eclass.first))
|
206
202
|
end
|
207
203
|
end
|
208
204
|
|
209
205
|
def make_iter(call, args, stmt)
|
210
|
-
args
|
206
|
+
args[-1] = nil if args && args.last == s(:excessed_comma)
|
211
207
|
args ||= 0
|
212
208
|
if stmt.empty?
|
213
209
|
s(:iter, call, args)
|
@@ -215,17 +211,6 @@ module RipperRubyParser
|
|
215
211
|
s(:iter, call, args, stmt)
|
216
212
|
end
|
217
213
|
end
|
218
|
-
|
219
|
-
def wrap_in_block(statements)
|
220
|
-
case statements.length
|
221
|
-
when 0
|
222
|
-
nil
|
223
|
-
when 1
|
224
|
-
statements.first
|
225
|
-
else
|
226
|
-
s(:block, *statements)
|
227
|
-
end
|
228
|
-
end
|
229
214
|
end
|
230
215
|
end
|
231
216
|
end
|