parser 2.0.0.beta5 → 2.0.0.beta6

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.
data/lib/parser/lexer.rl CHANGED
@@ -677,7 +677,7 @@ class Parser::Lexer
677
677
  # After every heredoc was parsed, @herebody_s contains the
678
678
  # position of next token after all heredocs.
679
679
  if @herebody_s
680
- p = @herebody_s - 1
680
+ p = @herebody_s
681
681
  @herebody_s = nil
682
682
  end
683
683
  };
@@ -819,9 +819,9 @@ class Parser::Lexer
819
819
  if literal
820
820
  if literal.end_interp_brace_and_try_closing
821
821
  if version?(18, 19)
822
- emit(:tRCURLY, '}')
822
+ emit(:tRCURLY, '}', p - 1, p)
823
823
  else
824
- emit(:tSTRING_DEND, '}')
824
+ emit(:tSTRING_DEND, '}', p - 1, p)
825
825
  end
826
826
 
827
827
  if literal.saved_herebody_s
@@ -1056,7 +1056,7 @@ class Parser::Lexer
1056
1056
 
1057
1057
  global_var
1058
1058
  => { p = @ts - 1
1059
- fcall expr_variable; };
1059
+ fnext expr_end; fcall expr_variable; };
1060
1060
 
1061
1061
  # If the handling was to be delegated to expr_end,
1062
1062
  # these cases would transition to something else than
data/lib/parser/ruby18.y CHANGED
@@ -227,11 +227,11 @@ rule
227
227
  }
228
228
  | kNOT expr
229
229
  {
230
- result = @builder.not_op(val[0], val[1])
230
+ result = @builder.not_op(val[0], nil, val[1], nil)
231
231
  }
232
232
  | tBANG command_call
233
233
  {
234
- result = @builder.not_op(val[0], val[1])
234
+ result = @builder.not_op(val[0], nil, val[1], nil)
235
235
  }
236
236
  | arg
237
237
 
@@ -714,7 +714,7 @@ rule
714
714
  }
715
715
  | tBANG arg
716
716
  {
717
- result = @builder.not_op(val[0], val[1])
717
+ result = @builder.not_op(val[0], nil, val[1], nil)
718
718
  }
719
719
  | tTILDE arg
720
720
  {
@@ -1001,7 +1001,7 @@ rule
1001
1001
  }
1002
1002
  | kBEGIN bodystmt kEND
1003
1003
  {
1004
- result = @builder.begin(val[0], val[1], val[2])
1004
+ result = @builder.begin_keyword(val[0], val[1], val[2])
1005
1005
  }
1006
1006
  | tLPAREN_ARG expr
1007
1007
  {
@@ -1253,6 +1253,9 @@ rule
1253
1253
  | tCOLON
1254
1254
  | kTHEN
1255
1255
  | term kTHEN
1256
+ {
1257
+ result = val[1]
1258
+ }
1256
1259
 
1257
1260
  do: term
1258
1261
  | tCOLON
@@ -1611,7 +1614,7 @@ xstring_contents: # nothing
1611
1614
  @lexer.cond.lexpop
1612
1615
  @lexer.cmdarg.lexpop
1613
1616
 
1614
- result = val[2]
1617
+ result = @builder.begin(val[0], val[2], val[3])
1615
1618
  }
1616
1619
 
1617
1620
  string_dvar: tGVAR
data/lib/parser/ruby19.y CHANGED
@@ -258,11 +258,11 @@ rule
258
258
  }
259
259
  | kNOT opt_nl expr
260
260
  {
261
- result = @builder.not_op(val[0], val[2])
261
+ result = @builder.not_op(val[0], nil, val[2], nil)
262
262
  }
263
263
  | tBANG command_call
264
264
  {
265
- result = @builder.not_op(val[0], val[1])
265
+ result = @builder.not_op(val[0], nil, val[1], nil)
266
266
  }
267
267
  | arg
268
268
 
@@ -777,7 +777,7 @@ rule
777
777
  }
778
778
  | arg tMATCH arg
779
779
  {
780
- result = @builder.binary_op(val[0], val[1], val[2])
780
+ result = @builder.match_op(val[0], val[1], val[2])
781
781
  }
782
782
  | arg tNMATCH arg
783
783
  {
@@ -785,7 +785,7 @@ rule
785
785
  }
786
786
  | tBANG arg
787
787
  {
788
- result = @builder.not_op(val[0], val[1])
788
+ result = @builder.not_op(val[0], nil, val[1], nil)
789
789
  }
790
790
  | tTILDE arg
791
791
  {
@@ -954,7 +954,7 @@ rule
954
954
  }
955
955
  | kBEGIN bodystmt kEND
956
956
  {
957
- result = @builder.begin(val[0], val[1], val[2])
957
+ result = @builder.begin_keyword(val[0], val[1], val[2])
958
958
  }
959
959
  | tLPAREN_ARG expr
960
960
  {
@@ -1007,11 +1007,11 @@ rule
1007
1007
  }
1008
1008
  | kNOT tLPAREN2 expr rparen
1009
1009
  {
1010
- result = @builder.not_op(val[0], val[2])
1010
+ result = @builder.not_op(val[0], val[1], val[2], val[3])
1011
1011
  }
1012
1012
  | kNOT tLPAREN2 rparen
1013
1013
  {
1014
- result = @builder.not_op(val[0])
1014
+ result = @builder.not_op(val[0], val[1], nil, val[2])
1015
1015
  }
1016
1016
  | operation brace_block
1017
1017
  {
@@ -1209,6 +1209,9 @@ rule
1209
1209
  then: term
1210
1210
  | kTHEN
1211
1211
  | term kTHEN
1212
+ {
1213
+ result = val[1]
1214
+ }
1212
1215
 
1213
1216
  do: term
1214
1217
  | kDO_COND
@@ -1727,7 +1730,7 @@ regexp_contents: # nothing
1727
1730
  @lexer.cond.lexpop
1728
1731
  @lexer.cmdarg.lexpop
1729
1732
 
1730
- result = val[2]
1733
+ result = @builder.begin(val[0], val[2], val[3])
1731
1734
  }
1732
1735
 
1733
1736
  string_dvar: tGVAR
data/lib/parser/ruby20.y CHANGED
@@ -269,11 +269,11 @@ rule
269
269
  }
270
270
  | kNOT opt_nl expr
271
271
  {
272
- result = @builder.not_op(val[0], val[2])
272
+ result = @builder.not_op(val[0], nil, val[2], nil)
273
273
  }
274
274
  | tBANG command_call
275
275
  {
276
- result = @builder.not_op(val[0], val[1])
276
+ result = @builder.not_op(val[0], nil, val[1], nil)
277
277
  }
278
278
  | arg
279
279
 
@@ -797,7 +797,7 @@ rule
797
797
  }
798
798
  | arg tMATCH arg
799
799
  {
800
- result = @builder.binary_op(val[0], val[1], val[2])
800
+ result = @builder.match_op(val[0], val[1], val[2])
801
801
  }
802
802
  | arg tNMATCH arg
803
803
  {
@@ -805,7 +805,7 @@ rule
805
805
  }
806
806
  | tBANG arg
807
807
  {
808
- result = @builder.not_op(val[0], val[1])
808
+ result = @builder.not_op(val[0], nil, val[1], nil)
809
809
  }
810
810
  | tTILDE arg
811
811
  {
@@ -983,7 +983,7 @@ rule
983
983
  {
984
984
  @lexer.cmdarg = val[1]
985
985
 
986
- result = @builder.begin(val[0], val[2], val[3])
986
+ result = @builder.begin_keyword(val[0], val[2], val[3])
987
987
  }
988
988
  | tLPAREN_ARG expr
989
989
  {
@@ -1044,11 +1044,11 @@ rule
1044
1044
  }
1045
1045
  | kNOT tLPAREN2 expr rparen
1046
1046
  {
1047
- result = @builder.not_op(val[0], val[2])
1047
+ result = @builder.not_op(val[0], val[1], val[2], val[3])
1048
1048
  }
1049
1049
  | kNOT tLPAREN2 rparen
1050
1050
  {
1051
- result = @builder.not_op(val[0])
1051
+ result = @builder.not_op(val[0], val[1], nil, val[2])
1052
1052
  }
1053
1053
  | fcall brace_block
1054
1054
  {
@@ -1246,6 +1246,9 @@ rule
1246
1246
  then: term
1247
1247
  | kTHEN
1248
1248
  | term kTHEN
1249
+ {
1250
+ result = val[1]
1251
+ }
1249
1252
 
1250
1253
  do: term
1251
1254
  | kDO_COND
@@ -1829,7 +1832,7 @@ regexp_contents: # nothing
1829
1832
  @lexer.cond.lexpop
1830
1833
  @lexer.cmdarg.lexpop
1831
1834
 
1832
- result = val[2]
1835
+ result = @builder.begin(val[0], val[2], val[3])
1833
1836
  }
1834
1837
 
1835
1838
  string_dvar: tGVAR
data/lib/parser/ruby21.y CHANGED
@@ -264,11 +264,11 @@ rule
264
264
  }
265
265
  | kNOT opt_nl expr
266
266
  {
267
- result = @builder.not_op(val[0], val[2])
267
+ result = @builder.not_op(val[0], nil, val[2], nil)
268
268
  }
269
269
  | tBANG command_call
270
270
  {
271
- result = @builder.not_op(val[0], val[1])
271
+ result = @builder.not_op(val[0], nil, val[1], nil)
272
272
  }
273
273
  | arg
274
274
 
@@ -792,7 +792,7 @@ rule
792
792
  }
793
793
  | arg tMATCH arg
794
794
  {
795
- result = @builder.binary_op(val[0], val[1], val[2])
795
+ result = @builder.match_op(val[0], val[1], val[2])
796
796
  }
797
797
  | arg tNMATCH arg
798
798
  {
@@ -800,7 +800,7 @@ rule
800
800
  }
801
801
  | tBANG arg
802
802
  {
803
- result = @builder.not_op(val[0], val[1])
803
+ result = @builder.not_op(val[0], nil, val[1], nil)
804
804
  }
805
805
  | tTILDE arg
806
806
  {
@@ -984,7 +984,7 @@ rule
984
984
  {
985
985
  @lexer.cmdarg = val[1]
986
986
 
987
- result = @builder.begin(val[0], val[2], val[3])
987
+ result = @builder.begin_keyword(val[0], val[2], val[3])
988
988
  }
989
989
  | tLPAREN_ARG expr
990
990
  {
@@ -1045,11 +1045,11 @@ rule
1045
1045
  }
1046
1046
  | kNOT tLPAREN2 expr rparen
1047
1047
  {
1048
- result = @builder.not_op(val[0], val[2])
1048
+ result = @builder.not_op(val[0], val[1], val[2], val[3])
1049
1049
  }
1050
1050
  | kNOT tLPAREN2 rparen
1051
1051
  {
1052
- result = @builder.not_op(val[0])
1052
+ result = @builder.not_op(val[0], val[1], nil, val[2])
1053
1053
  }
1054
1054
  | fcall brace_block
1055
1055
  {
@@ -1247,6 +1247,9 @@ rule
1247
1247
  then: term
1248
1248
  | kTHEN
1249
1249
  | term kTHEN
1250
+ {
1251
+ result = val[1]
1252
+ }
1250
1253
 
1251
1254
  do: term
1252
1255
  | kDO_COND
@@ -1830,7 +1833,7 @@ regexp_contents: # nothing
1830
1833
  @lexer.cond.lexpop
1831
1834
  @lexer.cmdarg.lexpop
1832
1835
 
1833
- result = val[2]
1836
+ result = @builder.begin(val[0], val[2], val[3])
1834
1837
  }
1835
1838
 
1836
1839
  string_dvar: tGVAR
@@ -7,13 +7,9 @@ module Parser
7
7
 
8
8
  class LocationProcessor < Parser::AST::Processor
9
9
  def process(node)
10
- p node
10
+ if node
11
+ p node
11
12
 
12
- if node.src.nil?
13
- puts "\e[31m[no location info]\e[0m"
14
- elsif node.src.expression.nil?
15
- puts "\e[31m[location info present but empty]\e[0m"
16
- else
17
13
  source_line_no = nil
18
14
  source_line = ""
19
15
  hilight_line = ""
@@ -33,7 +29,7 @@ module Parser
33
29
  source_line
34
30
  end
35
31
 
36
- node.src.to_hash.
32
+ node.loc.to_hash.
37
33
  sort_by do |name, range|
38
34
  [(range ? range.line : 0),
39
35
  (name == :expression ? 1 : 0)]
@@ -112,11 +108,11 @@ module Parser
112
108
  end
113
109
 
114
110
  def process_all_input
115
- super
116
-
117
111
  if input_size > 1
118
112
  puts "Using #{@parser_class} to parse #{input_size} files."
119
113
  end
114
+
115
+ super
120
116
  end
121
117
 
122
118
  def process(buffer)
@@ -47,6 +47,8 @@ module Parser
47
47
  end
48
48
 
49
49
  def current_comment_between?(prev_node, next_node)
50
+ return false if current_comment.nil?
51
+
50
52
  comment_loc = current_comment.location
51
53
  next_loc = next_node.location.expression
52
54
 
@@ -1,3 +1,3 @@
1
1
  module Parser
2
- VERSION = '2.0.0.beta5'
2
+ VERSION = '2.0.0.beta6'
3
3
  end
data/parser.gemspec CHANGED
@@ -24,7 +24,7 @@ Gem::Specification.new do |spec|
24
24
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
25
25
  spec.require_paths = ['lib']
26
26
 
27
- spec.add_dependency 'ast', '~> 1.0'
27
+ spec.add_dependency 'ast', '~> 1.1'
28
28
  spec.add_dependency 'slop', '~> 3.4'
29
29
 
30
30
  spec.add_development_dependency 'bundler', '~> 1.2'
data/test/test_lexer.rb CHANGED
@@ -2565,6 +2565,14 @@ class TestLexer < Minitest::Test
2565
2565
  :tNL, nil)
2566
2566
  end
2567
2567
 
2568
+ def test_bug_heredoc_lshft
2569
+ util_lex_token("<<RULES << CLEANINGS\nRULES",
2570
+ :tSTRING_BEG, '"',
2571
+ :tSTRING_END, 'RULES',
2572
+ :tLSHFT, '<<',
2573
+ :tCONSTANT, 'CLEANINGS')
2574
+ end
2575
+
2568
2576
  def test_bug_expr_dot_comment
2569
2577
  util_lex_token("foo. #bar\nbaz",
2570
2578
  :tIDENTIFIER, 'foo',
data/test/test_parser.rb CHANGED
@@ -42,7 +42,7 @@ class TestParser < Minitest::Test
42
42
 
43
43
  def test_empty_stmt
44
44
  assert_parses(
45
- s(:nil),
45
+ nil,
46
46
  %q{})
47
47
  end
48
48
 
@@ -120,11 +120,14 @@ class TestParser < Minitest::Test
120
120
  assert_parses(
121
121
  s(:dstr,
122
122
  s(:str, 'foo'),
123
- s(:lvar, :bar),
123
+ s(:begin, s(:lvar, :bar)),
124
124
  s(:str, 'baz')),
125
125
  %q{"foo#{bar}baz"},
126
126
  %q{^ begin
127
127
  | ^ end
128
+ | ^^ begin (begin)
129
+ | ^ end (begin)
130
+ | ~~~~~~ expression (begin)
128
131
  |~~~~~~~~~~~~~~ expression})
129
132
  end
130
133
 
@@ -181,11 +184,14 @@ class TestParser < Minitest::Test
181
184
  assert_parses(
182
185
  s(:dsym,
183
186
  s(:str, 'foo'),
184
- s(:lvar, :bar),
187
+ s(:begin, s(:lvar, :bar)),
185
188
  s(:str, 'baz')),
186
189
  %q{:"foo#{bar}baz"},
187
190
  %q{^^ begin
188
191
  | ^ end
192
+ | ^^ begin (begin)
193
+ | ^ end (begin)
194
+ | ~~~~~~ expression (begin)
189
195
  |~~~~~~~~~~~~~~~ expression})
190
196
  end
191
197
 
@@ -218,11 +224,14 @@ class TestParser < Minitest::Test
218
224
  assert_parses(
219
225
  s(:xstr,
220
226
  s(:str, 'foo'),
221
- s(:lvar, :bar),
227
+ s(:begin, s(:lvar, :bar)),
222
228
  s(:str, 'baz')),
223
229
  %q{`foo#{bar}baz`},
224
230
  %q{^ begin
225
231
  | ^ end
232
+ | ^^ begin (begin)
233
+ | ^ end (begin)
234
+ | ~~~~~~ expression (begin)
226
235
  |~~~~~~~~~~~~~~ expression})
227
236
  end
228
237
 
@@ -242,11 +251,14 @@ class TestParser < Minitest::Test
242
251
  assert_parses(
243
252
  s(:regexp,
244
253
  s(:str, 'foo'),
245
- s(:lvar, :bar),
254
+ s(:begin, s(:lvar, :bar)),
246
255
  s(:str, 'baz'),
247
256
  s(:regopt)),
248
257
  %q{/foo#{bar}baz/},
249
258
  %q{^ begin
259
+ | ^^ begin (begin)
260
+ | ^ end (begin)
261
+ | ~~~~~~ expression (begin)
250
262
  | ^ end
251
263
  |~~~~~~~~~~~~~~ expression})
252
264
  end
@@ -325,18 +337,24 @@ class TestParser < Minitest::Test
325
337
  assert_parses(
326
338
  s(:array,
327
339
  s(:str, "foo"),
328
- s(:dstr, s(:lvar, :bar))),
340
+ s(:dstr, s(:begin, s(:lvar, :bar)))),
329
341
  %q{%W[foo #{bar}]},
330
342
  %q{^^^ begin
343
+ | ^^ begin (dstr.begin)
344
+ | ^ end (dstr.begin)
345
+ | ~~~~~~ expression (dstr.begin)
331
346
  | ^ end
332
347
  | ~~~ expression (str)
333
- | ~~~ expression (dstr.lvar)
348
+ | ~~~ expression (dstr.begin.lvar)
334
349
  |~~~~~~~~~~~~~~ expression})
335
350
 
336
351
  assert_parses(
337
352
  s(:array,
338
353
  s(:str, "foo"),
339
- s(:dstr, s(:lvar, :bar), s(:str, 'foo'), s(:ivar, :@baz))),
354
+ s(:dstr,
355
+ s(:begin, s(:lvar, :bar)),
356
+ s(:str, 'foo'),
357
+ s(:ivar, :@baz))),
340
358
  %q{%W[foo #{bar}foo#@baz]})
341
359
  end
342
360
 
@@ -368,17 +386,23 @@ class TestParser < Minitest::Test
368
386
  assert_parses(
369
387
  s(:array,
370
388
  s(:sym, :foo),
371
- s(:dsym, s(:lvar, :bar))),
389
+ s(:dsym, s(:begin, s(:lvar, :bar)))),
372
390
  %q{%I[foo #{bar}]},
373
391
  %q{^^^ begin
374
392
  | ^ end
375
393
  | ~~~ expression (sym)
376
- | ~~~ expression (dsym.lvar)
394
+ | ^^ begin (dsym.begin)
395
+ | ^ end (dsym.begin)
396
+ | ~~~~~~ expression (dsym.begin)
397
+ | ~~~ expression (dsym.begin.lvar)
377
398
  |~~~~~~~~~~~~~~ expression},
378
399
  ALL_VERSIONS - %w(1.8 1.9))
379
400
 
380
401
  assert_parses(
381
- s(:array, s(:dsym, s(:str, "foo"), s(:lvar, :bar))),
402
+ s(:array,
403
+ s(:dsym,
404
+ s(:str, "foo"),
405
+ s(:begin, s(:lvar, :bar)))),
382
406
  %q{%I[foo#{bar}]},
383
407
  %q{},
384
408
  ALL_VERSIONS - %w(1.8 1.9))
@@ -1280,11 +1304,11 @@ class TestParser < Minitest::Test
1280
1304
  assert_parses(
1281
1305
  s(:module,
1282
1306
  s(:const, nil, :Foo),
1283
- s(:nil)),
1284
- %q{module Foo; nil; end},
1307
+ nil),
1308
+ %q{module Foo; end},
1285
1309
  %q{~~~~~~ keyword
1286
1310
  | ~~~ name
1287
- | ~~~ end})
1311
+ | ~~~ end})
1288
1312
  end
1289
1313
 
1290
1314
  def test_module_invalid
@@ -1297,20 +1321,20 @@ class TestParser < Minitest::Test
1297
1321
  assert_parses(
1298
1322
  s(:module,
1299
1323
  s(:const, s(:cbase), :Foo),
1300
- s(:nil)),
1301
- %q{module ::Foo; nil; end})
1324
+ nil),
1325
+ %q{module ::Foo; end})
1302
1326
 
1303
1327
  assert_parses(
1304
1328
  s(:module,
1305
1329
  s(:const, s(:const, nil, :Bar), :Foo),
1306
- s(:nil)),
1307
- %q{module Bar::Foo; nil; end})
1330
+ nil),
1331
+ %q{module Bar::Foo; end})
1308
1332
  end
1309
1333
 
1310
1334
  def test_cpath_invalid
1311
1335
  assert_diagnoses(
1312
1336
  [:error, :module_name_const],
1313
- %q{module foo; nil; end})
1337
+ %q{module foo; end})
1314
1338
  end
1315
1339
 
1316
1340
  def test_class
@@ -1318,11 +1342,11 @@ class TestParser < Minitest::Test
1318
1342
  s(:class,
1319
1343
  s(:const, nil, :Foo),
1320
1344
  nil,
1321
- s(:nil)),
1322
- %q{class Foo; nil; end},
1345
+ nil),
1346
+ %q{class Foo; end},
1323
1347
  %q{~~~~~ keyword
1324
1348
  | ~~~ name
1325
- | ~~~ end})
1349
+ | ~~~ end})
1326
1350
  end
1327
1351
 
1328
1352
  def test_class_super
@@ -1330,11 +1354,11 @@ class TestParser < Minitest::Test
1330
1354
  s(:class,
1331
1355
  s(:const, nil, :Foo),
1332
1356
  s(:const, nil, :Bar),
1333
- s(:nil)),
1334
- %q{class Foo < Bar; nil; end},
1357
+ nil),
1358
+ %q{class Foo < Bar; end},
1335
1359
  %q{~~~~~ keyword
1336
1360
  | ^ operator
1337
- | ~~~ end})
1361
+ | ~~~ end})
1338
1362
  end
1339
1363
 
1340
1364
  def test_class_super_label
@@ -1343,7 +1367,7 @@ class TestParser < Minitest::Test
1343
1367
  s(:const, nil, :Foo),
1344
1368
  s(:send, nil, :a,
1345
1369
  s(:sym, :b)),
1346
- s(:nil)),
1370
+ nil),
1347
1371
  %q{class Foo < a:b; end},
1348
1372
  %q{},
1349
1373
  ALL_VERSIONS - %w(1.8 1.9))
@@ -1372,50 +1396,50 @@ class TestParser < Minitest::Test
1372
1396
 
1373
1397
  def test_def
1374
1398
  assert_parses(
1375
- s(:def, :foo, s(:args), s(:nil)),
1376
- %q{def foo; nil; end},
1399
+ s(:def, :foo, s(:args), nil),
1400
+ %q{def foo; end},
1377
1401
  %q{~~~ keyword
1378
1402
  | ~~~ name
1379
- | ~~~ end})
1403
+ | ~~~ end})
1380
1404
 
1381
1405
  assert_parses(
1382
- s(:def, :String, s(:args), s(:nil)),
1406
+ s(:def, :String, s(:args), nil),
1383
1407
  %q{def String; end})
1384
1408
 
1385
1409
  assert_parses(
1386
- s(:def, :String=, s(:args), s(:nil)),
1410
+ s(:def, :String=, s(:args), nil),
1387
1411
  %q{def String=; end})
1388
1412
  end
1389
1413
 
1390
1414
  def test_defs
1391
1415
  assert_parses(
1392
- s(:defs, s(:self), :foo, s(:args), s(:nil)),
1393
- %q{def self.foo; nil; end},
1416
+ s(:defs, s(:self), :foo, s(:args), nil),
1417
+ %q{def self.foo; end},
1394
1418
  %q{~~~ keyword
1395
1419
  | ^ operator
1396
1420
  | ~~~ name
1397
- | ~~~ end})
1421
+ | ~~~ end})
1398
1422
 
1399
1423
  assert_parses(
1400
- s(:defs, s(:self), :foo, s(:args), s(:nil)),
1401
- %q{def self::foo; nil; end},
1424
+ s(:defs, s(:self), :foo, s(:args), nil),
1425
+ %q{def self::foo; end},
1402
1426
  %q{~~~ keyword
1403
1427
  | ^^ operator
1404
1428
  | ~~~ name
1405
- | ~~~ end})
1429
+ | ~~~ end})
1406
1430
 
1407
1431
  assert_parses(
1408
- s(:defs, s(:lvar, :foo), :foo, s(:args), s(:nil)),
1432
+ s(:defs, s(:lvar, :foo), :foo, s(:args), nil),
1409
1433
  %q{def (foo).foo; end})
1410
1434
 
1411
1435
  assert_parses(
1412
1436
  s(:defs, s(:const, nil, :String), :foo,
1413
- s(:args), s(:nil)),
1437
+ s(:args), nil),
1414
1438
  %q{def String.foo; end})
1415
1439
 
1416
1440
  assert_parses(
1417
1441
  s(:defs, s(:const, nil, :String), :foo,
1418
- s(:args), s(:nil)),
1442
+ s(:args), nil),
1419
1443
  %q{def String::foo; end})
1420
1444
  end
1421
1445
 
@@ -1466,7 +1490,7 @@ class TestParser < Minitest::Test
1466
1490
  s(:undef,
1467
1491
  s(:sym, :foo),
1468
1492
  s(:sym, :bar),
1469
- s(:dsym, s(:str, "foo"), s(:int, 1))),
1493
+ s(:dsym, s(:str, "foo"), s(:begin, s(:int, 1)))),
1470
1494
  %q{undef foo, :bar, :"foo#{1}"},
1471
1495
  %q{~~~~~ keyword
1472
1496
  | ~~~ expression (sym/1)
@@ -1862,7 +1886,7 @@ class TestParser < Minitest::Test
1862
1886
  assert_parses(
1863
1887
  s(:block,
1864
1888
  s(:send, nil, :f),
1865
- ast, s(:nil)),
1889
+ ast, nil),
1866
1890
  %Q{f{ #{code} }},
1867
1891
  %q{},
1868
1892
  versions)
@@ -2246,7 +2270,7 @@ class TestParser < Minitest::Test
2246
2270
  assert_parses(
2247
2271
  s(:def, :foo,
2248
2272
  s(:args, s(:arg, :_), s(:arg, :_)),
2249
- s(:nil)),
2273
+ nil),
2250
2274
  %q{def foo(_, _); end},
2251
2275
  %q{},
2252
2276
  ALL_VERSIONS - %w(1.8))
@@ -2260,7 +2284,7 @@ class TestParser < Minitest::Test
2260
2284
  assert_parses(
2261
2285
  s(:def, :foo,
2262
2286
  s(:args, s(:arg, :_a), s(:arg, :_a)),
2263
- s(:nil)),
2287
+ nil),
2264
2288
  %q{def foo(_a, _a); end},
2265
2289
  %q{},
2266
2290
  ALL_VERSIONS - %w(1.8 1.9))
@@ -2336,19 +2360,19 @@ class TestParser < Minitest::Test
2336
2360
 
2337
2361
  def test_send_self_block
2338
2362
  assert_parses(
2339
- s(:block, s(:send, nil, :fun), s(:args), s(:nil)),
2363
+ s(:block, s(:send, nil, :fun), s(:args), nil),
2340
2364
  %q{fun { }})
2341
2365
 
2342
2366
  assert_parses(
2343
- s(:block, s(:send, nil, :fun), s(:args), s(:nil)),
2367
+ s(:block, s(:send, nil, :fun), s(:args), nil),
2344
2368
  %q{fun() { }})
2345
2369
 
2346
2370
  assert_parses(
2347
- s(:block, s(:send, nil, :fun, s(:int, 1)), s(:args), s(:nil)),
2371
+ s(:block, s(:send, nil, :fun, s(:int, 1)), s(:args), nil),
2348
2372
  %q{fun(1) { }})
2349
2373
 
2350
2374
  assert_parses(
2351
- s(:block, s(:send, nil, :fun), s(:args), s(:nil)),
2375
+ s(:block, s(:send, nil, :fun), s(:args), nil),
2352
2376
  %q{fun do end})
2353
2377
  end
2354
2378
 
@@ -2440,7 +2464,7 @@ class TestParser < Minitest::Test
2440
2464
  s(:send,
2441
2465
  s(:block,
2442
2466
  s(:send, nil, :meth, s(:int, 1)),
2443
- s(:args), s(:nil)),
2467
+ s(:args), nil),
2444
2468
  :fun, s(:lvar, :bar)),
2445
2469
  %q{meth 1 do end.fun bar},
2446
2470
  %q{ ~~~ selector
@@ -2451,7 +2475,7 @@ class TestParser < Minitest::Test
2451
2475
  s(:send,
2452
2476
  s(:block,
2453
2477
  s(:send, nil, :meth, s(:int, 1)),
2454
- s(:args), s(:nil)),
2478
+ s(:args), nil),
2455
2479
  :fun, s(:lvar, :bar)),
2456
2480
  %q{meth 1 do end.fun(bar)},
2457
2481
  %q{ ~~~ selector
@@ -2464,7 +2488,7 @@ class TestParser < Minitest::Test
2464
2488
  s(:send,
2465
2489
  s(:block,
2466
2490
  s(:send, nil, :meth, s(:int, 1)),
2467
- s(:args), s(:nil)),
2491
+ s(:args), nil),
2468
2492
  :fun, s(:lvar, :bar)),
2469
2493
  %q{meth 1 do end::fun bar},
2470
2494
  %q{ ~~~ selector
@@ -2475,7 +2499,7 @@ class TestParser < Minitest::Test
2475
2499
  s(:send,
2476
2500
  s(:block,
2477
2501
  s(:send, nil, :meth, s(:int, 1)),
2478
- s(:args), s(:nil)),
2502
+ s(:args), nil),
2479
2503
  :fun, s(:lvar, :bar)),
2480
2504
  %q{meth 1 do end::fun(bar)},
2481
2505
  %q{ ~~~ selector
@@ -2489,9 +2513,9 @@ class TestParser < Minitest::Test
2489
2513
  s(:send,
2490
2514
  s(:block,
2491
2515
  s(:send, nil, :meth, s(:int, 1)),
2492
- s(:args), s(:nil)),
2516
+ s(:args), nil),
2493
2517
  :fun, s(:lvar, :bar)),
2494
- s(:args), s(:nil)),
2518
+ s(:args), nil),
2495
2519
  %q{meth 1 do end.fun bar do end},
2496
2520
  %q{},
2497
2521
  ALL_VERSIONS - %w(1.8 1.9))
@@ -2501,9 +2525,9 @@ class TestParser < Minitest::Test
2501
2525
  s(:send,
2502
2526
  s(:block,
2503
2527
  s(:send, nil, :meth, s(:int, 1)),
2504
- s(:args), s(:nil)),
2528
+ s(:args), nil),
2505
2529
  :fun, s(:lvar, :bar)),
2506
- s(:args), s(:nil)),
2530
+ s(:args), nil),
2507
2531
  %q{meth 1 do end.fun(bar) {}},
2508
2532
  %q{},
2509
2533
  ALL_VERSIONS - %w(1.8 1.9))
@@ -2513,9 +2537,9 @@ class TestParser < Minitest::Test
2513
2537
  s(:send,
2514
2538
  s(:block,
2515
2539
  s(:send, nil, :meth, s(:int, 1)),
2516
- s(:args), s(:nil)),
2540
+ s(:args), nil),
2517
2541
  :fun),
2518
- s(:args), s(:nil)),
2542
+ s(:args), nil),
2519
2543
  %q{meth 1 do end.fun {}},
2520
2544
  %q{},
2521
2545
  ALL_VERSIONS - %w(1.8 1.9))
@@ -2526,7 +2550,7 @@ class TestParser < Minitest::Test
2526
2550
  s(:send, nil, :foo,
2527
2551
  s(:block,
2528
2552
  s(:send, nil, :meth, s(:int, 1)),
2529
- s(:args), s(:nil))),
2553
+ s(:args), nil)),
2530
2554
  %q{foo(meth 1 do end)},
2531
2555
  %q{},
2532
2556
  %w(1.8))
@@ -2536,7 +2560,7 @@ class TestParser < Minitest::Test
2536
2560
  s(:int, 1),
2537
2561
  s(:block,
2538
2562
  s(:send, nil, :meth, s(:int, 1)),
2539
- s(:args), s(:nil))),
2563
+ s(:args), nil)),
2540
2564
  %q{foo(1, meth 1 do end)},
2541
2565
  %q{},
2542
2566
  %w(1.8))
@@ -2710,7 +2734,7 @@ class TestParser < Minitest::Test
2710
2734
  ALL_VERSIONS - %w(1.8))
2711
2735
 
2712
2736
  assert_parses(
2713
- s(:send, s(:nil), :'!'),
2737
+ s(:send, s(:begin), :'!'),
2714
2738
  %q{not()},
2715
2739
  %{},
2716
2740
  ALL_VERSIONS - %w(1.8))
@@ -2803,7 +2827,7 @@ class TestParser < Minitest::Test
2803
2827
  def test_send_lambda
2804
2828
  assert_parses(
2805
2829
  s(:block, s(:send, nil, :lambda),
2806
- s(:args), s(:nil)),
2830
+ s(:args), nil),
2807
2831
  %q{->{ }},
2808
2832
  %q{~~ selector (send)
2809
2833
  | ^ begin
@@ -2813,7 +2837,7 @@ class TestParser < Minitest::Test
2813
2837
 
2814
2838
  assert_parses(
2815
2839
  s(:block, s(:send, nil, :lambda),
2816
- s(:args), s(:nil)),
2840
+ s(:args), nil),
2817
2841
  %q{-> do end},
2818
2842
  %q{~~ selector (send)
2819
2843
  | ^^ begin
@@ -2827,7 +2851,7 @@ class TestParser < Minitest::Test
2827
2851
  s(:block, s(:send, nil, :lambda),
2828
2852
  s(:args,
2829
2853
  s(:arg, :a)),
2830
- s(:nil)),
2854
+ nil),
2831
2855
  %q{->(a) { }},
2832
2856
  %q{~~ selector (send)
2833
2857
  | ^ begin (args)
@@ -2841,7 +2865,7 @@ class TestParser < Minitest::Test
2841
2865
  s(:block, s(:send, nil, :lambda),
2842
2866
  s(:args,
2843
2867
  s(:arg, :a)),
2844
- s(:nil)),
2868
+ nil),
2845
2869
  %q{-> (a) { }},
2846
2870
  %q{},
2847
2871
  ALL_VERSIONS - %w(1.8 1.9))
@@ -2854,7 +2878,7 @@ class TestParser < Minitest::Test
2854
2878
  s(:arg, :a),
2855
2879
  s(:shadowarg, :foo),
2856
2880
  s(:shadowarg, :bar)),
2857
- s(:nil)),
2881
+ nil),
2858
2882
  %q{->(a; foo, bar) { }},
2859
2883
  %q{ ~~~ expression (args.shadowarg)},
2860
2884
  ALL_VERSIONS - %w(1.8))
@@ -2882,6 +2906,32 @@ class TestParser < Minitest::Test
2882
2906
  ALL_VERSIONS - %w(1.8))
2883
2907
  end
2884
2908
 
2909
+ def test_lvar_injecting_match
2910
+ assert_parses(
2911
+ s(:begin,
2912
+ s(:match_with_lvasgn,
2913
+ s(:regexp,
2914
+ s(:str, '(?<match>bar)'),
2915
+ s(:regopt)),
2916
+ s(:str, 'bar')),
2917
+ s(:lvar, :match)),
2918
+ %q{/(?<match>bar)/ =~ 'bar'; match},
2919
+ %q{ ~~ selector (match_with_lvasgn)
2920
+ |~~~~~~~~~~~~~~~~~~~~~~~~ expression (match_with_lvasgn)},
2921
+ ALL_VERSIONS - %w(1.8))
2922
+ end
2923
+
2924
+ def test_non_lvar_injecting_match
2925
+ assert_parses(
2926
+ s(:send,
2927
+ s(:regexp,
2928
+ s(:begin, s(:str, '(?<match>bar)')),
2929
+ s(:regopt)),
2930
+ :=~,
2931
+ s(:str, 'bar')),
2932
+ %q{/#{'(?<match>bar)'}/ =~ 'bar'})
2933
+ end
2934
+
2885
2935
  # To superclass
2886
2936
 
2887
2937
  def test_super
@@ -3105,19 +3155,19 @@ class TestParser < Minitest::Test
3105
3155
  assert_parses(
3106
3156
  s(:block,
3107
3157
  s(:send, nil, :fun, s(:begin, s(:int, 1))),
3108
- s(:args), s(:nil)),
3158
+ s(:args), nil),
3109
3159
  %q{fun (1) {}})
3110
3160
 
3111
3161
  assert_parses(
3112
3162
  s(:block,
3113
3163
  s(:send, s(:lvar, :foo), :fun, s(:begin, s(:int, 1))),
3114
- s(:args), s(:nil)),
3164
+ s(:args), nil),
3115
3165
  %q{foo.fun (1) {}})
3116
3166
 
3117
3167
  assert_parses(
3118
3168
  s(:block,
3119
3169
  s(:send, s(:lvar, :foo), :fun, s(:begin, s(:int, 1))),
3120
- s(:args), s(:nil)),
3170
+ s(:args), nil),
3121
3171
  %q{foo::fun (1) {}})
3122
3172
  end
3123
3173
 
@@ -3342,7 +3392,7 @@ class TestParser < Minitest::Test
3342
3392
  assert_parses(
3343
3393
  s(:block,
3344
3394
  s(:send, nil, :fun),
3345
- s(:args), s(:nil)),
3395
+ s(:args), nil),
3346
3396
  %q{fun () {}},
3347
3397
  %q{ ^ begin (send)
3348
3398
  | ^ end (send)},
@@ -3351,7 +3401,7 @@ class TestParser < Minitest::Test
3351
3401
  assert_parses(
3352
3402
  s(:block,
3353
3403
  s(:send, s(:lvar, :foo), :fun),
3354
- s(:args), s(:nil)),
3404
+ s(:args), nil),
3355
3405
  %q{foo.fun () {}},
3356
3406
  %q{ ^ begin (send)
3357
3407
  | ^ end (send)},
@@ -3360,7 +3410,7 @@ class TestParser < Minitest::Test
3360
3410
  assert_parses(
3361
3411
  s(:block,
3362
3412
  s(:send, s(:lvar, :foo), :fun),
3363
- s(:args), s(:nil)),
3413
+ s(:args), nil),
3364
3414
  %q{foo::fun () {}},
3365
3415
  %q{ ^ begin (send)
3366
3416
  | ^ end (send)},
@@ -3369,10 +3419,10 @@ class TestParser < Minitest::Test
3369
3419
  assert_parses(
3370
3420
  s(:block,
3371
3421
  s(:send, nil, :fun,
3372
- s(:nil)),
3373
- s(:args), s(:nil)),
3422
+ s(:begin)),
3423
+ s(:args), nil),
3374
3424
  %q{fun () {}},
3375
- %q{ ~~ expression (send.nil)},
3425
+ %q{ ~~ expression (send.begin)},
3376
3426
  ALL_VERSIONS - %w(1.8 1.9))
3377
3427
  end
3378
3428
 
@@ -3410,13 +3460,23 @@ class TestParser < Minitest::Test
3410
3460
  |~~~~~~~~~~ expression})
3411
3461
  end
3412
3462
 
3413
- def test_and_or_masgn_invalid
3414
- assert_diagnoses(
3415
- [:error, :masgn_as_condition],
3463
+ def test_and_or_masgn
3464
+ assert_parses(
3465
+ s(:and,
3466
+ s(:lvar, :foo),
3467
+ s(:begin,
3468
+ s(:masgn,
3469
+ s(:mlhs, s(:lvasgn, :a), s(:lvasgn, :b)),
3470
+ s(:lvar, :bar)))),
3416
3471
  %q{foo && (a, b = bar)})
3417
3472
 
3418
- assert_diagnoses(
3419
- [:error, :masgn_as_condition],
3473
+ assert_parses(
3474
+ s(:or,
3475
+ s(:lvar, :foo),
3476
+ s(:begin,
3477
+ s(:masgn,
3478
+ s(:mlhs, s(:lvasgn, :a), s(:lvasgn, :b)),
3479
+ s(:lvar, :bar)))),
3420
3480
  %q{foo || (a, b = bar)})
3421
3481
  end
3422
3482
 
@@ -3439,6 +3499,13 @@ class TestParser < Minitest::Test
3439
3499
  |~~~~~~~~~~~~~~~~ expression})
3440
3500
  end
3441
3501
 
3502
+ def test_if_nl_then
3503
+ assert_parses(
3504
+ s(:if, s(:lvar, :foo), s(:lvar, :bar), nil),
3505
+ %Q{if foo\nthen bar end},
3506
+ %q{ ~~~~ begin})
3507
+ end
3508
+
3442
3509
  def test_if_mod
3443
3510
  assert_parses(
3444
3511
  s(:if, s(:lvar, :foo), s(:lvar, :bar), nil),
@@ -3554,10 +3621,56 @@ class TestParser < Minitest::Test
3554
3621
  end
3555
3622
 
3556
3623
  def test_cond_begin_masgn
3624
+ assert_parses(
3625
+ s(:if,
3626
+ s(:begin,
3627
+ s(:lvar, :bar),
3628
+ s(:masgn,
3629
+ s(:mlhs, s(:lvasgn, :a), s(:lvasgn, :b)),
3630
+ s(:lvar, :foo))),
3631
+ nil, nil),
3632
+ %q{if (bar; a, b = foo); end})
3633
+ end
3634
+
3635
+ def test_cond_begin_and_or_masgn
3557
3636
  assert_diagnoses(
3558
3637
  [:error, :masgn_as_condition],
3559
- %q{if (bar; a, b = foo); end},
3560
- %q{ ~~~~~~~~~~ location})
3638
+ %q{if foo && (a, b = bar); end},
3639
+ %q{ ~~~~~~~~~~ location})
3640
+
3641
+ assert_diagnoses(
3642
+ [:error, :masgn_as_condition],
3643
+ %q{if foo || (a, b = bar); end},
3644
+ %q{ ~~~~~~~~~~ location})
3645
+ end
3646
+
3647
+ def test_cond_iflipflop
3648
+ assert_parses(
3649
+ s(:if, s(:iflipflop, s(:lvar, :foo), s(:lvar, :bar)),
3650
+ nil, nil),
3651
+ %q{if foo..bar; end},
3652
+ %q{ ~~~~~~~~ expression (iflipflop)
3653
+ | ~~ operator (iflipflop)})
3654
+ end
3655
+
3656
+ def test_cond_eflipflop
3657
+ assert_parses(
3658
+ s(:if, s(:eflipflop, s(:lvar, :foo), s(:lvar, :bar)),
3659
+ nil, nil),
3660
+ %q{if foo...bar; end},
3661
+ %q{ ~~~~~~~~~ expression (eflipflop)
3662
+ | ~~~ operator (eflipflop)})
3663
+ end
3664
+
3665
+ def test_cond_match_current_line
3666
+ assert_parses(
3667
+ s(:if,
3668
+ s(:match_current_line,
3669
+ s(:regexp,
3670
+ s(:str, 'wat'),
3671
+ s(:regopt))),
3672
+ nil, nil),
3673
+ %q{if /wat/; end})
3561
3674
  end
3562
3675
 
3563
3676
  # Case matching
@@ -3659,7 +3772,7 @@ class TestParser < Minitest::Test
3659
3772
  s(:lvar, :bar)),
3660
3773
  s(:when,
3661
3774
  s(:splat, s(:lvar, :foo)),
3662
- s(:nil)),
3775
+ nil),
3663
3776
  nil),
3664
3777
  %q{case foo; when 1, *baz; bar; when *foo; end},
3665
3778
  %q{ ^ operator (when/1.splat)
@@ -3803,7 +3916,7 @@ class TestParser < Minitest::Test
3803
3916
  |~~~~~~~~~ expression})
3804
3917
 
3805
3918
  assert_parses(
3806
- s(:break, s(:nil)),
3919
+ s(:break, s(:begin)),
3807
3920
  %q{break()},
3808
3921
  %q{~~~~~ keyword
3809
3922
  |~~~~~~~ expression},
@@ -3838,7 +3951,7 @@ class TestParser < Minitest::Test
3838
3951
  |~~~~~~~~~~ expression})
3839
3952
 
3840
3953
  assert_parses(
3841
- s(:return, s(:nil)),
3954
+ s(:return, s(:begin)),
3842
3955
  %q{return()},
3843
3956
  %q{~~~~~~ keyword
3844
3957
  |~~~~~~~~ expression},
@@ -3873,7 +3986,7 @@ class TestParser < Minitest::Test
3873
3986
  |~~~~~~~~ expression})
3874
3987
 
3875
3988
  assert_parses(
3876
- s(:next, s(:nil)),
3989
+ s(:next, s(:begin)),
3877
3990
  %q{next()},
3878
3991
  %q{~~~~ keyword
3879
3992
  |~~~~~~ expression},
@@ -3945,8 +4058,7 @@ class TestParser < Minitest::Test
3945
4058
  def test_ensure_empty
3946
4059
  assert_parses(
3947
4060
  s(:begin,
3948
- s(:ensure, s(:nil),
3949
- s(:nil))),
4061
+ s(:ensure, nil, nil)),
3950
4062
  %q{begin ensure end},
3951
4063
  %q{~~~~~ begin
3952
4064
  | ~~~~~~ keyword (ensure)
@@ -4280,23 +4392,23 @@ class TestParser < Minitest::Test
4280
4392
  s(:block,
4281
4393
  s(:send, nil, :desc,
4282
4394
  s(:str, "foo")),
4283
- s(:args), s(:nil)),
4395
+ s(:args), nil),
4284
4396
  %q{desc "foo" do end})
4285
4397
  end
4286
4398
 
4287
4399
  def test_bug_interp_single
4288
4400
  assert_parses(
4289
- s(:dstr, s(:int, 1)),
4401
+ s(:dstr, s(:begin, s(:int, 1))),
4290
4402
  %q{"#{1}"})
4291
4403
 
4292
4404
  assert_parses(
4293
- s(:array, s(:dstr, s(:int, 1))),
4405
+ s(:array, s(:dstr, s(:begin, s(:int, 1)))),
4294
4406
  %q{%W"#{1}"})
4295
4407
  end
4296
4408
 
4297
4409
  def test_bug_def_no_paren_eql_begin
4298
4410
  assert_parses(
4299
- s(:def, :foo, s(:args), s(:nil)),
4411
+ s(:def, :foo, s(:args), nil),
4300
4412
  %Q{def foo\n=begin\n=end\nend})
4301
4413
  end
4302
4414
  end