parser 2.6.4.0 → 2.6.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +0 -82
- data/doc/AST_FORMAT.md +11 -0
- data/lib/parser/builders/default.rb +5 -0
- data/lib/parser/lexer.rl +25 -13
- data/lib/parser/meta.rb +1 -1
- data/lib/parser/ruby27.y +13 -0
- data/lib/parser/source/tree_rewriter.rb +1 -1
- data/lib/parser/version.rb +1 -1
- data/test/test_parser.rb +44 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7d7b8b9f67b6aaacdb9a0d545465e924b4f648b111da6be699663c5c67c84e4f
|
4
|
+
data.tar.gz: 171070fa439abfe6279d7e0c713d46a28528669085cfc643ab808569d17357c1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ab3de4f196504df68763d5efaa347b4febf2e2feed3dc1f0b407565a6f93434d4b1709dbe7a1fa36f28e39b25d67434ad861818ca7d570e0b2b0d8b5b1e71ff9
|
7
|
+
data.tar.gz: 8634d57721f51fa9dd91c843960fb6c20a7bbb0331c6e62b3f29da3a770f5471f9adcaad14efb5a68904f2e93767e835022abcb9b739c113898822942085f112
|
data/CHANGELOG.md
CHANGED
@@ -1,88 +1,6 @@
|
|
1
1
|
Changelog
|
2
2
|
=========
|
3
3
|
|
4
|
-
v2.6.4.0 (2019-08-30)
|
5
|
-
---------------------
|
6
|
-
|
7
|
-
API modifications:
|
8
|
-
* Added specs for heredocs with mixed encoding. (#581) (Ilya Bylich)
|
9
|
-
|
10
|
-
Features implemented:
|
11
|
-
* ruby27.y: Revert "pipeline operator" (#601) (Koichi ITO)
|
12
|
-
* ruby27.y: Fix parsing of mutiple assignment with rescue modifier (#600) (Koichi ITO)
|
13
|
-
* ruby27.y: hoisted out f_rest_marg. (#594) (Ilya Bylich)
|
14
|
-
* ruby27.y: added pipeline operator. (#592) (Ilya Bylich)
|
15
|
-
* ruby27.y: reject safe navigator in LHS of mass-assignment. (#586) (Ilya Bylich)
|
16
|
-
* lexer.rl: reject whitespaces in meta and control chars. (#585) (Ilya Bylich)
|
17
|
-
* lexer.rl: Reject numparams as symbol literals. (#582) (Ilya Bylich)
|
18
|
-
* ruby27.y: Added numbered parameters support. (#565) (Ilya Bylich)
|
19
|
-
* lexer.rl: Reject \n and \r in heredoc identifiers starting from 2.7. (#575) (Ilya Bylich)
|
20
|
-
|
21
|
-
Bugs fixed:
|
22
|
-
* ruby-parse: print empty string when --emit-json and empty input are given. (#590) (Ilya Bylich)
|
23
|
-
* AST_FORMAT: fixed documentation of the string with interpolation. (#589) (Ilya Bylich)
|
24
|
-
* builder.rb, processor.rb: Changed format of the procarg0 node. (#587) (Ilya Bylich)
|
25
|
-
|
26
|
-
v2.6.3.0 (2019-04-28)
|
27
|
-
---------------------
|
28
|
-
|
29
|
-
Features implemented:
|
30
|
-
* ruby27.y: Added beginless ranges support. (#570) (Ilya Bylich)
|
31
|
-
|
32
|
-
v2.6.2.1 (2019-04-05)
|
33
|
-
---------------------
|
34
|
-
|
35
|
-
API modifications:
|
36
|
-
* Bump 2.4 branch to 2.4.6. (#569) (Ilya Bylich)
|
37
|
-
* Lexer should know about current parsing context. (#566) (Ilya Bylich)
|
38
|
-
|
39
|
-
v2.6.2.0 (2019-03-21)
|
40
|
-
---------------------
|
41
|
-
|
42
|
-
API modifications:
|
43
|
-
* Bump ruby versions to 2.5.5 and 2.6.2. (#563) (Ilya Bylich)
|
44
|
-
* Bump Ruby version to 2.6.1. (#554) (Ilya Bylich)
|
45
|
-
|
46
|
-
Features implemented:
|
47
|
-
* ruby27.y: dsym should be treated as string. (#560) (Ilya Bylich)
|
48
|
-
* ruby27.y: Refactored symbol rules. (#557) (Ilya Bylich)
|
49
|
-
* ruby27.y: Added method reference operator. (#556) (Ilya Bylich)
|
50
|
-
* ruby27.y: branch parser. (#546) (Ilya Bylich)
|
51
|
-
|
52
|
-
v2.6.0.0 (2019-01-16)
|
53
|
-
---------------------
|
54
|
-
|
55
|
-
API modifications:
|
56
|
-
* 2.6.0 was released, unmark is as -dev. (#538) (Ilya Bylich)
|
57
|
-
|
58
|
-
Bugs fixed:
|
59
|
-
* Fix parsing of "\\\n" escaped sequences in various literals. (#539) (Ilya Bylich)
|
60
|
-
|
61
|
-
v2.5.3.0 (2018-10-29)
|
62
|
-
---------------------
|
63
|
-
|
64
|
-
Bugs fixed:
|
65
|
-
* lexer.rl: Fix parsing of 'm :key => m do; m() do end; end'. (#526) (Ilya Bylich)
|
66
|
-
* lexer.rl: Fix parsing of ambiguous 1re. (#523) (Ilya Bylich)
|
67
|
-
|
68
|
-
v2.5.1.2 (2018-07-10)
|
69
|
-
---------------------
|
70
|
-
|
71
|
-
Bugs fixed:
|
72
|
-
* lexer.rl: Partially revert 5ba072d and properly handle 'm = -> *args do end'. (Ilya Bylich)
|
73
|
-
|
74
|
-
v2.5.1.1 (2018-07-10)
|
75
|
-
---------------------
|
76
|
-
|
77
|
-
Features implemented:
|
78
|
-
* ruby26.y: Endless ranges support. (Ilya Bylich)
|
79
|
-
|
80
|
-
Bugs fixed:
|
81
|
-
* lexer.rl: Fix parsing of 'm = -> *args do end'. (Ilya Bylich)
|
82
|
-
* AST::Processor: Properly recurse into "kwsplat" nodes (Nelson Elhage)
|
83
|
-
* ruby24, ruby25, ruby26: Fix cmdargs after command_args followed by tLBRACE_ARG. This commit tracks upstream commit ruby/ruby@f168dbd. (Ilya Bylich)
|
84
|
-
* lexer.rl: Fix parsing of `let (:a) { m do; end }`. (Ilya Bylich)
|
85
|
-
|
86
4
|
v2.5.1.0 (2018-04-12)
|
87
5
|
---------------------
|
88
6
|
|
data/doc/AST_FORMAT.md
CHANGED
@@ -1032,6 +1032,17 @@ Format:
|
|
1032
1032
|
~~ expression
|
1033
1033
|
~~~
|
1034
1034
|
|
1035
|
+
### Keyword nil argument
|
1036
|
+
|
1037
|
+
Format:
|
1038
|
+
|
1039
|
+
~~~
|
1040
|
+
(kwnilarg)
|
1041
|
+
"**nil"
|
1042
|
+
~~~ name
|
1043
|
+
~~~~~ expression
|
1044
|
+
~~~
|
1045
|
+
|
1035
1046
|
### Objective-C arguments
|
1036
1047
|
|
1037
1048
|
MacRuby includes a few more syntactic "arguments" whose name becomes
|
data/lib/parser/lexer.rl
CHANGED
@@ -172,7 +172,7 @@ class Parser::Lexer
|
|
172
172
|
# If the lexer is in `command state' (aka expr_value)
|
173
173
|
# at the entry to #advance, it will transition to expr_cmdarg
|
174
174
|
# instead of expr_arg at certain points.
|
175
|
-
@
|
175
|
+
@command_start = true
|
176
176
|
|
177
177
|
# True at the end of "def foo a:"
|
178
178
|
@in_kwarg = false
|
@@ -287,8 +287,8 @@ class Parser::Lexer
|
|
287
287
|
pe = @source_pts.size + 2
|
288
288
|
p, eof = @p, pe
|
289
289
|
|
290
|
-
|
291
|
-
|
290
|
+
cmd_state = @command_start
|
291
|
+
@command_start = false
|
292
292
|
|
293
293
|
%% write exec;
|
294
294
|
# %
|
@@ -358,8 +358,8 @@ class Parser::Lexer
|
|
358
358
|
end
|
359
359
|
end
|
360
360
|
|
361
|
-
def arg_or_cmdarg
|
362
|
-
if
|
361
|
+
def arg_or_cmdarg(cmd_state)
|
362
|
+
if cmd_state
|
363
363
|
self.class.lex_en_expr_cmdarg
|
364
364
|
else
|
365
365
|
self.class.lex_en_expr_arg
|
@@ -1089,6 +1089,7 @@ class Parser::Lexer
|
|
1089
1089
|
end
|
1090
1090
|
|
1091
1091
|
current_literal.start_interp_brace
|
1092
|
+
@command_start = true
|
1092
1093
|
fnext expr_value;
|
1093
1094
|
fbreak;
|
1094
1095
|
}
|
@@ -1275,6 +1276,10 @@ class Parser::Lexer
|
|
1275
1276
|
@cond.push(false); @cmdarg.push(false)
|
1276
1277
|
|
1277
1278
|
@paren_nest += 1
|
1279
|
+
|
1280
|
+
if version?(18)
|
1281
|
+
@command_start = true
|
1282
|
+
end
|
1278
1283
|
};
|
1279
1284
|
|
1280
1285
|
e_rparen = ')' % {
|
@@ -1288,7 +1293,7 @@ class Parser::Lexer
|
|
1288
1293
|
if !@static_env.nil? && @static_env.declared?(tok)
|
1289
1294
|
fnext expr_endfn; fbreak;
|
1290
1295
|
else
|
1291
|
-
fnext *arg_or_cmdarg; fbreak;
|
1296
|
+
fnext *arg_or_cmdarg(cmd_state); fbreak;
|
1292
1297
|
end
|
1293
1298
|
}
|
1294
1299
|
|
@@ -1445,15 +1450,15 @@ class Parser::Lexer
|
|
1445
1450
|
expr_dot := |*
|
1446
1451
|
constant
|
1447
1452
|
=> { emit(:tCONSTANT)
|
1448
|
-
fnext *arg_or_cmdarg; fbreak; };
|
1453
|
+
fnext *arg_or_cmdarg(cmd_state); fbreak; };
|
1449
1454
|
|
1450
1455
|
call_or_var
|
1451
1456
|
=> { emit(:tIDENTIFIER)
|
1452
|
-
fnext *arg_or_cmdarg; fbreak; };
|
1457
|
+
fnext *arg_or_cmdarg(cmd_state); fbreak; };
|
1453
1458
|
|
1454
1459
|
bareword ambiguous_fid_suffix
|
1455
1460
|
=> { emit(:tFID, tok(@ts, tm), @ts, tm)
|
1456
|
-
fnext *arg_or_cmdarg; p = tm - 1; fbreak; };
|
1461
|
+
fnext *arg_or_cmdarg(cmd_state); p = tm - 1; fbreak; };
|
1457
1462
|
|
1458
1463
|
# See the comment in `expr_fname`.
|
1459
1464
|
operator_fname |
|
@@ -1513,6 +1518,7 @@ class Parser::Lexer
|
|
1513
1518
|
else
|
1514
1519
|
emit(:tLCURLY, '{'.freeze, @te - 1, @te)
|
1515
1520
|
end
|
1521
|
+
@command_start = true
|
1516
1522
|
fnext expr_value; fbreak;
|
1517
1523
|
};
|
1518
1524
|
|
@@ -1673,6 +1679,7 @@ class Parser::Lexer
|
|
1673
1679
|
else
|
1674
1680
|
emit(:tLBRACE_ARG, '{'.freeze)
|
1675
1681
|
end
|
1682
|
+
@command_start = true
|
1676
1683
|
fnext expr_value; fbreak;
|
1677
1684
|
};
|
1678
1685
|
|
@@ -1929,6 +1936,7 @@ class Parser::Lexer
|
|
1929
1936
|
=> {
|
1930
1937
|
if @lambda_stack.last == @paren_nest
|
1931
1938
|
@lambda_stack.pop
|
1939
|
+
@command_start = true
|
1932
1940
|
emit(:tLAMBEG, '{'.freeze)
|
1933
1941
|
else
|
1934
1942
|
emit(:tLBRACE, '{'.freeze)
|
@@ -1961,6 +1969,7 @@ class Parser::Lexer
|
|
1961
1969
|
# if a: Statement if.
|
1962
1970
|
keyword_modifier
|
1963
1971
|
=> { emit_table(KEYWORDS_BEGIN)
|
1972
|
+
@command_start = true
|
1964
1973
|
fnext expr_value; fbreak; };
|
1965
1974
|
|
1966
1975
|
#
|
@@ -1981,7 +1990,7 @@ class Parser::Lexer
|
|
1981
1990
|
if !@static_env.nil? && @static_env.declared?(ident)
|
1982
1991
|
fnext expr_end;
|
1983
1992
|
else
|
1984
|
-
fnext *arg_or_cmdarg;
|
1993
|
+
fnext *arg_or_cmdarg(cmd_state);
|
1985
1994
|
end
|
1986
1995
|
else
|
1987
1996
|
emit(:tLABEL, tok(@ts, @te - 2), @ts, @te - 1)
|
@@ -2150,6 +2159,7 @@ class Parser::Lexer
|
|
2150
2159
|
emit_do
|
2151
2160
|
end
|
2152
2161
|
end
|
2162
|
+
@command_start = true
|
2153
2163
|
|
2154
2164
|
fnext expr_value; fbreak;
|
2155
2165
|
};
|
@@ -2175,6 +2185,7 @@ class Parser::Lexer
|
|
2175
2185
|
# elsif b:c: elsif b(:c)
|
2176
2186
|
keyword_with_value
|
2177
2187
|
=> { emit_table(KEYWORDS)
|
2188
|
+
@command_start = true
|
2178
2189
|
fnext expr_value; fbreak; };
|
2179
2190
|
|
2180
2191
|
keyword_with_mid
|
@@ -2198,7 +2209,7 @@ class Parser::Lexer
|
|
2198
2209
|
emit(:tIDENTIFIER)
|
2199
2210
|
|
2200
2211
|
unless !@static_env.nil? && @static_env.declared?(tok)
|
2201
|
-
fnext *arg_or_cmdarg;
|
2212
|
+
fnext *arg_or_cmdarg(cmd_state);
|
2202
2213
|
end
|
2203
2214
|
else
|
2204
2215
|
emit(:k__ENCODING__, '__ENCODING__'.freeze)
|
@@ -2309,7 +2320,7 @@ class Parser::Lexer
|
|
2309
2320
|
|
2310
2321
|
constant
|
2311
2322
|
=> { emit(:tCONSTANT)
|
2312
|
-
fnext *arg_or_cmdarg; fbreak; };
|
2323
|
+
fnext *arg_or_cmdarg(cmd_state); fbreak; };
|
2313
2324
|
|
2314
2325
|
constant ambiguous_const_suffix
|
2315
2326
|
=> { emit(:tCONSTANT, tok(@ts, tm), @ts, tm)
|
@@ -2423,6 +2434,7 @@ class Parser::Lexer
|
|
2423
2434
|
|
2424
2435
|
';'
|
2425
2436
|
=> { emit(:tSEMI, ';'.freeze)
|
2437
|
+
@command_start = true
|
2426
2438
|
fnext expr_value; fbreak; };
|
2427
2439
|
|
2428
2440
|
'\\' c_line {
|
@@ -2481,7 +2493,7 @@ class Parser::Lexer
|
|
2481
2493
|
=> { p = pe - 3 };
|
2482
2494
|
|
2483
2495
|
c_any
|
2484
|
-
=> { fhold; fgoto expr_value; };
|
2496
|
+
=> { cmd_state = true; fhold; fgoto expr_value; };
|
2485
2497
|
|
2486
2498
|
c_eof => do_eof;
|
2487
2499
|
*|;
|
data/lib/parser/meta.rb
CHANGED
@@ -18,7 +18,7 @@ module Parser
|
|
18
18
|
match_with_lvasgn match_current_line
|
19
19
|
module class sclass def defs undef alias args
|
20
20
|
cbase arg optarg restarg blockarg block_pass kwarg kwoptarg
|
21
|
-
kwrestarg send csend super zsuper yield block
|
21
|
+
kwrestarg kwnilarg send csend super zsuper yield block
|
22
22
|
and not or if when case while until while_post
|
23
23
|
until_post for break next redo return resbody
|
24
24
|
kwbegin begin retry preexe postexe iflipflop eflipflop
|
data/lib/parser/ruby27.y
CHANGED
@@ -1352,6 +1352,10 @@ rule
|
|
1352
1352
|
{
|
1353
1353
|
result = val[0].concat(val[1])
|
1354
1354
|
}
|
1355
|
+
| f_no_kwarg opt_f_block_arg
|
1356
|
+
{
|
1357
|
+
result = val[0].concat(val[1])
|
1358
|
+
}
|
1355
1359
|
| f_block_arg
|
1356
1360
|
{
|
1357
1361
|
result = [ val[0] ]
|
@@ -2092,6 +2096,10 @@ keyword_variable: kNIL
|
|
2092
2096
|
{
|
2093
2097
|
result = val[0].concat(val[1])
|
2094
2098
|
}
|
2099
|
+
| f_no_kwarg opt_f_block_arg
|
2100
|
+
{
|
2101
|
+
result = val[0].concat(val[1])
|
2102
|
+
}
|
2095
2103
|
| f_block_arg
|
2096
2104
|
{
|
2097
2105
|
result = [ val[0] ]
|
@@ -2295,6 +2303,11 @@ keyword_variable: kNIL
|
|
2295
2303
|
|
2296
2304
|
kwrest_mark: tPOW | tDSTAR
|
2297
2305
|
|
2306
|
+
f_no_kwarg: kwrest_mark kNIL
|
2307
|
+
{
|
2308
|
+
result = [ @builder.kwnilarg(val[0], val[1]) ]
|
2309
|
+
}
|
2310
|
+
|
2298
2311
|
f_kwrest: kwrest_mark tIDENTIFIER
|
2299
2312
|
{
|
2300
2313
|
@static_env.declare val[1][0]
|
@@ -281,7 +281,7 @@ module Parser
|
|
281
281
|
def enforce_policy(event)
|
282
282
|
return if @policy[event] == :accept
|
283
283
|
return unless (values = yield)
|
284
|
-
trigger_policy(event, values)
|
284
|
+
trigger_policy(event, **values)
|
285
285
|
end
|
286
286
|
|
287
287
|
POLICY_TO_LEVEL = {warn: :warning, raise: :error}.freeze
|
data/lib/parser/version.rb
CHANGED
data/test/test_parser.rb
CHANGED
@@ -2095,6 +2095,37 @@ class TestParser < Minitest::Test
|
|
2095
2095
|
SINCE_2_0)
|
2096
2096
|
end
|
2097
2097
|
|
2098
|
+
def test_kwnilarg
|
2099
|
+
assert_parses(
|
2100
|
+
s(:def, :f,
|
2101
|
+
s(:args, s(:kwnilarg)),
|
2102
|
+
nil),
|
2103
|
+
%q{def f(**nil); end},
|
2104
|
+
%q{ ~~~~~ expression (args.kwnilarg)
|
2105
|
+
| ~~~ name (args.kwnilarg)},
|
2106
|
+
SINCE_2_7)
|
2107
|
+
|
2108
|
+
assert_parses(
|
2109
|
+
s(:block,
|
2110
|
+
s(:send, nil, :m),
|
2111
|
+
s(:args,
|
2112
|
+
s(:kwnilarg)), nil),
|
2113
|
+
%q{m { |**nil| }},
|
2114
|
+
%q{ ~~~~~ expression (args.kwnilarg)
|
2115
|
+
| ~~~ name (args.kwnilarg)},
|
2116
|
+
SINCE_2_7)
|
2117
|
+
|
2118
|
+
assert_parses(
|
2119
|
+
s(:block,
|
2120
|
+
s(:lambda),
|
2121
|
+
s(:args,
|
2122
|
+
s(:kwnilarg)), nil),
|
2123
|
+
%q{->(**nil) {}},
|
2124
|
+
%q{ ~~~~~ expression (args.kwnilarg)
|
2125
|
+
| ~~~ name (args.kwnilarg)},
|
2126
|
+
SINCE_2_7)
|
2127
|
+
end
|
2128
|
+
|
2098
2129
|
def test_blockarg
|
2099
2130
|
assert_parses(
|
2100
2131
|
s(:def, :f,
|
@@ -7532,4 +7563,17 @@ class TestParser < Minitest::Test
|
|
7532
7563
|
%q{ ^^ location},
|
7533
7564
|
SINCE_2_7)
|
7534
7565
|
end
|
7566
|
+
|
7567
|
+
def test_parser_bug_604
|
7568
|
+
assert_parses(
|
7569
|
+
s(:block,
|
7570
|
+
s(:send, nil, :m,
|
7571
|
+
s(:send,
|
7572
|
+
s(:send, nil, :a), :+,
|
7573
|
+
s(:send, nil, :b))),
|
7574
|
+
s(:args), nil),
|
7575
|
+
%q{m a + b do end},
|
7576
|
+
%q{},
|
7577
|
+
ALL_VERSIONS)
|
7578
|
+
end
|
7535
7579
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.6.4.
|
4
|
+
version: 2.6.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- whitequark
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-
|
11
|
+
date: 2019-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ast
|
@@ -309,7 +309,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
309
309
|
- !ruby/object:Gem::Version
|
310
310
|
version: '0'
|
311
311
|
requirements: []
|
312
|
-
rubygems_version: 3.0.
|
312
|
+
rubygems_version: 3.0.6
|
313
313
|
signing_key:
|
314
314
|
specification_version: 4
|
315
315
|
summary: A Ruby parser written in pure Ruby.
|