parser 2.0.0.beta5 → 2.0.0.beta6

Sign up to get free protection for your applications and to get access to all the features.
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