parser 2.7.0.5 → 2.7.1.4
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/.gitignore +1 -0
- data/.travis.yml +21 -32
- data/CHANGELOG.md +59 -1
- data/README.md +2 -2
- data/Rakefile +2 -1
- data/doc/AST_FORMAT.md +106 -3
- data/lib/parser.rb +1 -0
- data/lib/parser/all.rb +1 -0
- data/lib/parser/ast/processor.rb +9 -0
- data/lib/parser/builders/default.rb +103 -12
- data/lib/parser/context.rb +1 -0
- data/lib/parser/current.rb +13 -4
- data/lib/parser/diagnostic.rb +1 -1
- data/lib/parser/diagnostic/engine.rb +1 -2
- data/lib/parser/lexer.rl +15 -1
- data/lib/parser/macruby.y +14 -4
- data/lib/parser/messages.rb +15 -0
- data/lib/parser/meta.rb +4 -4
- data/lib/parser/ruby18.y +2 -0
- data/lib/parser/ruby19.y +14 -4
- data/lib/parser/ruby20.y +14 -4
- data/lib/parser/ruby21.y +9 -2
- data/lib/parser/ruby22.y +9 -2
- data/lib/parser/ruby23.y +9 -2
- data/lib/parser/ruby24.y +9 -2
- data/lib/parser/ruby25.y +9 -2
- data/lib/parser/ruby26.y +9 -2
- data/lib/parser/ruby27.y +28 -8
- data/lib/parser/ruby28.y +3043 -0
- data/lib/parser/rubymotion.y +14 -4
- data/lib/parser/runner.rb +26 -2
- data/lib/parser/runner/ruby_rewrite.rb +2 -2
- data/lib/parser/source/buffer.rb +3 -1
- data/lib/parser/source/comment/associator.rb +14 -4
- data/lib/parser/source/map/endless_definition.rb +23 -0
- data/lib/parser/source/range.rb +17 -1
- data/lib/parser/source/tree_rewriter.rb +115 -12
- data/lib/parser/source/tree_rewriter/action.rb +135 -26
- data/lib/parser/tree_rewriter.rb +1 -2
- data/lib/parser/version.rb +1 -1
- data/parser.gemspec +3 -2
- data/test/helper.rb +49 -6
- data/test/parse_helper.rb +27 -23
- data/test/test_ast_processor.rb +32 -0
- data/test/test_base.rb +1 -1
- data/test/test_current.rb +2 -0
- data/test/test_diagnostic.rb +6 -7
- data/test/test_diagnostic_engine.rb +5 -8
- data/test/test_lexer.rb +17 -8
- data/test/test_meta.rb +12 -0
- data/test/test_parser.rb +477 -54
- data/test/test_runner_parse.rb +22 -1
- data/test/test_runner_rewrite.rb +1 -1
- data/test/test_source_buffer.rb +4 -1
- data/test/test_source_comment.rb +2 -2
- data/test/test_source_comment_associator.rb +47 -15
- data/test/test_source_map.rb +1 -2
- data/test/test_source_range.rb +29 -9
- data/test/test_source_rewriter.rb +4 -4
- data/test/test_source_rewriter_action.rb +2 -2
- data/test/test_source_tree_rewriter.rb +201 -13
- metadata +19 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c4dbd5dfd3a249d65b4d2b20c54b668749b3d5360e7feef7772924c135b78d86
|
4
|
+
data.tar.gz: ca30aca7f92a24fb96ef74c1a21149d9d43fb541d86bdae0b113f5ea5e267137
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: deb6edb6b828f309ebc6eb58e19613fe13c490e780895dfad01aceeeb0111781bc9e90b81bf6be35069afed44bd5f683c8120f134abd3d6aa7546a15fb370c19
|
7
|
+
data.tar.gz: 0c5a25dade42d9c74bc115aa8ecfd8dbfbcdeadc0fee6e994f44532ed994ac0c47aeccccc5405ddc9b5bd3804e4c47874163e6d468e47cb14ddd647ffb2c118c
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,51 +1,40 @@
|
|
1
1
|
dist: trusty
|
2
2
|
language: ruby
|
3
|
-
|
3
|
+
jobs:
|
4
4
|
include:
|
5
|
-
- name:
|
6
|
-
rvm:
|
7
|
-
script: bundle exec rake
|
8
|
-
- name:
|
9
|
-
rvm:
|
10
|
-
script: bundle exec rake
|
11
|
-
- name: 2.
|
12
|
-
rvm: 2.
|
13
|
-
script: bundle exec rake test_cov
|
14
|
-
- name: 2.4.9 / Parser tests
|
15
|
-
rvm: 2.4.9
|
5
|
+
- name: jruby-9.1.15.0 / Parser tests
|
6
|
+
rvm: jruby-9.1.15.0
|
7
|
+
script: bundle exec rake test
|
8
|
+
- name: truffleruby / Parser tests
|
9
|
+
rvm: truffleruby
|
10
|
+
script: TRUFFLERUBYOPT=--engine.Mode=latency bundle exec rake test
|
11
|
+
- name: 2.4.10 / Parser tests
|
12
|
+
rvm: 2.4.10
|
16
13
|
script: bundle exec rake test_cov
|
17
|
-
- name: 2.5.
|
18
|
-
rvm: 2.5.
|
14
|
+
- name: 2.5.8 / Parser tests
|
15
|
+
rvm: 2.5.8
|
19
16
|
script: bundle exec rake test_cov
|
20
|
-
- name: 2.6.
|
21
|
-
rvm: 2.6.
|
17
|
+
- name: 2.6.6 / Parser tests
|
18
|
+
rvm: 2.6.6
|
22
19
|
script: bundle exec rake test_cov
|
23
|
-
- name: 2.7.
|
24
|
-
rvm: 2.7.
|
20
|
+
- name: 2.7.1 / Parser tests
|
21
|
+
rvm: 2.7.1
|
25
22
|
script: bundle exec rake test_cov
|
26
23
|
- name: ruby-head / Parser tests
|
27
24
|
rvm: ruby-head
|
28
25
|
script: bundle exec rake test_cov
|
29
|
-
- name:
|
30
|
-
rvm:
|
31
|
-
script: bundle exec rake test_cov
|
32
|
-
- name: rbx-2 / Parser tests
|
33
|
-
rvm: rbx-2
|
34
|
-
script: bundle exec rake test_cov
|
35
|
-
- name: 2.5.7 / Rubocop tests
|
36
|
-
rvm: 2.5.7
|
26
|
+
- name: 2.5.8 / Rubocop tests
|
27
|
+
rvm: 2.5.8
|
37
28
|
script: ./ci/run_rubocop_specs
|
38
|
-
- name: 2.6.
|
39
|
-
rvm: 2.6.
|
29
|
+
- name: 2.6.6 / Rubocop tests
|
30
|
+
rvm: 2.6.6
|
40
31
|
script: ./ci/run_rubocop_specs
|
41
|
-
- name: 2.7.
|
42
|
-
rvm: 2.7.
|
32
|
+
- name: 2.7.1 / Rubocop tests
|
33
|
+
rvm: 2.7.1
|
43
34
|
script: ./ci/run_rubocop_specs
|
44
35
|
allow_failures:
|
45
36
|
- rvm: ruby-head
|
46
|
-
- rvm: rbx-2
|
47
37
|
- script: ./ci/run_rubocop_specs
|
48
38
|
before_install:
|
49
|
-
- gem install bundler -v '< 2'
|
50
39
|
- bundle --version
|
51
40
|
- gem --version
|
data/CHANGELOG.md
CHANGED
@@ -1,9 +1,67 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
-
Not released (2020-
|
4
|
+
Not released (2020-06-19)
|
5
5
|
-------------------------
|
6
6
|
|
7
|
+
Features implemented:
|
8
|
+
* ruby28.y: add find pattern. (#714) (Ilya Bylich)
|
9
|
+
* lexer.rl: reject `->...` and `->(...)` with the same error. (#713) (Ilya Bylich)
|
10
|
+
* ruby28.y: accept leading args before forward arg. (#712) (Ilya Bylich)
|
11
|
+
* Added `emit_forward_arg` compatibility flag. (#710) (Ilya Bylich)
|
12
|
+
* ruby28.y: include entire lambda expr in lambda rule. (#708) (Ilya Bylich)
|
13
|
+
* ruby28.y: extracted excessed_comma rule. (#706) (Ilya Bylich)
|
14
|
+
* Source::TreeRewriter: Improved merging and representations (#703) (Marc-André Lafortune)
|
15
|
+
|
16
|
+
Bugs fixed:
|
17
|
+
* ruby*.y: fixed context inside lambda args and module. (#709) (Ilya Bylich)
|
18
|
+
|
19
|
+
v2.7.1.3 (2020-05-26)
|
20
|
+
---------------------
|
21
|
+
|
22
|
+
API modifications:
|
23
|
+
* fixed all warnings. tests are running in verbose mode now. (#685) (Ilya Bylich)
|
24
|
+
|
25
|
+
Features implemented:
|
26
|
+
* ruby-[parse, rewrite]: add legacy switches (#699) (Marc-André Lafortune)
|
27
|
+
* Added Parser::Source::Range#to_range. (#697) (Ilya Bylich)
|
28
|
+
* ruby28.y: support rescue modifier in endless method definition. (#696) (Ilya Bylich)
|
29
|
+
* ruby28.y: unify kwrest and no-kwrest rules. (#694) (Ilya Bylich)
|
30
|
+
* ruby28.y: add right hand assignment (#682) (Vladimir Dementyev)
|
31
|
+
|
32
|
+
Bugs fixed:
|
33
|
+
* fix Comment.associate for postfix conditions/loops (#688) (Marc-André Lafortune)
|
34
|
+
|
35
|
+
v2.7.1.2 (2020-04-30)
|
36
|
+
---------------------
|
37
|
+
|
38
|
+
Features implemented:
|
39
|
+
* ruby28.y: endless method definition (#676) (Vladimir Dementyev)
|
40
|
+
* ruby28.y: branch parser (#677) (Vladimir Dementyev)
|
41
|
+
|
42
|
+
Bugs fixed:
|
43
|
+
* ruby27.y: reject invalid lvar in pattern matching (#680) (Vladimir Dementyev)
|
44
|
+
|
45
|
+
v2.7.1.1 (2020-04-15)
|
46
|
+
---------------------
|
47
|
+
|
48
|
+
Features implemented:
|
49
|
+
* Add Source::Range#eql? and hash (#675) (Marc-André Lafortune)
|
50
|
+
* Source::TreeRewriter: Add #merge, #merge! and #empty? (#674) (Marc-André Lafortune)
|
51
|
+
|
52
|
+
v2.7.1.0 (2020-04-03)
|
53
|
+
---------------------
|
54
|
+
|
55
|
+
API modifications:
|
56
|
+
* Bump ruby versions to 2.4.10, 2.5.8, 2.6.6, 2.7.1. (#665) (Ilya Bylich)
|
57
|
+
|
58
|
+
Features implemented:
|
59
|
+
* ruby27.y: allow newlines inside braced pattern. (#664) (Ilya Bylich)
|
60
|
+
* ruby27.y: Allow trailing comma in hash pattern (#661) (Koichi ITO)
|
61
|
+
|
62
|
+
v2.7.0.5 (2020-03-20)
|
63
|
+
---------------------
|
64
|
+
|
7
65
|
Features implemented:
|
8
66
|
* ruby27.y: fix array pattern with tail source map (#659) (Vladimir Dementyev)
|
9
67
|
|
data/README.md
CHANGED
@@ -29,6 +29,7 @@ below for explanation of `emit_*` calls):
|
|
29
29
|
Parser::Builders::Default.emit_encoding = true
|
30
30
|
Parser::Builders::Default.emit_index = true
|
31
31
|
Parser::Builders::Default.emit_arg_inside_procarg0 = true
|
32
|
+
Parser::Builders::Default.emit_forward_arg = true
|
32
33
|
|
33
34
|
Parse a chunk of code:
|
34
35
|
|
@@ -59,8 +60,7 @@ Parse a chunk of code and display all diagnostics:
|
|
59
60
|
puts diag.render
|
60
61
|
end
|
61
62
|
|
62
|
-
buffer = Parser::Source::Buffer.new('(string)')
|
63
|
-
buffer.source = "foo *bar"
|
63
|
+
buffer = Parser::Source::Buffer.new('(string)', source: "foo *bar")
|
64
64
|
|
65
65
|
p parser.parse(buffer)
|
66
66
|
# (string):1:5: warning: `*' interpreted as argument prefix
|
data/Rakefile
CHANGED
@@ -11,7 +11,7 @@ task :default => [:test]
|
|
11
11
|
Rake::TestTask.new do |t|
|
12
12
|
t.libs = %w(test/ lib/)
|
13
13
|
t.test_files = FileList["test/**/test_*.rb"]
|
14
|
-
t.warning =
|
14
|
+
t.warning = true
|
15
15
|
end
|
16
16
|
|
17
17
|
task :test_cov do
|
@@ -32,6 +32,7 @@ GENERATED_FILES = %w(lib/parser/lexer.rb
|
|
32
32
|
lib/parser/ruby25.rb
|
33
33
|
lib/parser/ruby26.rb
|
34
34
|
lib/parser/ruby27.rb
|
35
|
+
lib/parser/ruby28.rb
|
35
36
|
lib/parser/macruby.rb
|
36
37
|
lib/parser/rubymotion.rb)
|
37
38
|
|
data/doc/AST_FORMAT.md
CHANGED
@@ -637,7 +637,7 @@ Format:
|
|
637
637
|
(masgn (mlhs (ivasgn :@a) (cvasgn :@@b)) (array (splat (lvar :c))))
|
638
638
|
"@a, @@b = *c"
|
639
639
|
|
640
|
-
(masgn (mlhs (
|
640
|
+
(masgn (mlhs (lvasgn :a) (mlhs (lvasgn :b)) (lvasgn :c)) (lvar :d))
|
641
641
|
"a, (b, c) = d"
|
642
642
|
|
643
643
|
(masgn (mlhs (send (self) :a=) (send (self) :[]= (int 1))) (lvar :a))
|
@@ -730,6 +730,28 @@ Format:
|
|
730
730
|
|
731
731
|
~~~
|
732
732
|
|
733
|
+
### Right-hand assignment
|
734
|
+
|
735
|
+
Format:
|
736
|
+
|
737
|
+
~~~
|
738
|
+
(rasgn (int 1) (lvasgn :a))
|
739
|
+
"1 => a"
|
740
|
+
~~~~~~ expression
|
741
|
+
~~ operator
|
742
|
+
~~~
|
743
|
+
|
744
|
+
#### Multiple right-hand assignment
|
745
|
+
|
746
|
+
Format:
|
747
|
+
|
748
|
+
~~~
|
749
|
+
(mrasgn (send (int 13) :divmod (int 5)) (mlhs (lvasgn :a) (lvasgn :b)))
|
750
|
+
"13.divmod(5) => a,b"
|
751
|
+
~~~~~~~~~~~~~~~~~~~ expression
|
752
|
+
^^ operator
|
753
|
+
~~~
|
754
|
+
|
733
755
|
## Class and module definition
|
734
756
|
|
735
757
|
### Module
|
@@ -802,6 +824,33 @@ Format:
|
|
802
824
|
~~~~~~~~~~~~~~~~~ expression
|
803
825
|
~~~
|
804
826
|
|
827
|
+
### "Endless" method
|
828
|
+
|
829
|
+
Format:
|
830
|
+
|
831
|
+
~~~
|
832
|
+
(def_e :foo (args) (int 42))
|
833
|
+
"def foo() = 42"
|
834
|
+
~~~ keyword
|
835
|
+
~~~ name
|
836
|
+
^ assignment
|
837
|
+
~~~~~~~~~~~~~~ expression
|
838
|
+
~~~
|
839
|
+
|
840
|
+
|
841
|
+
### "Endless" singleton method
|
842
|
+
|
843
|
+
Format:
|
844
|
+
|
845
|
+
~~~
|
846
|
+
(defs_e (self) :foo (args) (int 42))
|
847
|
+
"def self.foo() = 42"
|
848
|
+
~~~ keyword
|
849
|
+
~~~ name
|
850
|
+
^ assignment
|
851
|
+
~~~~~~~~~~~~~~~~~~~ expression
|
852
|
+
~~~
|
853
|
+
|
805
854
|
### Undefinition
|
806
855
|
|
807
856
|
Format:
|
@@ -1115,13 +1164,13 @@ s(:numblock,
|
|
1115
1164
|
|
1116
1165
|
## Forward arguments
|
1117
1166
|
|
1118
|
-
### Method definition accepting forwarding arguments
|
1167
|
+
### Method definition accepting only forwarding arguments
|
1119
1168
|
|
1120
1169
|
Ruby 2.7 introduced a feature called "arguments forwarding".
|
1121
1170
|
When a method takes any arguments for forwarding them in the future
|
1122
1171
|
the whole `args` node gets replaced with `forward-args` node.
|
1123
1172
|
|
1124
|
-
Format:
|
1173
|
+
Format if `emit_forward_arg` compatibility flag is disabled:
|
1125
1174
|
|
1126
1175
|
~~~
|
1127
1176
|
(def :foo
|
@@ -1132,6 +1181,25 @@ Format:
|
|
1132
1181
|
~~~~~ expression
|
1133
1182
|
~~~
|
1134
1183
|
|
1184
|
+
However, Ruby 2.8 added support for leading arguments before `...`, and so
|
1185
|
+
it can't be used as a replacement of the `(args)` node anymore. To solve it
|
1186
|
+
`emit_forward_arg` should be enabled.
|
1187
|
+
|
1188
|
+
Format if `emit_forward_arg` compatibility flag is enabled:
|
1189
|
+
|
1190
|
+
~~~
|
1191
|
+
(def :foo
|
1192
|
+
(args
|
1193
|
+
(forward-arg)) nil)
|
1194
|
+
"def foo(...); end"
|
1195
|
+
~ begin (args)
|
1196
|
+
~ end (args)
|
1197
|
+
~~~~~ expression (args)
|
1198
|
+
~~~ expression (forward_arg)
|
1199
|
+
~~~
|
1200
|
+
|
1201
|
+
Note that the node is called `forward_arg` when emitted separately.
|
1202
|
+
|
1135
1203
|
### Method call taking arguments of the currently forwarding method
|
1136
1204
|
|
1137
1205
|
Format:
|
@@ -2123,6 +2191,24 @@ Format:
|
|
2123
2191
|
~~~ name (match-nil-pattern)
|
2124
2192
|
~~~
|
2125
2193
|
|
2194
|
+
### Matching using find pattern
|
2195
|
+
|
2196
|
+
Format:
|
2197
|
+
|
2198
|
+
~~~
|
2199
|
+
(find-pattern
|
2200
|
+
(match-rest
|
2201
|
+
(match-var :a))
|
2202
|
+
(int 42)
|
2203
|
+
(match-rest))
|
2204
|
+
"in [*, 42, *]"
|
2205
|
+
~ begin
|
2206
|
+
~ end
|
2207
|
+
~~~~~~~~~~ expression
|
2208
|
+
~~~
|
2209
|
+
|
2210
|
+
Note that it can be used as a top-level pattern only when used in a `case` statement. In that case `begin` and `end` are empty.
|
2211
|
+
|
2126
2212
|
### Matching using const pattern
|
2127
2213
|
|
2128
2214
|
#### With array pattern
|
@@ -2178,3 +2264,20 @@ Format:
|
|
2178
2264
|
~ expression (const-pattern.const)
|
2179
2265
|
~~ expression (const-pattern.array_pattern)
|
2180
2266
|
~~~
|
2267
|
+
|
2268
|
+
#### With find pattern
|
2269
|
+
|
2270
|
+
Format:
|
2271
|
+
|
2272
|
+
~~~
|
2273
|
+
(const-pattern
|
2274
|
+
(const nil :X)
|
2275
|
+
(find-pattern
|
2276
|
+
(match-rest)
|
2277
|
+
(int 42)
|
2278
|
+
(match-rest)))
|
2279
|
+
"in X[*, 42, *]"
|
2280
|
+
~ begin
|
2281
|
+
~ end
|
2282
|
+
~~~~~~~~~~~ expression
|
2283
|
+
~~~
|
data/lib/parser.rb
CHANGED
@@ -46,6 +46,7 @@ module Parser
|
|
46
46
|
require 'parser/source/map/variable'
|
47
47
|
require 'parser/source/map/keyword'
|
48
48
|
require 'parser/source/map/definition'
|
49
|
+
require 'parser/source/map/endless_definition'
|
49
50
|
require 'parser/source/map/send'
|
50
51
|
require 'parser/source/map/index'
|
51
52
|
require 'parser/source/map/condition'
|
data/lib/parser/all.rb
CHANGED
data/lib/parser/ast/processor.rb
CHANGED
@@ -75,6 +75,9 @@ module Parser
|
|
75
75
|
alias on_mlhs process_regular_node
|
76
76
|
alias on_masgn process_regular_node
|
77
77
|
|
78
|
+
alias on_rasgn process_regular_node
|
79
|
+
alias on_mrasgn process_regular_node
|
80
|
+
|
78
81
|
def on_const(node)
|
79
82
|
scope_node, name = *node
|
80
83
|
|
@@ -124,6 +127,7 @@ module Parser
|
|
124
127
|
alias on_kwarg process_argument_node
|
125
128
|
alias on_kwoptarg process_argument_node
|
126
129
|
alias on_kwrestarg process_argument_node
|
130
|
+
alias on_forward_arg process_argument_node
|
127
131
|
|
128
132
|
def on_procarg0(node)
|
129
133
|
if node.children[0].is_a?(Symbol)
|
@@ -159,6 +163,8 @@ module Parser
|
|
159
163
|
])
|
160
164
|
end
|
161
165
|
|
166
|
+
alias on_def_e on_def
|
167
|
+
|
162
168
|
def on_defs(node)
|
163
169
|
definee_node, name, args_node, body_node = *node
|
164
170
|
|
@@ -168,6 +174,8 @@ module Parser
|
|
168
174
|
])
|
169
175
|
end
|
170
176
|
|
177
|
+
alias on_defs_e on_defs
|
178
|
+
|
171
179
|
alias on_undef process_regular_node
|
172
180
|
alias on_alias process_regular_node
|
173
181
|
|
@@ -250,6 +258,7 @@ module Parser
|
|
250
258
|
alias on_array_pattern_with_tail process_regular_node
|
251
259
|
alias on_hash_pattern process_regular_node
|
252
260
|
alias on_const_pattern process_regular_node
|
261
|
+
alias on_find_pattern process_regular_node
|
253
262
|
|
254
263
|
# @private
|
255
264
|
def process_variable_node(node)
|
@@ -80,6 +80,8 @@ module Parser
|
|
80
80
|
attr_accessor :emit_index
|
81
81
|
end
|
82
82
|
|
83
|
+
@emit_index = false
|
84
|
+
|
83
85
|
class << self
|
84
86
|
##
|
85
87
|
# AST compatibility attribute; causes a single non-mlhs
|
@@ -95,7 +97,36 @@ module Parser
|
|
95
97
|
attr_accessor :emit_arg_inside_procarg0
|
96
98
|
end
|
97
99
|
|
98
|
-
@
|
100
|
+
@emit_arg_inside_procarg0 = false
|
101
|
+
|
102
|
+
class << self
|
103
|
+
##
|
104
|
+
# AST compatibility attribute; arguments forwarding initially
|
105
|
+
# didn't have support for leading arguments
|
106
|
+
# (i.e. `def m(a, ...); end` was a syntax error). However, Ruby 2.8
|
107
|
+
# added support for any number of arguments in front of the `...`.
|
108
|
+
#
|
109
|
+
# If set to false (the default):
|
110
|
+
# 1. `def m(...) end` is emitted as
|
111
|
+
# s(:def, :m, s(:forward_args), nil)
|
112
|
+
# 2. `def m(a, b, ...) end` is emitted as
|
113
|
+
# s(:def, :m,
|
114
|
+
# s(:args, s(:arg, :a), s(:arg, :b), s(:forward_arg)))
|
115
|
+
#
|
116
|
+
# If set to true it uses a single format:
|
117
|
+
# 1. `def m(...) end` is emitted as
|
118
|
+
# s(:def, :m, s(:args, s(:forward_arg)))
|
119
|
+
# 2. `def m(a, b, ...) end` is emitted as
|
120
|
+
# s(:def, :m, s(:args, s(:arg, :a), s(:arg, :b), s(:forward_arg)))
|
121
|
+
#
|
122
|
+
# It does't matter that much on 2.7 (because there can't be any leading arguments),
|
123
|
+
# but on 2.8 it should be better enabled to use a single AST format.
|
124
|
+
#
|
125
|
+
# @return [Boolean]
|
126
|
+
attr_accessor :emit_forward_arg
|
127
|
+
end
|
128
|
+
|
129
|
+
@emit_forward_arg = false
|
99
130
|
|
100
131
|
class << self
|
101
132
|
##
|
@@ -106,6 +137,7 @@ module Parser
|
|
106
137
|
@emit_encoding = true
|
107
138
|
@emit_index = true
|
108
139
|
@emit_arg_inside_procarg0 = true
|
140
|
+
@emit_forward_arg = true
|
109
141
|
end
|
110
142
|
end
|
111
143
|
|
@@ -619,6 +651,15 @@ module Parser
|
|
619
651
|
binary_op_map(lhs, eql_t, rhs))
|
620
652
|
end
|
621
653
|
|
654
|
+
def rassign(lhs, assoc_t, rhs)
|
655
|
+
n(:rasgn, [lhs, rhs], binary_op_map(lhs, assoc_t, rhs))
|
656
|
+
end
|
657
|
+
|
658
|
+
def multi_rassign(lhs, assoc_t, rhs)
|
659
|
+
n(:mrasgn, [ lhs, rhs ],
|
660
|
+
binary_op_map(lhs, assoc_t, rhs))
|
661
|
+
end
|
662
|
+
|
622
663
|
#
|
623
664
|
# Class and module definition
|
624
665
|
#
|
@@ -652,19 +693,28 @@ module Parser
|
|
652
693
|
definition_map(def_t, nil, name_t, end_t))
|
653
694
|
end
|
654
695
|
|
696
|
+
def def_endless_method(def_t, name_t, args,
|
697
|
+
assignment_t, body)
|
698
|
+
n(:def_e, [ value(name_t).to_sym, args, body ],
|
699
|
+
endless_definition_map(def_t, nil, name_t, assignment_t, body))
|
700
|
+
end
|
701
|
+
|
655
702
|
def def_singleton(def_t, definee, dot_t,
|
656
703
|
name_t, args,
|
657
704
|
body, end_t)
|
658
|
-
|
659
|
-
when :int, :str, :dstr, :sym, :dsym,
|
660
|
-
:regexp, :array, :hash
|
705
|
+
return unless validate_definee(definee)
|
661
706
|
|
662
|
-
|
707
|
+
n(:defs, [ definee, value(name_t).to_sym, args, body ],
|
708
|
+
definition_map(def_t, dot_t, name_t, end_t))
|
709
|
+
end
|
663
710
|
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
711
|
+
def def_endless_singleton(def_t, definee, dot_t,
|
712
|
+
name_t, args,
|
713
|
+
assignment_t, body)
|
714
|
+
return unless validate_definee(definee)
|
715
|
+
|
716
|
+
n(:defs_e, [ definee, value(name_t).to_sym, args, body ],
|
717
|
+
endless_definition_map(def_t, dot_t, name_t, assignment_t, body))
|
668
718
|
end
|
669
719
|
|
670
720
|
def undef_method(undef_t, names)
|
@@ -691,8 +741,18 @@ module Parser
|
|
691
741
|
n(:numargs, [ max_numparam ], nil)
|
692
742
|
end
|
693
743
|
|
694
|
-
def
|
695
|
-
|
744
|
+
def forward_only_args(begin_t, dots_t, end_t)
|
745
|
+
if self.class.emit_forward_arg
|
746
|
+
arg = forward_arg(dots_t)
|
747
|
+
n(:args, [ arg ],
|
748
|
+
collection_map(begin_t, [ arg ], end_t))
|
749
|
+
else
|
750
|
+
n(:forward_args, [], collection_map(begin_t, token_map(dots_t), end_t))
|
751
|
+
end
|
752
|
+
end
|
753
|
+
|
754
|
+
def forward_arg(dots_t)
|
755
|
+
n(:forward_arg, [], token_map(dots_t))
|
696
756
|
end
|
697
757
|
|
698
758
|
def arg(name_t)
|
@@ -1239,8 +1299,10 @@ module Parser
|
|
1239
1299
|
|
1240
1300
|
def match_var(name_t)
|
1241
1301
|
name = value(name_t).to_sym
|
1302
|
+
name_l = loc(name_t)
|
1242
1303
|
|
1243
|
-
|
1304
|
+
check_lvar_name(name, name_l)
|
1305
|
+
check_duplicate_pattern_variable(name, name_l)
|
1244
1306
|
@parser.static_env.declare(name)
|
1245
1307
|
|
1246
1308
|
n(:match_var, [ name ],
|
@@ -1253,6 +1315,7 @@ module Parser
|
|
1253
1315
|
expr_l = loc(name_t)
|
1254
1316
|
name_l = expr_l.adjust(end_pos: -1)
|
1255
1317
|
|
1318
|
+
check_lvar_name(name, name_l)
|
1256
1319
|
check_duplicate_pattern_variable(name, name_l)
|
1257
1320
|
@parser.static_env.declare(name)
|
1258
1321
|
|
@@ -1293,6 +1356,9 @@ module Parser
|
|
1293
1356
|
Source::Map::Variable.new(name_l, expr_l))
|
1294
1357
|
when :begin
|
1295
1358
|
match_hash_var_from_str(begin_t, string.children, end_t)
|
1359
|
+
else
|
1360
|
+
# we only can get here if there is an interpolation, e.g., ``in "#{ a }":`
|
1361
|
+
diagnostic :error, :pm_interp_in_var_name, nil, loc(begin_t).join(loc(end_t))
|
1296
1362
|
end
|
1297
1363
|
end
|
1298
1364
|
|
@@ -1334,6 +1400,11 @@ module Parser
|
|
1334
1400
|
collection_map(lbrack_t, elements, rbrack_t))
|
1335
1401
|
end
|
1336
1402
|
|
1403
|
+
def find_pattern(lbrack_t, elements, rbrack_t)
|
1404
|
+
n(:find_pattern, elements,
|
1405
|
+
collection_map(lbrack_t, elements, rbrack_t))
|
1406
|
+
end
|
1407
|
+
|
1337
1408
|
def match_with_trailing_comma(match, comma_t)
|
1338
1409
|
n(:match_with_trailing_comma, [ match ], expr_map(match.loc.expression.join(loc(comma_t))))
|
1339
1410
|
end
|
@@ -1737,6 +1808,14 @@ module Parser
|
|
1737
1808
|
loc(end_t))
|
1738
1809
|
end
|
1739
1810
|
|
1811
|
+
def endless_definition_map(keyword_t, operator_t, name_t, assignment_t, body_e)
|
1812
|
+
body_l = body_e.loc.expression
|
1813
|
+
|
1814
|
+
Source::Map::EndlessDefinition.new(loc(keyword_t),
|
1815
|
+
loc(operator_t), loc(name_t),
|
1816
|
+
loc(assignment_t), body_l)
|
1817
|
+
end
|
1818
|
+
|
1740
1819
|
def send_map(receiver_e, dot_t, selector_t, begin_t=nil, args=[], end_t=nil)
|
1741
1820
|
if receiver_e
|
1742
1821
|
begin_l = receiver_e.loc.expression
|
@@ -1979,6 +2058,18 @@ module Parser
|
|
1979
2058
|
@parser.send :yyerror
|
1980
2059
|
end
|
1981
2060
|
end
|
2061
|
+
|
2062
|
+
def validate_definee(definee)
|
2063
|
+
case definee.type
|
2064
|
+
when :int, :str, :dstr, :sym, :dsym,
|
2065
|
+
:regexp, :array, :hash
|
2066
|
+
|
2067
|
+
diagnostic :error, :singleton_literal, nil, definee.loc.expression
|
2068
|
+
false
|
2069
|
+
else
|
2070
|
+
true
|
2071
|
+
end
|
2072
|
+
end
|
1982
2073
|
end
|
1983
2074
|
|
1984
2075
|
end
|