ruby_parser 3.20.0 → 3.20.3
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
- checksums.yaml.gz.sig +1 -1
- data/History.rdoc +24 -0
- data/compare/normalize.rb +1 -0
- data/lib/ruby20_parser.rb +4266 -4283
- data/lib/ruby20_parser.y +50 -26
- data/lib/ruby21_parser.rb +4240 -4239
- data/lib/ruby21_parser.y +50 -26
- data/lib/ruby22_parser.rb +4288 -4289
- data/lib/ruby22_parser.y +50 -26
- data/lib/ruby23_parser.rb +4273 -4242
- data/lib/ruby23_parser.y +50 -26
- data/lib/ruby24_parser.rb +4278 -4297
- data/lib/ruby24_parser.y +50 -26
- data/lib/ruby25_parser.rb +4269 -4288
- data/lib/ruby25_parser.y +50 -26
- data/lib/ruby26_parser.rb +4269 -4288
- data/lib/ruby26_parser.y +50 -26
- data/lib/ruby27_parser.rb +4172 -4205
- data/lib/ruby27_parser.y +50 -26
- data/lib/ruby30_parser.rb +6028 -5970
- data/lib/ruby30_parser.y +135 -86
- data/lib/ruby31_parser.rb +6194 -6183
- data/lib/ruby31_parser.y +136 -87
- data/lib/ruby32_parser.rb +6290 -6327
- data/lib/ruby32_parser.y +157 -107
- data/lib/ruby3_parser.yy +172 -87
- data/lib/ruby_lexer.rb +15 -7
- data/lib/ruby_lexer.rex.rb +1 -1
- data/lib/ruby_lexer_strings.rb +2 -2
- data/lib/ruby_parser.yy +50 -26
- data/lib/ruby_parser_extras.rb +25 -19
- data/test/test_ruby_parser.rb +195 -7
- data/tools/munge.rb +8 -2
- data/tools/ripper.rb +14 -12
- data.tar.gz.sig +0 -0
- metadata +3 -3
- metadata.gz.sig +0 -0
data/test/test_ruby_parser.rb
CHANGED
@@ -15,11 +15,26 @@ class Sexp
|
|
15
15
|
def == other # :nodoc:
|
16
16
|
if other.class == self.class then
|
17
17
|
super and
|
18
|
-
(line.nil?
|
18
|
+
(line.nil? or other.line.nil? or line == other.line) and
|
19
|
+
(!defined?(@line_max) or @line_max.nil? or line_max == other.line_max)
|
20
|
+
# (line_max.nil? or other.line_max.nil? or line_max == other.line_max)
|
19
21
|
else
|
20
22
|
false
|
21
23
|
end
|
22
24
|
end
|
25
|
+
|
26
|
+
# convenience function just for testing
|
27
|
+
alias dead line_max
|
28
|
+
def line_max n = UNASSIGNED
|
29
|
+
if n != UNASSIGNED then
|
30
|
+
raise ArgumentError, "setting %p.line_max %p" % [self, n] unless Integer === n
|
31
|
+
@line_max = n
|
32
|
+
self
|
33
|
+
else
|
34
|
+
# raise "Accessing before @line_max defined" unless defined?(@line_max)
|
35
|
+
@line_max ||= self.deep_each.map(&:line).compact.max
|
36
|
+
end
|
37
|
+
end
|
23
38
|
end
|
24
39
|
|
25
40
|
module TestRubyParserShared
|
@@ -117,11 +132,13 @@ module TestRubyParserShared
|
|
117
132
|
# for the array. Luckily, the arary elements all seemt to get the correct
|
118
133
|
# line number.
|
119
134
|
rb = "[\n'a',\n'b']\n1"
|
135
|
+
|
120
136
|
pt = s(:block,
|
121
137
|
s(:array,
|
122
138
|
s(:str, "a").line(2),
|
123
|
-
s(:str, "b").line(3)),
|
139
|
+
s(:str, "b").line(3)).line(1),
|
124
140
|
s(:lit, 1).line(4)).line 1
|
141
|
+
|
125
142
|
assert_parse rb, pt
|
126
143
|
end
|
127
144
|
|
@@ -965,7 +982,12 @@ module TestRubyParserShared
|
|
965
982
|
end
|
966
983
|
|
967
984
|
def test_heredoc_with_extra_carriage_horrible_mix?
|
968
|
-
rb =
|
985
|
+
rb = <<~RUBY
|
986
|
+
<<'eot'\r
|
987
|
+
body\r
|
988
|
+
eot
|
989
|
+
RUBY
|
990
|
+
|
969
991
|
pt = s(:str, "body\r\n")
|
970
992
|
|
971
993
|
assert_parse rb, pt
|
@@ -1051,9 +1073,9 @@ module TestRubyParserShared
|
|
1051
1073
|
end
|
1052
1074
|
|
1053
1075
|
def test_i_fucking_hate_line_numbers2
|
1054
|
-
rb =
|
1076
|
+
rb = <<~EOM
|
1055
1077
|
if true then
|
1056
|
-
p(
|
1078
|
+
p("a")
|
1057
1079
|
b = 1
|
1058
1080
|
p b
|
1059
1081
|
c =1
|
@@ -1074,6 +1096,138 @@ module TestRubyParserShared
|
|
1074
1096
|
assert_parse rb, pt
|
1075
1097
|
end
|
1076
1098
|
|
1099
|
+
line_max_array = s(:array,
|
1100
|
+
s(:lit, :line2).line(2),
|
1101
|
+
s(:lit, :line3).line(3)).line(1).line_max(4)
|
1102
|
+
line_max_array_empty = s(:array).line(1).line_max(4)
|
1103
|
+
[
|
1104
|
+
[:plain_array,
|
1105
|
+
"[\n:line2,\n:line3\n]",
|
1106
|
+
line_max_array,
|
1107
|
+
],
|
1108
|
+
[:pct_i,
|
1109
|
+
"%i[\nline2\nline3\n]",
|
1110
|
+
line_max_array,
|
1111
|
+
],
|
1112
|
+
[:pct_i_empty,
|
1113
|
+
"%i[\n\n\n]",
|
1114
|
+
line_max_array_empty,
|
1115
|
+
],
|
1116
|
+
[:pct_I,
|
1117
|
+
"%I[\nline2\nline3\n]",
|
1118
|
+
line_max_array,
|
1119
|
+
],
|
1120
|
+
[:pct_I_empty,
|
1121
|
+
"%I[\n\n\n]",
|
1122
|
+
line_max_array_empty,
|
1123
|
+
],
|
1124
|
+
[:call_parens,
|
1125
|
+
"x(\n:line2,\n:line3\n)",
|
1126
|
+
s(:call, nil, :x, *line_max_array.sexp_body).line(1).line_max(4),
|
1127
|
+
],
|
1128
|
+
[:pct_w,
|
1129
|
+
"%w[\nline2\nline3\n]",
|
1130
|
+
s(:array,
|
1131
|
+
s(:str, "line2").line(2),
|
1132
|
+
s(:str, "line3").line(3)).line(1).line_max(4),
|
1133
|
+
],
|
1134
|
+
[:pct_w_empty,
|
1135
|
+
"%w[\n\n\n]",
|
1136
|
+
line_max_array_empty,
|
1137
|
+
],
|
1138
|
+
[:pct_W,
|
1139
|
+
"%W[\nline2\nline3\n]",
|
1140
|
+
s(:array,
|
1141
|
+
s(:str, "line2").line(2),
|
1142
|
+
s(:str, "line3").line(3)).line(1).line_max(4),
|
1143
|
+
],
|
1144
|
+
[:pct_W_empty,
|
1145
|
+
"%W[\n\n\n]",
|
1146
|
+
line_max_array_empty,
|
1147
|
+
],
|
1148
|
+
[:regexp,
|
1149
|
+
"%r[\n\n\n]", # double-quotes to have the \n counted as lines on input
|
1150
|
+
s(:lit, %r[#{"\n\n\n"}]).line(1).line_max(4),
|
1151
|
+
],
|
1152
|
+
[:module,
|
1153
|
+
<<~"RUBY",
|
1154
|
+
module X # line 1
|
1155
|
+
module Y # line 2
|
1156
|
+
Z = 42 # line 3
|
1157
|
+
end # line 4
|
1158
|
+
end # line 5
|
1159
|
+
RUBY
|
1160
|
+
s(:module, :X,
|
1161
|
+
s(:module, :Y,
|
1162
|
+
s(:cdecl, :Z, s(:lit, 42).line(3)).line(3).line_max(3)
|
1163
|
+
).line(2).line_max(4)
|
1164
|
+
).line(1).line_max(5)],
|
1165
|
+
[:class,
|
1166
|
+
<<~"RUBY",
|
1167
|
+
class X # line 1
|
1168
|
+
class Y # line 2
|
1169
|
+
Z = 42 # line 3
|
1170
|
+
end # line 4
|
1171
|
+
end # line 5
|
1172
|
+
RUBY
|
1173
|
+
s(:class, :X, nil,
|
1174
|
+
s(:class, :Y, nil,
|
1175
|
+
s(:cdecl, :Z, s(:lit, 42).line(3)).line(3).line_max(3)
|
1176
|
+
).line(2).line_max(4)
|
1177
|
+
).line(1).line_max(5)],
|
1178
|
+
[:cdecl,
|
1179
|
+
<<~"RUBY",
|
1180
|
+
module X
|
1181
|
+
X = [
|
1182
|
+
:line3,
|
1183
|
+
:line4,
|
1184
|
+
]
|
1185
|
+
end
|
1186
|
+
RUBY
|
1187
|
+
s(:module, :X,
|
1188
|
+
s(:cdecl, :X,
|
1189
|
+
s(:array,
|
1190
|
+
s(:lit, :line3).line(3),
|
1191
|
+
s(:lit, :line4).line(4)).line(2).line_max(5),
|
1192
|
+
).line(2).line_max(5),
|
1193
|
+
).line(1).line_max(6)
|
1194
|
+
],
|
1195
|
+
[:defn,
|
1196
|
+
<<~"RUBY",
|
1197
|
+
class X # line 1
|
1198
|
+
def y(a, # line 2
|
1199
|
+
b) # line 3
|
1200
|
+
a + b # line 4
|
1201
|
+
end # line 5
|
1202
|
+
end # line 6
|
1203
|
+
RUBY
|
1204
|
+
s(:class, :X, nil,
|
1205
|
+
s(:defn, :y, s(:args, :a, :b).line(2).line_max(3),
|
1206
|
+
s(:call, s(:lvar, :a).line(4), :+, s(:lvar, :b).line(4)).line(4)
|
1207
|
+
).line(2).line_max(5),
|
1208
|
+
).line(1).line_max(6),
|
1209
|
+
],
|
1210
|
+
[:defs,
|
1211
|
+
<<~"RUBY",
|
1212
|
+
class X # line 1
|
1213
|
+
def self.y(a, # line 2
|
1214
|
+
b) # line 3
|
1215
|
+
a + b # line 4
|
1216
|
+
end # line 5
|
1217
|
+
end # line 6
|
1218
|
+
RUBY
|
1219
|
+
s(:class, :X, nil,
|
1220
|
+
s(:defs, s(:self).line(2), :y, s(:args, :a, :b).line(2).line_max(3),
|
1221
|
+
s(:call, s(:lvar, :a).line(4), :+, s(:lvar, :b).line(4)).line(4)
|
1222
|
+
).line(2).line_max(5),
|
1223
|
+
).line(1).line_max(6),
|
1224
|
+
],
|
1225
|
+
].each do |(name, rb, pt)|
|
1226
|
+
define_method "test_line_numbers__max_line__#{name}" do
|
1227
|
+
assert_parse rb, pt
|
1228
|
+
end
|
1229
|
+
end
|
1230
|
+
|
1077
1231
|
def test_if_elsif
|
1078
1232
|
rb = "if 1; elsif 2; end"
|
1079
1233
|
pt = s(:if, s(:lit, 1), nil, s(:if, s(:lit, 2), nil, nil))
|
@@ -5402,6 +5556,14 @@ module TestRubyParserShared31Plus
|
|
5402
5556
|
assert_case_in rb, pt
|
5403
5557
|
end
|
5404
5558
|
|
5559
|
+
def test_defn_forward_args__no_parens
|
5560
|
+
rb = "def f ...\n m(...)\nend"
|
5561
|
+
pt = s(:defn, :f, s(:args, s(:forward_args)),
|
5562
|
+
s(:call, nil, :m, s(:forward_args).line(2)).line(2))
|
5563
|
+
|
5564
|
+
assert_parse rb, pt
|
5565
|
+
end
|
5566
|
+
|
5405
5567
|
def test_case_in_carat_nonlocal_vars
|
5406
5568
|
processor.env[:a] = :lvar
|
5407
5569
|
|
@@ -5480,6 +5642,34 @@ end
|
|
5480
5642
|
|
5481
5643
|
module TestRubyParserShared32Plus
|
5482
5644
|
include TestRubyParserShared31Plus
|
5645
|
+
|
5646
|
+
def test_args_star__anon_solo
|
5647
|
+
rb = "f(*)"
|
5648
|
+
pt = s(:call, nil, :f, s(:splat))
|
5649
|
+
|
5650
|
+
assert_parse rb, pt
|
5651
|
+
end
|
5652
|
+
|
5653
|
+
def test_args_star__anon_trailing
|
5654
|
+
rb = "f(x, *)"
|
5655
|
+
pt = s(:call, nil, :f, s(:call, nil, :x), s(:splat))
|
5656
|
+
|
5657
|
+
assert_parse rb, pt
|
5658
|
+
end
|
5659
|
+
|
5660
|
+
def test_args_dstar__anon_solo
|
5661
|
+
rb = "f(**)"
|
5662
|
+
pt = s(:call, nil, :f, s(:hash, s(:kwsplat))) # TODO double check this
|
5663
|
+
|
5664
|
+
assert_parse rb, pt
|
5665
|
+
end
|
5666
|
+
|
5667
|
+
def test_args_dstar__anon_trailing
|
5668
|
+
rb = "f(x, **)"
|
5669
|
+
pt = s(:call, nil, :f, s(:call, nil, :x), s(:hash, s(:kwsplat))) # TODO double check this
|
5670
|
+
|
5671
|
+
assert_parse rb, pt
|
5672
|
+
end
|
5483
5673
|
end
|
5484
5674
|
|
5485
5675
|
class Minitest::Test
|
@@ -5782,8 +5972,6 @@ class TestRubyParserV26 < RubyParserTestCase
|
|
5782
5972
|
end
|
5783
5973
|
|
5784
5974
|
class TestRubyParserV27 < RubyParserTestCase
|
5785
|
-
make_my_diffs_pretty!
|
5786
|
-
|
5787
5975
|
include TestRubyParserShared27Plus
|
5788
5976
|
|
5789
5977
|
def setup
|
data/tools/munge.rb
CHANGED
@@ -174,6 +174,10 @@ ARGF.each_line do |line|
|
|
174
174
|
last_token = token
|
175
175
|
when /^Reading a token: / then
|
176
176
|
next # skip
|
177
|
+
when /^Reading a token$/ then # wtf?
|
178
|
+
next # skip
|
179
|
+
when /^(?:add_delayed_token|parser_dispatch)/ then # dunno what this is yet
|
180
|
+
next # skip
|
177
181
|
when /^read\s+:(\w+)/ then # read :tNL(tNL) nil
|
178
182
|
token = munge $1
|
179
183
|
next if last_token == token
|
@@ -212,7 +216,9 @@ ARGF.each_line do |line|
|
|
212
216
|
reduce_line = nil
|
213
217
|
stack.clear
|
214
218
|
when /^reduce/ then # ruby_parser side
|
215
|
-
|
219
|
+
s = munge line.chomp
|
220
|
+
next if s =~ /reduce\s+(\w+) --> \1/
|
221
|
+
puts s
|
216
222
|
puts
|
217
223
|
when /^(\w+_stack)\.(\w+)/ then
|
218
224
|
# TODO: make pretty, but still informative w/ line numbers etc
|
@@ -223,7 +229,7 @@ ARGF.each_line do |line|
|
|
223
229
|
# puts line
|
224
230
|
# TODO: make pretty, but still informative w/ line numbers etc
|
225
231
|
puts line.gsub("true", "1").gsub("false", "0")
|
226
|
-
when /^lex_state: :?([\w|]+) -> :?([\w|]+)(?: (?:at|from) (.*))?/ then
|
232
|
+
when /^lex_state: :?([\w|()]+) -> :?([\w|]+)(?: (?:at|from) (.*))?/ then
|
227
233
|
a, b, c = $1.upcase, $2.upcase, $3
|
228
234
|
a.gsub!(/EXPR_/, "")
|
229
235
|
b.gsub!(/EXPR_/, "")
|
data/tools/ripper.rb
CHANGED
@@ -21,18 +21,20 @@ end
|
|
21
21
|
ARGV.each do |path|
|
22
22
|
src = path == "-" ? $stdin.read : File.read(path)
|
23
23
|
|
24
|
-
sexp =
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
24
|
+
sexp = nil
|
25
|
+
|
26
|
+
if $b then
|
27
|
+
sexp = Ripper.sexp src
|
28
|
+
else
|
29
|
+
rip = MySexpBuilder.new src
|
30
|
+
rip.yydebug = $d
|
31
|
+
sexp = rip.parse
|
32
|
+
|
33
|
+
if rip.error? then
|
34
|
+
warn "skipping"
|
35
|
+
next
|
36
|
+
end
|
37
|
+
end
|
36
38
|
|
37
39
|
puts "accept"
|
38
40
|
|
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby_parser
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.20.
|
4
|
+
version: 3.20.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ryan Davis
|
@@ -29,7 +29,7 @@ cert_chain:
|
|
29
29
|
ROfWo9Uyp8ba/j9eVG14KkYRaLydAY1MNQk2yd3R5CGfeOpD1kttxjoypoUJ2dOG
|
30
30
|
nsNBRuQJ1UfiCG97a6DNm+Fr
|
31
31
|
-----END CERTIFICATE-----
|
32
|
-
date: 2023-
|
32
|
+
date: 2023-07-12 00:00:00.000000000 Z
|
33
33
|
dependencies:
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: sexp_processor
|
@@ -245,7 +245,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
245
245
|
- !ruby/object:Gem::Version
|
246
246
|
version: '0'
|
247
247
|
requirements: []
|
248
|
-
rubygems_version: 3.4.
|
248
|
+
rubygems_version: 3.4.10
|
249
249
|
signing_key:
|
250
250
|
specification_version: 4
|
251
251
|
summary: ruby_parser (RP) is a ruby parser written in pure ruby (utilizing racc--which
|
metadata.gz.sig
CHANGED
Binary file
|