parser 0.9.alpha1 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +4 -3
  3. data/AST_FORMAT.md +1338 -0
  4. data/README.md +58 -3
  5. data/Rakefile +32 -12
  6. data/bin/benchmark +47 -0
  7. data/bin/explain-parse +14 -0
  8. data/bin/parse +6 -0
  9. data/lib/parser.rb +84 -0
  10. data/lib/parser/all.rb +2 -0
  11. data/lib/parser/ast/node.rb +11 -0
  12. data/lib/parser/ast/processor.rb +8 -0
  13. data/lib/parser/base.rb +116 -0
  14. data/lib/parser/builders/default.rb +654 -0
  15. data/lib/parser/compatibility/ruby1_8.rb +13 -0
  16. data/lib/parser/diagnostic.rb +44 -0
  17. data/lib/parser/diagnostic/engine.rb +44 -0
  18. data/lib/parser/lexer.rl +335 -245
  19. data/lib/parser/lexer/explanation.rb +37 -0
  20. data/lib/parser/{lexer_literal.rb → lexer/literal.rb} +22 -12
  21. data/lib/parser/lexer/stack_state.rb +38 -0
  22. data/lib/parser/ruby18.y +1957 -0
  23. data/lib/parser/ruby19.y +2154 -0
  24. data/lib/parser/source/buffer.rb +78 -0
  25. data/lib/parser/source/map.rb +20 -0
  26. data/lib/parser/source/map/operator.rb +15 -0
  27. data/lib/parser/source/map/variable_assignment.rb +15 -0
  28. data/lib/parser/source/range.rb +66 -0
  29. data/lib/parser/static_environment.rb +12 -6
  30. data/parser.gemspec +23 -13
  31. data/test/helper.rb +45 -0
  32. data/test/parse_helper.rb +204 -0
  33. data/test/racc_coverage_helper.rb +130 -0
  34. data/test/test_diagnostic.rb +47 -0
  35. data/test/test_diagnostic_engine.rb +58 -0
  36. data/test/test_lexer.rb +601 -357
  37. data/test/test_lexer_stack_state.rb +69 -0
  38. data/test/test_parse_helper.rb +74 -0
  39. data/test/test_parser.rb +3654 -0
  40. data/test/test_source_buffer.rb +80 -0
  41. data/test/test_source_range.rb +51 -0
  42. data/test/test_static_environment.rb +1 -4
  43. metadata +137 -12
@@ -0,0 +1,69 @@
1
+ require 'helper'
2
+
3
+ class TestLexerStackState < MiniTest::Unit::TestCase
4
+ def setup
5
+ @state = Parser::Lexer::StackState.new('state')
6
+ end
7
+
8
+ def test_push
9
+ refute @state.active?
10
+
11
+ assert_equal true, @state.push(true)
12
+ assert @state.active?
13
+
14
+ assert_equal false, @state.push(false)
15
+ refute @state.active?
16
+ end
17
+
18
+ def test_pop
19
+ @state.push(true)
20
+
21
+ assert_equal true, @state.pop
22
+ refute @state.active?
23
+ end
24
+
25
+ def test_pop_empty
26
+ assert_equal false, @state.pop
27
+ refute @state.active?
28
+ end
29
+
30
+ def test_lexpop_10
31
+ @state.push(true)
32
+ @state.push(false)
33
+
34
+ assert_equal true, @state.lexpop
35
+ assert_equal true, @state.pop
36
+ end
37
+
38
+ def test_lexpop_01
39
+ @state.push(false)
40
+ @state.push(true)
41
+
42
+ assert_equal true, @state.lexpop
43
+ assert_equal true, @state.pop
44
+ end
45
+
46
+ def test_lexpop_00
47
+ @state.push(false)
48
+ @state.push(false)
49
+
50
+ assert_equal false, @state.lexpop
51
+ assert_equal false, @state.pop
52
+ end
53
+
54
+ def test_dup
55
+ @state.push(true)
56
+ new_state = @state.dup
57
+
58
+ assert_equal true, @state.pop
59
+ assert_equal true, new_state.pop
60
+ end
61
+
62
+ def test_to_s
63
+ @state.push(true)
64
+ @state.push(false)
65
+ @state.push(false)
66
+
67
+ assert_equal '[100 <= state]', @state.to_s
68
+ end
69
+ end
@@ -0,0 +1,74 @@
1
+ require 'helper'
2
+ require 'parse_helper'
3
+
4
+ class TestParseHelper < MiniTest::Unit::TestCase
5
+ include ParseHelper
6
+
7
+ def test_parser_for_ruby_version
8
+ assert_instance_of Parser::Ruby18,
9
+ parser_for_ruby_version('1.8')
10
+
11
+ assert_instance_of Parser::Ruby19,
12
+ parser_for_ruby_version('1.9')
13
+
14
+ # assert_instance_of Parser::Ruby20,
15
+ # parser_for_ruby_version('2.0')
16
+ end
17
+
18
+ def parse_maps(what)
19
+ parse_source_map_descriptions(what).to_a
20
+ end
21
+
22
+ def test_parse_mapsation_description
23
+ assert_equal [[0, 3, 'expr', [], '~~~~ expr']],
24
+ parse_maps('~~~~ expr')
25
+
26
+ assert_equal [[0, 3, 'expr', [], '^~~~ expr']],
27
+ parse_maps('^~~~ expr')
28
+
29
+ assert_equal [[0, 3, 'expr', [], '^^^^ expr']],
30
+ parse_maps('^^^^ expr')
31
+
32
+ assert_equal [[2, 2, 'op', [], ' ^ op']],
33
+ parse_maps(' ^ op')
34
+
35
+ assert_equal [[2, 2, 'op', ['foo'], ' ~ op (foo)']],
36
+ parse_maps(' ~ op (foo)')
37
+
38
+ assert_equal [[2, 3, 'op', ['foo', 'bar'], ' ~~ op (foo.bar)']],
39
+ parse_maps(' ~~ op (foo.bar)')
40
+
41
+ assert_equal [[2, 3, 'op', ['foo/2', 'bar'], ' ~~ op (foo/2.bar)']],
42
+ parse_maps(' ~~ op (foo/2.bar)')
43
+
44
+ assert_equal [[0, 3, 'expr', [], '~~~~ expr'],
45
+ [5, 6, 'op', ['str', 'e_h'], ' ~~ op (str.e_h)']],
46
+ parse_maps(%{
47
+ |~~~~ expr
48
+ | ~~ op (str.e_h)
49
+ })
50
+ end
51
+
52
+ def test_traverse_ast
53
+ ast = s(:send,
54
+ s(:int, 1), :+,
55
+ s(:dstr,
56
+ s(:str, "foo"),
57
+ s(:int, 2),
58
+ s(:int, 3)))
59
+
60
+ assert_equal ast, traverse_ast(ast, %w())
61
+
62
+ assert_equal s(:int, 1), traverse_ast(ast, %w(int))
63
+ assert_equal nil, traverse_ast(ast, %w(str))
64
+
65
+ assert_equal s(:str, "foo"), traverse_ast(ast, %w(dstr str))
66
+ assert_equal s(:int, 2), traverse_ast(ast, %w(dstr int/1))
67
+ assert_equal s(:int, 3), traverse_ast(ast, %w(dstr int/2))
68
+ assert_equal nil, traverse_ast(ast, %w(dstr int/3))
69
+ end
70
+
71
+ def test_assert_parses
72
+ # Someone more clever and/or motivated than me is going to test this.
73
+ end
74
+ end
@@ -0,0 +1,3654 @@
1
+ require 'helper'
2
+ require 'parse_helper'
3
+
4
+ class TestParser < MiniTest::Unit::TestCase
5
+ include ParseHelper
6
+
7
+ def parser_for_ruby_version(version)
8
+ parser = super
9
+ parser.diagnostics.all_errors_are_fatal = true
10
+
11
+ %w(foo bar baz).each do |metasyntactic_var|
12
+ parser.static_env.declare(metasyntactic_var)
13
+ end
14
+
15
+ parser
16
+ end
17
+
18
+ # Guidelines for test naming:
19
+ # * Test structure follows structure of AST_FORMAT.md.
20
+ # * Test names follow node names.
21
+ # * Structurally similar sources may be grouped into one test.
22
+ # * If, following the guidelines above, names clash, append
23
+ # an abbreviated disambiguator. E.g. `test_class` and
24
+ # `test_class_super`.
25
+ # * When writing a test for a bug, append unabbreviated (but
26
+ # concise) bug description. E.g. `test_class_bug_missing_newline`.
27
+ # * Do not append Ruby language version to the name.
28
+ # * When in doubt, look at existing test names.
29
+ #
30
+ # Guidelines for writing assertions:
31
+ # * Don't check for structurally same source mapping information
32
+ # more than once or twice in the entire file. It clutters the
33
+ # source for no reason.
34
+ # * Don't forget to check for optional delimiters. `()`, `then`, etc.
35
+ # * When in doubt, look at existing assertions.
36
+
37
+ #
38
+ # Literals
39
+ #
40
+
41
+ def test_empty_stmt
42
+ assert_parses(
43
+ s(:nil),
44
+ %q{})
45
+ end
46
+
47
+ def test_nil
48
+ assert_parses(
49
+ s(:nil),
50
+ %q{nil},
51
+ %q{~~~ expression})
52
+ end
53
+
54
+ def test_true
55
+ assert_parses(
56
+ s(:true),
57
+ %q{true},
58
+ %q{~~~~ expression})
59
+ end
60
+
61
+ def test_false
62
+ assert_parses(
63
+ s(:false),
64
+ %q{false},
65
+ %q{~~~~~ expression})
66
+ end
67
+
68
+ def test_int
69
+ assert_parses(
70
+ s(:int, 42),
71
+ %q{42},
72
+ %q{~~ expression})
73
+
74
+ assert_parses(
75
+ s(:int, -42),
76
+ %q{-42},
77
+ %q{~~~ expression})
78
+ end
79
+
80
+ def test_int___LINE__
81
+ assert_parses(
82
+ s(:int, 1),
83
+ %q{__LINE__},
84
+ %q{~~~~~~~~ expression})
85
+ end
86
+
87
+ def test_float
88
+ assert_parses(
89
+ s(:float, 1.33),
90
+ %q{1.33},
91
+ %q{~~~~ expression})
92
+
93
+ assert_parses(
94
+ s(:float, -1.33),
95
+ %q{-1.33},
96
+ %q{~~~~~ expression})
97
+ end
98
+
99
+ # Strings
100
+
101
+ def test_string_plain
102
+ assert_parses(
103
+ s(:str, 'foobar'),
104
+ %q{'foobar'},
105
+ %q{^ begin
106
+ | ^ end
107
+ |~~~~~~~~ expression})
108
+ end
109
+
110
+ def test_string_interp
111
+ assert_parses(
112
+ s(:dstr,
113
+ s(:str, 'foo'),
114
+ s(:lvar, :bar),
115
+ s(:str, 'baz')),
116
+ %q{"foo#{bar}baz"},
117
+ %q{^ begin
118
+ | ^ end
119
+ |~~~~~~~~~~~~~~ expression})
120
+ end
121
+
122
+ def test_string_dvar
123
+ assert_parses(
124
+ s(:dstr,
125
+ s(:ivar, :@a),
126
+ s(:str, ' '),
127
+ s(:cvar, :@@a),
128
+ s(:str, ' '),
129
+ s(:gvar, :$a)),
130
+ %q{"#@a #@@a #$a"})
131
+ end
132
+
133
+ def test_string_concat
134
+ assert_parses(
135
+ s(:dstr,
136
+ s(:dstr,
137
+ s(:str, 'foo'),
138
+ s(:ivar, :@a)),
139
+ s(:str, 'bar')),
140
+ %q{"foo#@a" "bar"},
141
+ %q{^ begin
142
+ |^ begin (dstr)
143
+ | ^ end (dstr)
144
+ | ^ begin (str)
145
+ | ^ end (str)
146
+ | ^ end
147
+ |~~~~~~~~~~~~~~ expression})
148
+ end
149
+
150
+ def test_string___FILE__
151
+ assert_parses(
152
+ s(:str, '(assert_parses)'),
153
+ %q{__FILE__},
154
+ %q{~~~~~~~~ expression})
155
+ end
156
+
157
+ # Symbols
158
+
159
+ def test_symbol_plain
160
+ assert_parses(
161
+ s(:sym, :foo),
162
+ %q{:foo},
163
+ %q{~~~~ expression})
164
+
165
+ assert_parses(
166
+ s(:sym, :foo),
167
+ %q{:'foo'},
168
+ %q{ ^ begin
169
+ | ^ end
170
+ |~~~~~~ expression})
171
+ end
172
+
173
+ def test_symbol_interp
174
+ assert_parses(
175
+ s(:dsym,
176
+ s(:str, 'foo'),
177
+ s(:lvar, :bar),
178
+ s(:str, 'baz')),
179
+ %q{:"foo#{bar}baz"},
180
+ %q{ ^ begin
181
+ | ^ end
182
+ | ~~~~~~~~~~~~~~ expression})
183
+ end
184
+
185
+ def test_symbol_empty
186
+ assert_diagnoses(
187
+ [:error, :empty_symbol],
188
+ %q{:''},
189
+ %q{^^^ location},
190
+ %w(1.8))
191
+
192
+ assert_diagnoses(
193
+ [:error, :empty_symbol],
194
+ %q{:""},
195
+ %q{^^^ location},
196
+ %w(1.8))
197
+ end
198
+
199
+ # Execute-strings
200
+
201
+ def test_xstring_plain
202
+ assert_parses(
203
+ s(:xstr, s(:str, 'foobar')),
204
+ %q{`foobar`},
205
+ %q{^ begin
206
+ | ^ end
207
+ |~~~~~~~~ expression})
208
+ end
209
+
210
+ def test_xstring_interp
211
+ assert_parses(
212
+ s(:xstr,
213
+ s(:str, 'foo'),
214
+ s(:lvar, :bar),
215
+ s(:str, 'baz')),
216
+ %q{`foo#{bar}baz`},
217
+ %q{^ begin
218
+ | ^ end
219
+ |~~~~~~~~~~~~~~ expression})
220
+ end
221
+
222
+ # Regexp
223
+
224
+ def test_regex_plain
225
+ assert_parses(
226
+ s(:regexp, s(:str, 'source'), s(:regopt, :i, :m)),
227
+ %q{/source/im},
228
+ %q{^ begin
229
+ | ^ end
230
+ | ~~ expression (regopt)
231
+ |~~~~~~~~~~ expression})
232
+ end
233
+
234
+ def test_regex_interp
235
+ assert_parses(
236
+ s(:regexp,
237
+ s(:str, 'foo'),
238
+ s(:lvar, :bar),
239
+ s(:str, 'baz'),
240
+ s(:regopt)),
241
+ %q{/foo#{bar}baz/},
242
+ %q{^ begin
243
+ | ^ end
244
+ |~~~~~~~~~~~~~~ expression})
245
+ end
246
+
247
+ # Arrays
248
+
249
+ def test_array_plain
250
+ assert_parses(
251
+ s(:array, s(:int, 1), s(:int, 2)),
252
+ %q{[1, 2]},
253
+ %q{^ begin
254
+ | ^ end
255
+ |~~~~~~ expression})
256
+ end
257
+
258
+ def test_array_splat
259
+ assert_parses(
260
+ s(:array,
261
+ s(:int, 1),
262
+ s(:splat, s(:lvar, :foo)),
263
+ s(:int, 2)),
264
+ %q{[1, *foo, 2]},
265
+ %q{^ begin
266
+ | ^ end
267
+ | ^ operator (splat)
268
+ | ~~~~ expression (splat)
269
+ |~~~~~~~~~~~~ expression},
270
+ ALL_VERSIONS - %w(1.8))
271
+
272
+ assert_parses(
273
+ s(:array,
274
+ s(:int, 1),
275
+ s(:splat, s(:lvar, :foo))),
276
+ %q{[1, *foo]},
277
+ %q{^ begin
278
+ | ^ end
279
+ | ^ operator (splat)
280
+ | ~~~~ expression (splat)
281
+ |~~~~~~~~~ expression})
282
+
283
+ assert_parses(
284
+ s(:array,
285
+ s(:splat, s(:lvar, :foo))),
286
+ %q{[*foo]})
287
+ end
288
+
289
+ def test_array_assocs
290
+ assert_parses(
291
+ s(:array,
292
+ s(:hash, s(:pair, s(:int, 1), s(:int, 2)))),
293
+ %q{[ 1 => 2 ]},
294
+ %q{ ~~ operator (hash.pair)
295
+ | ~~~~~~ expression (hash.pair)
296
+ | ~~~~~~ expression (hash)})
297
+
298
+ assert_parses(
299
+ s(:array,
300
+ s(:int, 1),
301
+ s(:hash, s(:pair, s(:int, 2), s(:int, 3)))),
302
+ %q{[ 1, 2 => 3 ]},
303
+ %q{},
304
+ ALL_VERSIONS - %w(1.8))
305
+ end
306
+
307
+ def test_array_words
308
+ assert_parses(
309
+ s(:array, s(:str, "foo"), s(:str, "bar")),
310
+ %q{%w[foo bar]},
311
+ %q{^^^ begin
312
+ | ^ end
313
+ | ~~~ expression (str)
314
+ |~~~~~~~~~~~ expression})
315
+ end
316
+
317
+ def test_array_words_interp
318
+ assert_parses(
319
+ s(:array, s(:str, "foo"), s(:lvar, :bar)),
320
+ %q{%W[foo #{bar}]},
321
+ %q{^^^ begin
322
+ | ^ end
323
+ | ~~~ expression (str)
324
+ | ~~~ expression (lvar)
325
+ |~~~~~~~~~~~~~~ expression})
326
+ end
327
+
328
+ def test_array_words_empty
329
+ assert_parses(
330
+ s(:array),
331
+ %q{%w[]},
332
+ %q{^^^ begin
333
+ | ^ end
334
+ |~~~~ expression})
335
+
336
+ assert_parses(
337
+ s(:array),
338
+ %q{%W()})
339
+ end
340
+
341
+ # Hashes
342
+
343
+ def test_hash_empty
344
+ assert_parses(
345
+ s(:hash),
346
+ %q[{ }],
347
+ %q{^ begin
348
+ | ^ end
349
+ |~~~ expression})
350
+ end
351
+
352
+ def test_hash_hashrocket
353
+ assert_parses(
354
+ s(:hash, s(:pair, s(:int, 1), s(:int, 2))),
355
+ %q[{ 1 => 2 }],
356
+ %q{^ begin
357
+ | ^ end
358
+ | ^^ operator (pair)
359
+ | ~~~~~~ expression (pair)
360
+ |~~~~~~~~~~ expression})
361
+
362
+ assert_parses(
363
+ s(:hash,
364
+ s(:pair, s(:int, 1), s(:int, 2)),
365
+ s(:pair, s(:sym, :foo), s(:str, 'bar'))),
366
+ %q[{ 1 => 2, :foo => "bar" }])
367
+ end
368
+
369
+ def test_hash_label
370
+ assert_parses(
371
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 2))),
372
+ %q[{ foo: 2 }],
373
+ %q{^ begin
374
+ | ^ end
375
+ | ^ operator (pair)
376
+ | ~~~ expression (pair.sym)
377
+ | ~~~~~~ expression (pair)
378
+ |~~~~~~~~~~ expression},
379
+ ALL_VERSIONS - %w(1.8))
380
+ end
381
+
382
+ # def test_hash_kwsplat
383
+ # assert_parses(
384
+ # s(:hash,
385
+ # s(:pair, s(:symbol, :foo), s(:int, 2))
386
+ # s(:kwsplat, s(:lvar, :bar))),
387
+ # %q[{ foo: 2, **bar }],
388
+ # %q{ ^^ operator (kwsplat)
389
+ # | ~~~~~ expression (kwsplat)},
390
+ # %w(2.0))
391
+ # end
392
+
393
+ def test_hash_no_hashrocket
394
+ assert_parses(
395
+ s(:hash, s(:pair, s(:int, 1), s(:int, 2))),
396
+ %q[{ 1, 2 }],
397
+ %q{^ begin
398
+ | ^ end
399
+ | ^ operator (pair)
400
+ | ~~~~ expression (pair)
401
+ |~~~~~~~~ expression},
402
+ %w(1.8))
403
+ end
404
+
405
+ def test_hash_no_hashrocket_odd
406
+ assert_diagnoses(
407
+ [:error, :odd_hash],
408
+ %q[{ 1, 2, 3 }],
409
+ %q( ~ location),
410
+ %w(1.8))
411
+ end
412
+
413
+ # Range
414
+
415
+ def test_range_inclusive
416
+ assert_parses(
417
+ s(:irange, s(:int, 1), s(:int, 2)),
418
+ %q{1..2},
419
+ %q{ ~~ operator
420
+ |~~~~ expression})
421
+ end
422
+
423
+ def test_range_exclusive
424
+ assert_parses(
425
+ s(:erange, s(:int, 1), s(:int, 2)),
426
+ %q{1...2},
427
+ %q{ ~~~ operator
428
+ |~~~~~ expression})
429
+ end
430
+
431
+ #
432
+ # Access
433
+ #
434
+
435
+ # Variables and pseudovariables
436
+
437
+ def test_self
438
+ assert_parses(
439
+ s(:self),
440
+ %q{self},
441
+ %q{~~~~ expression})
442
+ end
443
+
444
+ def test_lvar
445
+ assert_parses(
446
+ s(:lvar, :foo),
447
+ %q{foo},
448
+ %q{~~~ expression})
449
+ end
450
+
451
+ def test_ivar
452
+ assert_parses(
453
+ s(:ivar, :@foo),
454
+ %q{@foo},
455
+ %q{~~~~ expression})
456
+ end
457
+
458
+ def test_cvar
459
+ assert_parses(
460
+ s(:cvar, :@@foo),
461
+ %q{@@foo},
462
+ %q{~~~~~ expression})
463
+ end
464
+
465
+ def test_gvar
466
+ assert_parses(
467
+ s(:gvar, :$foo),
468
+ %q{$foo},
469
+ %q{~~~~ expression})
470
+ end
471
+
472
+ def test_back_ref
473
+ assert_parses(
474
+ s(:back_ref, :$+),
475
+ %q{$+},
476
+ %q{~~ expression})
477
+ end
478
+
479
+ def test_nth_ref
480
+ assert_parses(
481
+ s(:nth_ref, 10),
482
+ %q{$10},
483
+ %q{~~~ expression})
484
+ end
485
+
486
+ # Constants
487
+
488
+ def test_const_toplevel
489
+ assert_parses(
490
+ s(:const, s(:cbase), :Foo),
491
+ %q{::Foo},
492
+ %q{ ~~~ name
493
+ |~~~~~ expression})
494
+ end
495
+
496
+ def test_const_scoped
497
+ assert_parses(
498
+ s(:const, s(:const, nil, :Bar), :Foo),
499
+ %q{Bar::Foo},
500
+ %q{ ~~~ name
501
+ |~~~~~~~~ expression})
502
+ end
503
+
504
+ def test_const_unscoped
505
+ assert_parses(
506
+ s(:const, nil, :Foo),
507
+ %q{Foo},
508
+ %q{~~~ name
509
+ |~~~ expression})
510
+ end
511
+
512
+ def test___ENCODING__
513
+ assert_parses(
514
+ s(:const, s(:const, nil, :Encoding), :UTF_8),
515
+ %q{__ENCODING__},
516
+ %q{~~~~~~~~~~~~ expression},
517
+ ALL_VERSIONS - %w(1.8))
518
+ end
519
+
520
+ # defined?
521
+
522
+ def test_defined
523
+ assert_parses(
524
+ s(:defined?, s(:lvar, :foo)),
525
+ %q{defined? foo},
526
+ %q{~~~~~~~~ keyword
527
+ |~~~~~~~~~~~~ expression})
528
+
529
+ assert_parses(
530
+ s(:defined?, s(:lvar, :foo)),
531
+ %q{defined?(foo)},
532
+ %q{~~~~~~~~ keyword
533
+ | ^ begin
534
+ | ^ end
535
+ |~~~~~~~~~~~~~ expression})
536
+
537
+ assert_parses(
538
+ s(:defined?, s(:ivar, :@foo)),
539
+ %q{defined? @foo})
540
+ end
541
+
542
+ #
543
+ # Assignment
544
+ #
545
+
546
+ # Variables
547
+
548
+ def test_lvasgn
549
+ assert_parses(
550
+ s(:begin,
551
+ s(:lvasgn, :var, s(:int, 10)),
552
+ s(:lvar, :var)),
553
+ %q{var = 10; var},
554
+ %q{~~~ name (lvasgn)
555
+ | ^ operator (lvasgn)
556
+ |~~~~~~~~ expression (lvasgn)
557
+ })
558
+ end
559
+
560
+ def test_ivasgn
561
+ assert_parses(
562
+ s(:ivasgn, :@var, s(:int, 10)),
563
+ %q{@var = 10},
564
+ %q{~~~~ name
565
+ | ^ operator
566
+ |~~~~~~~~~ expression
567
+ })
568
+ end
569
+
570
+ def test_cvdecl
571
+ assert_parses(
572
+ s(:cvdecl, :@@var, s(:int, 10)),
573
+ %q{@@var = 10},
574
+ %q{~~~~~ name
575
+ | ^ operator
576
+ |~~~~~~~~~~ expression
577
+ })
578
+ end
579
+
580
+ def test_cvasgn
581
+ assert_parses(
582
+ s(:def, :a, s(:args),
583
+ s(:cvasgn, :@@var, s(:int, 10))),
584
+ %q{def a; @@var = 10; end},
585
+ %q{ ~~~~~ name (cvasgn)
586
+ | ^ operator (cvasgn)
587
+ | ~~~~~~~~~~ expression (cvasgn)
588
+ })
589
+ end
590
+
591
+ def test_gvasgn
592
+ assert_parses(
593
+ s(:gvasgn, :$var, s(:int, 10)),
594
+ %q{$var = 10},
595
+ %q{~~~~ name
596
+ | ^ operator
597
+ |~~~~~~~~~ expression
598
+ })
599
+ end
600
+
601
+ def test_asgn_cmd
602
+ assert_parses(
603
+ s(:lvasgn, :foo, s(:send, nil, :m, s(:lvar, :foo))),
604
+ %q{foo = m foo})
605
+
606
+ assert_parses(
607
+ s(:lvasgn, :foo,
608
+ s(:lvasgn, :bar,
609
+ s(:send, nil, :m, s(:lvar, :foo)))),
610
+ %q{foo = bar = m foo},
611
+ %q{},
612
+ ALL_VERSIONS - %w(1.8))
613
+ end
614
+
615
+ def test_asgn_keyword_invalid
616
+ assert_diagnoses(
617
+ [:error, :invalid_assignment],
618
+ %q{nil = foo},
619
+ %q{~~~ location})
620
+
621
+ assert_diagnoses(
622
+ [:error, :invalid_assignment],
623
+ %q{self = foo},
624
+ %q{~~~~ location})
625
+
626
+ assert_diagnoses(
627
+ [:error, :invalid_assignment],
628
+ %q{true = foo},
629
+ %q{~~~~ location})
630
+
631
+ assert_diagnoses(
632
+ [:error, :invalid_assignment],
633
+ %q{false = foo},
634
+ %q{~~~~~ location})
635
+
636
+ assert_diagnoses(
637
+ [:error, :invalid_assignment],
638
+ %q{__FILE__ = foo},
639
+ %q{~~~~~~~~ location})
640
+
641
+ assert_diagnoses(
642
+ [:error, :invalid_assignment],
643
+ %q{__LINE__ = foo},
644
+ %q{~~~~~~~~ location})
645
+ end
646
+
647
+ def test_asgn_backref_invalid
648
+ assert_diagnoses(
649
+ [:error, :backref_assignment],
650
+ %q{$1 = foo},
651
+ %q{~~ location})
652
+ end
653
+
654
+ # Constants
655
+
656
+ def test_cdecl_toplevel
657
+ assert_parses(
658
+ s(:cdecl, s(:cbase), :Foo, s(:int, 10)),
659
+ %q{::Foo = 10},
660
+ %q{ ~~~ name
661
+ | ^ operator
662
+ |~~~~~~~~~~ expression
663
+ })
664
+ end
665
+
666
+ def test_cdecl_scoped
667
+ assert_parses(
668
+ s(:cdecl, s(:const, nil, :Bar), :Foo, s(:int, 10)),
669
+ %q{Bar::Foo = 10},
670
+ %q{ ~~~ name
671
+ | ^ operator
672
+ |~~~~~~~~~~~~~ expression
673
+ })
674
+ end
675
+
676
+ def test_cdecl_unscoped
677
+ assert_parses(
678
+ s(:cdecl, nil, :Foo, s(:int, 10)),
679
+ %q{Foo = 10},
680
+ %q{~~~ name
681
+ | ^ operator
682
+ |~~~~~~~~ expression
683
+ })
684
+ end
685
+
686
+ def test_cdecl_invalid
687
+ assert_diagnoses(
688
+ [:error, :dynamic_const],
689
+ %q{def f; Foo = 1; end},
690
+ %q{ ~~~ location})
691
+
692
+ assert_diagnoses(
693
+ [:error, :dynamic_const],
694
+ %q{def f; Foo::Bar = 1; end},
695
+ %q{ ~~~ location})
696
+
697
+ assert_diagnoses(
698
+ [:error, :dynamic_const],
699
+ %q{def f; ::Bar = 1; end},
700
+ %q{ ~~~ location})
701
+ end
702
+
703
+ # Multiple assignment
704
+
705
+ def test_masgn
706
+ assert_parses(
707
+ s(:masgn,
708
+ s(:mlhs, s(:lvasgn, :foo), s(:lvasgn, :bar)),
709
+ s(:array, s(:int, 1), s(:int, 2))),
710
+ %q{foo, bar = 1, 2},
711
+ %q{ ^ operator
712
+ |~~~~~~~~ expression (mlhs)
713
+ | ~~~~ expression (array)
714
+ |~~~~~~~~~~~~~~~ expression
715
+ })
716
+
717
+ assert_parses(
718
+ s(:masgn,
719
+ s(:mlhs, s(:lvasgn, :foo), s(:lvasgn, :bar)),
720
+ s(:array, s(:int, 1), s(:int, 2))),
721
+ %q{(foo, bar) = 1, 2},
722
+ %q{^ begin
723
+ | ^ end})
724
+
725
+ assert_parses(
726
+ s(:masgn,
727
+ s(:mlhs,
728
+ s(:lvasgn, :foo),
729
+ s(:lvasgn, :bar),
730
+ s(:lvasgn, :baz)),
731
+ s(:array, s(:int, 1), s(:int, 2))),
732
+ %q{foo, bar, baz = 1, 2})
733
+ end
734
+
735
+ def test_masgn_splat
736
+ assert_parses(
737
+ s(:masgn,
738
+ s(:mlhs, s(:ivasgn, :@foo), s(:cvdecl, :@@bar)),
739
+ s(:array, s(:splat, s(:lvar, :foo)))),
740
+ %q{@foo, @@bar = *foo},
741
+ %q{ ^ operator (array.splat)
742
+ | ~~~~ expression (array.splat)
743
+ })
744
+
745
+ assert_parses(
746
+ s(:masgn,
747
+ s(:mlhs, s(:lvasgn, :a), s(:lvasgn, :b)),
748
+ s(:array, s(:splat, s(:lvar, :foo)), s(:lvar, :bar))),
749
+ %q{a, b = *foo, bar},
750
+ %q{},
751
+ ALL_VERSIONS - %w(1.8))
752
+
753
+ assert_parses(
754
+ s(:masgn,
755
+ s(:mlhs, s(:lvasgn, :a), s(:splat, s(:lvasgn, :b))),
756
+ s(:lvar, :bar)),
757
+ %q{a, *b = bar})
758
+
759
+ assert_parses(
760
+ s(:masgn,
761
+ s(:mlhs,
762
+ s(:lvasgn, :a),
763
+ s(:splat, s(:lvasgn, :b)),
764
+ s(:lvasgn, :c)),
765
+ s(:lvar, :bar)),
766
+ %q{a, *b, c = bar},
767
+ %q{},
768
+ ALL_VERSIONS - %w(1.8))
769
+
770
+ assert_parses(
771
+ s(:masgn,
772
+ s(:mlhs, s(:lvasgn, :a), s(:splat)),
773
+ s(:lvar, :bar)),
774
+ %q{a, * = bar})
775
+
776
+ assert_parses(
777
+ s(:masgn,
778
+ s(:mlhs,
779
+ s(:lvasgn, :a),
780
+ s(:splat),
781
+ s(:lvasgn, :c)),
782
+ s(:lvar, :bar)),
783
+ %q{a, *, c = bar},
784
+ %q{},
785
+ ALL_VERSIONS - %w(1.8))
786
+
787
+ assert_parses(
788
+ s(:masgn,
789
+ s(:mlhs, s(:splat, s(:lvasgn, :b))),
790
+ s(:lvar, :bar)),
791
+ %q{*b = bar})
792
+
793
+ assert_parses(
794
+ s(:masgn,
795
+ s(:mlhs,
796
+ s(:splat, s(:lvasgn, :b)),
797
+ s(:lvasgn, :c)),
798
+ s(:lvar, :bar)),
799
+ %q{*b, c = bar},
800
+ %q{},
801
+ ALL_VERSIONS - %w(1.8))
802
+
803
+ assert_parses(
804
+ s(:masgn,
805
+ s(:mlhs, s(:splat)),
806
+ s(:lvar, :bar)),
807
+ %q{* = bar})
808
+
809
+ assert_parses(
810
+ s(:masgn,
811
+ s(:mlhs,
812
+ s(:splat),
813
+ s(:lvasgn, :c),
814
+ s(:lvasgn, :d)),
815
+ s(:lvar, :bar)),
816
+ %q{*, c, d = bar},
817
+ %q{},
818
+ ALL_VERSIONS - %w(1.8))
819
+ end
820
+
821
+ def test_masgn_nested
822
+ assert_parses(
823
+ s(:masgn,
824
+ s(:mlhs,
825
+ s(:lvasgn, :a),
826
+ s(:mlhs,
827
+ s(:lvasgn, :b),
828
+ s(:lvasgn, :c))),
829
+ s(:lvar, :foo)),
830
+ %q{a, (b, c) = foo},
831
+ %q{ ^ begin (mlhs.mlhs)
832
+ | ^ end (mlhs.mlhs)
833
+ | ~~~~~~ expression (mlhs.mlhs)
834
+ })
835
+
836
+ assert_parses(
837
+ s(:masgn,
838
+ s(:mlhs,
839
+ s(:lvasgn, :b)),
840
+ s(:lvar, :foo)),
841
+ %q{((b, )) = foo},
842
+ %q{^ begin (mlhs)
843
+ | ^ end (mlhs)})
844
+ end
845
+
846
+ def test_masgn_attr
847
+ assert_parses(
848
+ s(:masgn,
849
+ s(:mlhs,
850
+ s(:send, s(:self), :a=),
851
+ s(:send, s(:self), :[]=, s(:int, 1), s(:int, 2))),
852
+ s(:lvar, :foo)),
853
+ %q{self.a, self[1, 2] = foo},
854
+ %q{~~~~~~ expression (mlhs.send/1)
855
+ | ~ selector (mlhs.send/1)
856
+ | ~~~~~~ selector (mlhs.send/2)
857
+ | ~~~~~~~~~~ expression (mlhs.send/2)})
858
+
859
+ assert_parses(
860
+ s(:masgn,
861
+ s(:mlhs,
862
+ s(:send, s(:self), :a=),
863
+ s(:lvasgn, :foo)),
864
+ s(:lvar, :foo)),
865
+ %q{self::a, foo = foo})
866
+
867
+ assert_parses(
868
+ s(:masgn,
869
+ s(:mlhs,
870
+ s(:send, s(:self), :A=),
871
+ s(:lvasgn, :foo)),
872
+ s(:lvar, :foo)),
873
+ %q{self.A, foo = foo})
874
+ end
875
+
876
+ def test_masgn_const
877
+ assert_parses(
878
+ s(:masgn,
879
+ s(:mlhs,
880
+ s(:cdecl, s(:self), :A),
881
+ s(:lvasgn, :foo)),
882
+ s(:lvar, :foo)),
883
+ %q{self::A, foo = foo})
884
+
885
+ assert_parses(
886
+ s(:masgn,
887
+ s(:mlhs,
888
+ s(:cdecl, s(:cbase), :A),
889
+ s(:lvasgn, :foo)),
890
+ s(:lvar, :foo)),
891
+ %q{::A, foo = foo})
892
+ end
893
+
894
+ def test_masgn_cmd
895
+ assert_parses(
896
+ s(:masgn,
897
+ s(:mlhs,
898
+ s(:lvasgn, :foo),
899
+ s(:lvasgn, :bar)),
900
+ s(:send, nil, :m, s(:lvar, :foo))),
901
+ %q{foo, bar = m foo})
902
+ end
903
+
904
+ def test_asgn_mrhs
905
+ assert_parses(
906
+ s(:lvasgn, :foo,
907
+ s(:array, s(:lvar, :bar), s(:int, 1))),
908
+ %q{foo = bar, 1},
909
+ %q{ ~~~~~~ array
910
+ |~~~~~~~~~~~~ expression})
911
+
912
+ assert_parses(
913
+ s(:lvasgn, :foo,
914
+ s(:array, s(:splat, s(:lvar, :bar)))),
915
+ %q{foo = *bar})
916
+
917
+ assert_parses(
918
+ s(:lvasgn, :foo,
919
+ s(:array,
920
+ s(:lvar, :baz),
921
+ s(:splat, s(:lvar, :bar)))),
922
+ %q{foo = baz, *bar})
923
+ end
924
+
925
+ def test_masgn_keyword_invalid
926
+ assert_diagnoses(
927
+ [:error, :invalid_assignment],
928
+ %q{nil, foo = bar},
929
+ %q{~~~ location})
930
+ end
931
+
932
+ def test_masgn_backref_invalid
933
+ assert_diagnoses(
934
+ [:error, :backref_assignment],
935
+ %q{$1, = foo},
936
+ %q{~~ location})
937
+ end
938
+
939
+ def test_masgn_const_invalid
940
+ assert_diagnoses(
941
+ [:error, :dynamic_const],
942
+ %q{def f; self::A, foo = foo; end},
943
+ %q{ ~ location})
944
+
945
+ assert_diagnoses(
946
+ [:error, :dynamic_const],
947
+ %q{def f; ::A, foo = foo; end},
948
+ %q{ ~ location})
949
+ end
950
+
951
+ # Variable binary operator-assignment
952
+
953
+ def test_var_op_asgn
954
+ assert_parses(
955
+ s(:op_asgn, s(:lvasgn, :a), :+, s(:int, 1)),
956
+ %q{a += 1},
957
+ %q{ ^^ operator
958
+ |~~~~~~ expression})
959
+
960
+ assert_parses(
961
+ s(:op_asgn, s(:ivasgn, :@a), :|, s(:int, 1)),
962
+ %q{@a |= 1},
963
+ %q{ ^^ operator
964
+ |~~~~~~~ expression})
965
+
966
+ assert_parses(
967
+ s(:op_asgn, s(:cvdecl, :@@var), :|, s(:int, 10)),
968
+ %q{@@var |= 10})
969
+
970
+ assert_parses(
971
+ s(:def, :a, s(:args),
972
+ s(:op_asgn, s(:cvasgn, :@@var), :|, s(:int, 10))),
973
+ %q{def a; @@var |= 10; end})
974
+ end
975
+
976
+ def test_var_op_asgn_cmd
977
+ assert_parses(
978
+ s(:op_asgn,
979
+ s(:lvasgn, :foo), :+,
980
+ s(:send, nil, :m, s(:lvar, :foo))),
981
+ %q{foo += m foo})
982
+ end
983
+
984
+ def test_var_op_asgn_keyword_invalid
985
+ assert_diagnoses(
986
+ [:error, :invalid_assignment],
987
+ %q{nil += foo},
988
+ %q{~~~ location})
989
+ end
990
+
991
+ # Method binary operator-assignment
992
+
993
+ def test_op_asgn
994
+ assert_parses(
995
+ s(:op_asgn,
996
+ s(:send, s(:lvar, :foo), :a), :+,
997
+ s(:int, 1)),
998
+ %q{foo.a += 1},
999
+ %q{ ^^ operator
1000
+ | ~ selector (send)
1001
+ |~~~~~ expression (send)
1002
+ |~~~~~~~~~~ expression})
1003
+
1004
+ assert_parses(
1005
+ s(:op_asgn,
1006
+ s(:send, s(:lvar, :foo), :a), :+,
1007
+ s(:int, 1)),
1008
+ %q{foo::a += 1})
1009
+
1010
+ assert_parses(
1011
+ s(:op_asgn,
1012
+ s(:send, s(:lvar, :foo), :A), :+,
1013
+ s(:int, 1)),
1014
+ %q{foo.A += 1})
1015
+ end
1016
+
1017
+ def test_op_asgn_cmd
1018
+ assert_parses(
1019
+ s(:op_asgn,
1020
+ s(:send, s(:lvar, :foo), :a), :+,
1021
+ s(:send, nil, :m, s(:lvar, :foo))),
1022
+ %q{foo.a += m foo})
1023
+
1024
+ assert_parses(
1025
+ s(:op_asgn,
1026
+ s(:send, s(:lvar, :foo), :a), :+,
1027
+ s(:send, nil, :m, s(:lvar, :foo))),
1028
+ %q{foo::a += m foo})
1029
+
1030
+ assert_parses(
1031
+ s(:op_asgn,
1032
+ s(:send, s(:lvar, :foo), :A), :+,
1033
+ s(:send, nil, :m, s(:lvar, :foo))),
1034
+ %q{foo.A += m foo})
1035
+
1036
+ assert_parses(
1037
+ s(:op_asgn,
1038
+ s(:send, s(:lvar, :foo), :A), :+,
1039
+ s(:send, nil, :m, s(:lvar, :foo))),
1040
+ %q{foo::A += m foo},
1041
+ %q{},
1042
+ ALL_VERSIONS - %w(1.8))
1043
+ end
1044
+
1045
+ def test_op_asgn_index
1046
+ assert_parses(
1047
+ s(:op_asgn,
1048
+ s(:send, s(:lvar, :foo), :[],
1049
+ s(:int, 0), s(:int, 1)), :+,
1050
+ s(:int, 2)),
1051
+ %q{foo[0, 1] += 2},
1052
+ %q{ ^^ operator
1053
+ | ~~~~~~ selector (send)
1054
+ |~~~~~~~~~ expression (send)
1055
+ |~~~~~~~~~~~~~~ expression})
1056
+ end
1057
+
1058
+ def test_op_asgn_index_cmd
1059
+ assert_parses(
1060
+ s(:op_asgn,
1061
+ s(:send, s(:lvar, :foo), :[],
1062
+ s(:int, 0), s(:int, 1)), :+,
1063
+ s(:send, nil, :m, s(:lvar, :foo))),
1064
+ %q{foo[0, 1] += m foo})
1065
+ end
1066
+
1067
+ def test_op_asgn_invalid
1068
+ assert_diagnoses(
1069
+ [:error, :backref_assignment],
1070
+ %q{$1 |= 1},
1071
+ %q{~~ location})
1072
+
1073
+ assert_diagnoses(
1074
+ [:error, :backref_assignment],
1075
+ %q{$+ |= 1},
1076
+ %q{~~ location})
1077
+
1078
+ assert_diagnoses(
1079
+ [:error, :backref_assignment],
1080
+ %q{$+ |= m foo},
1081
+ %q{~~ location})
1082
+
1083
+ assert_diagnoses(
1084
+ [:error, :dynamic_const],
1085
+ %q{Foo::Bar += 1; end},
1086
+ %q{ ~~~ location})
1087
+
1088
+ assert_diagnoses(
1089
+ [:error, :dynamic_const],
1090
+ %q{::Bar += 1; end},
1091
+ %q{ ~~~ location})
1092
+ end
1093
+
1094
+ # Variable logical operator-assignment
1095
+
1096
+ def test_var_or_asgn
1097
+ assert_parses(
1098
+ s(:or_asgn, s(:lvasgn, :a), s(:int, 1)),
1099
+ %q{a ||= 1},
1100
+ %q{ ^^^ operator
1101
+ |~~~~~~~ expression})
1102
+ end
1103
+
1104
+ def test_var_and_asgn
1105
+ assert_parses(
1106
+ s(:and_asgn, s(:lvasgn, :a), s(:int, 1)),
1107
+ %q{a &&= 1},
1108
+ %q{ ^^^ operator
1109
+ |~~~~~~~ expression})
1110
+ end
1111
+
1112
+ # Method logical operator-assignment
1113
+
1114
+ def test_or_asgn
1115
+ assert_parses(
1116
+ s(:or_asgn,
1117
+ s(:send, s(:lvar, :foo), :a),
1118
+ s(:int, 1)),
1119
+ %q{foo.a ||= 1},
1120
+ %q{ ^^^ operator
1121
+ | ~ selector (send)
1122
+ |~~~~~ expression (send)
1123
+ |~~~~~~~~~~~ expression})
1124
+
1125
+ assert_parses(
1126
+ s(:or_asgn,
1127
+ s(:send, s(:lvar, :foo), :[],
1128
+ s(:int, 0), s(:int, 1)),
1129
+ s(:int, 2)),
1130
+ %q{foo[0, 1] ||= 2},
1131
+ %q{ ^^^ operator
1132
+ | ~~~~~~ selector (send)
1133
+ |~~~~~~~~~ expression (send)
1134
+ |~~~~~~~~~~~~~~~ expression})
1135
+ end
1136
+
1137
+ def test_and_asgn
1138
+ assert_parses(
1139
+ s(:and_asgn,
1140
+ s(:send, s(:lvar, :foo), :a),
1141
+ s(:int, 1)),
1142
+ %q{foo.a &&= 1},
1143
+ %q{ ^^^ operator
1144
+ | ~ selector (send)
1145
+ |~~~~~ expression (send)
1146
+ |~~~~~~~~~~~ expression})
1147
+
1148
+ assert_parses(
1149
+ s(:and_asgn,
1150
+ s(:send, s(:lvar, :foo), :[],
1151
+ s(:int, 0), s(:int, 1)),
1152
+ s(:int, 2)),
1153
+ %q{foo[0, 1] &&= 2},
1154
+ %q{ ^^^ operator
1155
+ | ~~~~~~ selector (send)
1156
+ |~~~~~~~~~ expression (send)
1157
+ |~~~~~~~~~~~~~~~ expression})
1158
+ end
1159
+
1160
+ def test_log_asgn_invalid
1161
+ assert_diagnoses(
1162
+ [:error, :backref_assignment],
1163
+ %q{$1 &&= 1},
1164
+ %q{~~ location})
1165
+
1166
+ assert_diagnoses(
1167
+ [:error, :backref_assignment],
1168
+ %q{$+ ||= 1},
1169
+ %q{~~ location})
1170
+ end
1171
+
1172
+
1173
+ #
1174
+ # Class and module definitions
1175
+ #
1176
+
1177
+ def test_module
1178
+ assert_parses(
1179
+ s(:module,
1180
+ s(:const, nil, :Foo),
1181
+ s(:nil)),
1182
+ %q{module Foo; nil; end},
1183
+ %q{~~~~~~ keyword
1184
+ | ~~~ end})
1185
+ end
1186
+
1187
+ def test_module_invalid
1188
+ assert_diagnoses(
1189
+ [:error, :module_in_def],
1190
+ %q{def a; module Foo; end; end})
1191
+ end
1192
+
1193
+ def test_cpath
1194
+ assert_parses(
1195
+ s(:module,
1196
+ s(:const, s(:cbase), :Foo),
1197
+ s(:nil)),
1198
+ %q{module ::Foo; nil; end})
1199
+
1200
+ assert_parses(
1201
+ s(:module,
1202
+ s(:const, s(:const, nil, :Bar), :Foo),
1203
+ s(:nil)),
1204
+ %q{module Bar::Foo; nil; end})
1205
+ end
1206
+
1207
+ def test_cpath_invalid
1208
+ assert_diagnoses(
1209
+ [:error, :module_name_const],
1210
+ %q{module foo; nil; end})
1211
+ end
1212
+
1213
+ def test_class
1214
+ assert_parses(
1215
+ s(:class,
1216
+ s(:const, nil, :Foo),
1217
+ nil,
1218
+ s(:nil)),
1219
+ %q{class Foo; nil; end},
1220
+ %q{~~~~~ keyword
1221
+ | ~~~ end})
1222
+ end
1223
+
1224
+ def test_class_super
1225
+ assert_parses(
1226
+ s(:class,
1227
+ s(:const, nil, :Foo),
1228
+ s(:const, nil, :Bar),
1229
+ s(:nil)),
1230
+ %q{class Foo < Bar; nil; end},
1231
+ %q{~~~~~ keyword
1232
+ | ^ operator
1233
+ | ~~~ end})
1234
+ end
1235
+
1236
+ def test_class_invalid
1237
+ assert_diagnoses(
1238
+ [:error, :class_in_def],
1239
+ %q{def a; class Foo; end; end})
1240
+ end
1241
+
1242
+ def test_sclass
1243
+ assert_parses(
1244
+ s(:sclass,
1245
+ s(:lvar, :foo),
1246
+ s(:nil)),
1247
+ %q{class << foo; nil; end},
1248
+ %q{~~~~~ keyword
1249
+ | ^^ operator
1250
+ | ~~~ end})
1251
+ end
1252
+
1253
+ #
1254
+ # Method (un)definition
1255
+ #
1256
+
1257
+ def test_def
1258
+ assert_parses(
1259
+ s(:def, :foo, s(:args), s(:nil)),
1260
+ %q{def foo; nil; end},
1261
+ %q{~~~ keyword
1262
+ | ~~~ name
1263
+ | ~~~ end})
1264
+ end
1265
+
1266
+ def test_defs
1267
+ assert_parses(
1268
+ s(:defs, s(:self), :foo, s(:args), s(:nil)),
1269
+ %q{def self.foo; nil; end},
1270
+ %q{~~~ keyword
1271
+ | ^ operator
1272
+ | ~~~ name
1273
+ | ~~~ end})
1274
+
1275
+ assert_parses(
1276
+ s(:defs, s(:self), :foo, s(:args), s(:nil)),
1277
+ %q{def self::foo; nil; end},
1278
+ %q{~~~ keyword
1279
+ | ^^ operator
1280
+ | ~~~ name
1281
+ | ~~~ end})
1282
+
1283
+ assert_parses(
1284
+ s(:defs, s(:lvar, :foo), :foo, s(:args), s(:nil)),
1285
+ %q{def (foo).foo; end})
1286
+ end
1287
+
1288
+ def test_defs_invalid
1289
+ assert_diagnoses(
1290
+ [:error, :singleton_literal],
1291
+ %q{def (1).foo; end},
1292
+ %q{ ~ location})
1293
+
1294
+ assert_diagnoses(
1295
+ [:error, :singleton_literal],
1296
+ %q{def ("foo").foo; end},
1297
+ %q{ ~~~~~ location})
1298
+
1299
+ assert_diagnoses(
1300
+ [:error, :singleton_literal],
1301
+ %q{def ("foo#{bar}").foo; end},
1302
+ %q{ ~~~~~~~~~~~ location})
1303
+
1304
+ assert_diagnoses(
1305
+ [:error, :singleton_literal],
1306
+ %q{def (:foo).foo; end},
1307
+ %q{ ~ location})
1308
+
1309
+ assert_diagnoses(
1310
+ [:error, :singleton_literal],
1311
+ %q{def (:"foo#{bar}").foo; end},
1312
+ %q{ ~~~~~~~~~~~~ location})
1313
+
1314
+ assert_diagnoses(
1315
+ [:error, :singleton_literal],
1316
+ %q{def ([]).foo; end},
1317
+ %q{ ~~ location})
1318
+
1319
+ assert_diagnoses(
1320
+ [:error, :singleton_literal],
1321
+ %q{def ({}).foo; end},
1322
+ %q{ ~~ location})
1323
+
1324
+ assert_diagnoses(
1325
+ [:error, :singleton_literal],
1326
+ %q{def (/foo/).foo; end},
1327
+ %q{ ~~~~~ location})
1328
+ end
1329
+
1330
+ def test_undef
1331
+ assert_parses(
1332
+ s(:undef,
1333
+ s(:sym, :foo),
1334
+ s(:sym, :bar),
1335
+ s(:dsym, s(:str, "foo"), s(:int, 1))),
1336
+ %q{undef foo, :bar, :"foo#{1}"},
1337
+ %q{~~~~~ keyword
1338
+ | ~~~ expression (sym/1)
1339
+ | ~~~~ expression (sym/2)
1340
+ |~~~~~~~~~~~~~~~~~~~~~~~~ expression})
1341
+ end
1342
+
1343
+ #
1344
+ # Aliasing
1345
+ #
1346
+
1347
+ def test_alias
1348
+ assert_parses(
1349
+ s(:alias, s(:sym, :foo), s(:sym, :bar)),
1350
+ %q{alias :foo bar},
1351
+ %q{~~~~~ keyword
1352
+ | ~~~~ expression (sym/1)
1353
+ | ~~~ expression (sym/2)
1354
+ |~~~~~~~~~~~~~~ expression})
1355
+ end
1356
+
1357
+ def test_alias_gvar
1358
+ assert_parses(
1359
+ s(:alias, s(:gvar, :$a), s(:gvar, :$b)),
1360
+ %q{alias $a $b},
1361
+ %q{ ~~ expression (gvar/1)})
1362
+
1363
+ assert_parses(
1364
+ s(:alias, s(:gvar, :$a), s(:back_ref, :$+)),
1365
+ %q{alias $a $+},
1366
+ %q{ ~~ expression (back_ref)})
1367
+ end
1368
+
1369
+ def test_alias_nth_ref
1370
+ assert_diagnoses(
1371
+ [:error, :nth_ref_alias],
1372
+ %q{alias $a $1},
1373
+ %q{ ~~ location})
1374
+ end
1375
+
1376
+ #
1377
+ # Formal arguments
1378
+ #
1379
+
1380
+ def test_arg
1381
+ assert_parses(
1382
+ s(:def, :f,
1383
+ s(:args, s(:arg, :foo)),
1384
+ s(:nil)),
1385
+ %q{def f(foo); nil; end},
1386
+ %q{ ~~~ name (args.arg)
1387
+ | ~~~ expression (args.arg)
1388
+ | ^ begin (args)
1389
+ | ^ end (args)
1390
+ | ~~~~~ expression (args)})
1391
+
1392
+ assert_parses(
1393
+ s(:def, :f,
1394
+ s(:args, s(:arg, :foo), s(:arg, :bar)),
1395
+ s(:nil)),
1396
+ %q{def f(foo, bar); nil; end})
1397
+ end
1398
+
1399
+ def test_optarg
1400
+ assert_parses(
1401
+ s(:def, :f,
1402
+ s(:args, s(:optarg, :foo, s(:int, 1))),
1403
+ s(:nil)),
1404
+ %q{def f foo = 1; nil; end},
1405
+ %q{ ~~~ name (args.optarg)
1406
+ | ^ operator (args.optarg)
1407
+ | ~~~~~~~ expression (args.optarg)
1408
+ | ~~~~~~~ expression (args)})
1409
+
1410
+ assert_parses(
1411
+ s(:def, :f,
1412
+ s(:args,
1413
+ s(:optarg, :foo, s(:int, 1)),
1414
+ s(:optarg, :bar, s(:int, 2))),
1415
+ s(:nil)),
1416
+ %q{def f(foo=1, bar=2); nil; end})
1417
+ end
1418
+
1419
+ def test_splatarg_named
1420
+ assert_parses(
1421
+ s(:def, :f,
1422
+ s(:args, s(:splatarg, :foo)),
1423
+ s(:nil)),
1424
+ %q{def f(*foo); nil; end},
1425
+ %q{ ~~~ name (args.splatarg)
1426
+ | ~~~~ expression (args.splatarg)})
1427
+ end
1428
+
1429
+ def test_splatarg_unnamed
1430
+ assert_parses(
1431
+ s(:def, :f,
1432
+ s(:args, s(:splatarg)),
1433
+ s(:nil)),
1434
+ %q{def f(*); nil; end},
1435
+ %q{ ~ expression (args.splatarg)})
1436
+ end
1437
+
1438
+ def test_blockarg
1439
+ assert_parses(
1440
+ s(:def, :f,
1441
+ s(:args, s(:blockarg, :block)),
1442
+ s(:nil)),
1443
+ %q{def f(&block); nil; end},
1444
+ %q{ ~~~~~ name (args.blockarg)
1445
+ | ~~~~~~ expression (args.blockarg)})
1446
+ end
1447
+
1448
+ def assert_parses_args(ast, code, versions=ALL_VERSIONS)
1449
+ assert_parses(
1450
+ s(:def, :f, ast, s(:nil)),
1451
+ %Q{def f #{code}; nil; end},
1452
+ %q{},
1453
+ versions)
1454
+ end
1455
+
1456
+ def test_arg_combinations
1457
+ # f_arg tCOMMA f_optarg tCOMMA f_rest_arg opt_f_block_arg
1458
+ assert_parses_args(
1459
+ s(:args,
1460
+ s(:arg, :a),
1461
+ s(:optarg, :o, s(:int, 1)),
1462
+ s(:splatarg, :r),
1463
+ s(:blockarg, :b)),
1464
+ %q{a, o=1, *r, &b})
1465
+
1466
+ # f_arg tCOMMA f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
1467
+ assert_parses_args(
1468
+ s(:args,
1469
+ s(:arg, :a),
1470
+ s(:optarg, :o, s(:int, 1)),
1471
+ s(:splatarg, :r),
1472
+ s(:arg, :p),
1473
+ s(:blockarg, :b)),
1474
+ %q{a, o=1, *r, p, &b},
1475
+ ALL_VERSIONS - %w(1.8))
1476
+
1477
+ # f_arg tCOMMA f_optarg opt_f_block_arg
1478
+ assert_parses_args(
1479
+ s(:args,
1480
+ s(:arg, :a),
1481
+ s(:optarg, :o, s(:int, 1)),
1482
+ s(:blockarg, :b)),
1483
+ %q{a, o=1, &b})
1484
+
1485
+ # f_arg tCOMMA f_optarg tCOMMA f_arg opt_f_block_arg
1486
+ assert_parses_args(
1487
+ s(:args,
1488
+ s(:arg, :a),
1489
+ s(:optarg, :o, s(:int, 1)),
1490
+ s(:arg, :p),
1491
+ s(:blockarg, :b)),
1492
+ %q{a, o=1, p, &b},
1493
+ ALL_VERSIONS - %w(1.8))
1494
+
1495
+ # f_arg tCOMMA f_rest_arg opt_f_block_arg
1496
+ assert_parses_args(
1497
+ s(:args,
1498
+ s(:arg, :a),
1499
+ s(:splatarg, :r),
1500
+ s(:blockarg, :b)),
1501
+ %q{a, *r, &b})
1502
+
1503
+ # f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
1504
+ assert_parses_args(
1505
+ s(:args,
1506
+ s(:arg, :a),
1507
+ s(:splatarg, :r),
1508
+ s(:arg, :p),
1509
+ s(:blockarg, :b)),
1510
+ %q{a, *r, p, &b},
1511
+ ALL_VERSIONS - %w(1.8))
1512
+
1513
+ # f_arg opt_f_block_arg
1514
+ assert_parses_args(
1515
+ s(:args,
1516
+ s(:arg, :a),
1517
+ s(:blockarg, :b)),
1518
+ %q{a, &b})
1519
+
1520
+ # f_optarg tCOMMA f_rest_arg opt_f_block_arg
1521
+ assert_parses_args(
1522
+ s(:args,
1523
+ s(:optarg, :o, s(:int, 1)),
1524
+ s(:splatarg, :r),
1525
+ s(:blockarg, :b)),
1526
+ %q{o=1, *r, &b})
1527
+
1528
+ # f_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
1529
+ assert_parses_args(
1530
+ s(:args,
1531
+ s(:optarg, :o, s(:int, 1)),
1532
+ s(:splatarg, :r),
1533
+ s(:arg, :p),
1534
+ s(:blockarg, :b)),
1535
+ %q{o=1, *r, p, &b},
1536
+ ALL_VERSIONS - %w(1.8))
1537
+
1538
+ # f_optarg opt_f_block_arg
1539
+ assert_parses_args(
1540
+ s(:args,
1541
+ s(:optarg, :o, s(:int, 1)),
1542
+ s(:blockarg, :b)),
1543
+ %q{o=1, &b})
1544
+
1545
+ # f_optarg tCOMMA f_arg opt_f_block_arg
1546
+ assert_parses_args(
1547
+ s(:args,
1548
+ s(:optarg, :o, s(:int, 1)),
1549
+ s(:arg, :p),
1550
+ s(:blockarg, :b)),
1551
+ %q{o=1, p, &b},
1552
+ ALL_VERSIONS - %w(1.8))
1553
+
1554
+ # f_rest_arg opt_f_block_arg
1555
+ assert_parses_args(
1556
+ s(:args,
1557
+ s(:splatarg, :r),
1558
+ s(:blockarg, :b)),
1559
+ %q{*r, &b})
1560
+
1561
+ # f_rest_arg tCOMMA f_arg opt_f_block_arg
1562
+ assert_parses_args(
1563
+ s(:args,
1564
+ s(:splatarg, :r),
1565
+ s(:arg, :p),
1566
+ s(:blockarg, :b)),
1567
+ %q{*r, p, &b},
1568
+ ALL_VERSIONS - %w(1.8))
1569
+
1570
+ # f_block_arg
1571
+ assert_parses_args(
1572
+ s(:args,
1573
+ s(:blockarg, :b)),
1574
+ %q{&b})
1575
+
1576
+ # (nothing)
1577
+ assert_parses_args(
1578
+ s(:args),
1579
+ %q{})
1580
+ end
1581
+
1582
+ def assert_parses_margs(ast, code, versions=ALL_VERSIONS - %w(1.8))
1583
+ assert_parses_args(
1584
+ s(:args, ast),
1585
+ %Q{(#{code})},
1586
+ versions)
1587
+ end
1588
+
1589
+ def test_marg_combinations
1590
+ # tLPAREN f_margs rparen
1591
+ assert_parses_margs(
1592
+ s(:mlhs,
1593
+ s(:mlhs, s(:arg, :a))),
1594
+ %q{((a))})
1595
+
1596
+ # f_marg_list
1597
+ assert_parses_margs(
1598
+ s(:mlhs, s(:arg, :a), s(:arg, :a1)),
1599
+ %q{(a, a1)})
1600
+
1601
+ # f_marg_list tCOMMA tSTAR f_norm_arg
1602
+ assert_parses_margs(
1603
+ s(:mlhs, s(:arg, :a), s(:splatarg, :s)),
1604
+ %q{(a, *s)})
1605
+
1606
+ # f_marg_list tCOMMA tSTAR f_norm_arg tCOMMA f_marg_list
1607
+ assert_parses_margs(
1608
+ s(:mlhs, s(:arg, :a), s(:splatarg, :s), s(:arg, :p)),
1609
+ %q{(a, *s, p)})
1610
+
1611
+ # f_marg_list tCOMMA tSTAR
1612
+ assert_parses_margs(
1613
+ s(:mlhs, s(:arg, :a), s(:splatarg)),
1614
+ %q{(a, *)})
1615
+
1616
+ # f_marg_list tCOMMA tSTAR tCOMMA f_marg_list
1617
+ assert_parses_margs(
1618
+ s(:mlhs, s(:arg, :a), s(:splatarg), s(:arg, :p)),
1619
+ %q{(a, *, p)})
1620
+
1621
+ # tSTAR f_norm_arg
1622
+ assert_parses_margs(
1623
+ s(:mlhs, s(:splatarg, :s)),
1624
+ %q{(*s)})
1625
+
1626
+ # tSTAR f_norm_arg tCOMMA f_marg_list
1627
+ assert_parses_margs(
1628
+ s(:mlhs, s(:splatarg, :s), s(:arg, :p)),
1629
+ %q{(*s, p)})
1630
+
1631
+ # tSTAR
1632
+ assert_parses_margs(
1633
+ s(:mlhs, s(:splatarg)),
1634
+ %q{(*)})
1635
+
1636
+ # tSTAR tCOMMA f_marg_list
1637
+ assert_parses_margs(
1638
+ s(:mlhs, s(:splatarg), s(:arg, :p)),
1639
+ %q{(*, p)})
1640
+ end
1641
+
1642
+ def assert_parses_blockargs(ast, code, versions=ALL_VERSIONS)
1643
+ assert_parses(
1644
+ s(:block,
1645
+ s(:send, nil, :f),
1646
+ ast, s(:nil)),
1647
+ %Q{f{ #{code} }},
1648
+ %q{},
1649
+ versions)
1650
+ end
1651
+
1652
+ def test_block_arg_combinations
1653
+ # none
1654
+ assert_parses_blockargs(
1655
+ s(:args),
1656
+ %q{})
1657
+
1658
+ # tPIPE tPIPE
1659
+ # tPIPE opt_bv_decl tPIPE
1660
+ assert_parses_blockargs(
1661
+ s(:args),
1662
+ %q{| |})
1663
+
1664
+ assert_parses_blockargs(
1665
+ s(:args, s(:shadowarg, :a)),
1666
+ %q{|;a|},
1667
+ ALL_VERSIONS - %w(1.8))
1668
+
1669
+ # tOROP
1670
+ assert_parses_blockargs(
1671
+ s(:args),
1672
+ %q{||})
1673
+
1674
+ # block_par
1675
+ # block_par tCOMMA
1676
+ # block_par tCOMMA tAMPER lhs
1677
+ # f_arg opt_f_block_arg
1678
+ # f_arg tCOMMA
1679
+ assert_parses_blockargs(
1680
+ s(:args, s(:arg, :a)),
1681
+ %q{|a|})
1682
+
1683
+ assert_parses_blockargs(
1684
+ s(:args, s(:arg, :a), s(:arg, :c)),
1685
+ %q{|a, c|})
1686
+
1687
+ assert_parses_blockargs(
1688
+ s(:args, s(:arg_expr, s(:ivasgn, :@a))),
1689
+ %q{|@a|},
1690
+ %w(1.8))
1691
+
1692
+ assert_parses_blockargs(
1693
+ s(:args, s(:arg, :a)),
1694
+ %q{|a,|})
1695
+
1696
+ assert_parses_blockargs(
1697
+ s(:args, s(:arg, :a), s(:blockarg, :b)),
1698
+ %q{|a, &b|})
1699
+
1700
+ assert_parses_blockargs(
1701
+ s(:args, s(:arg, :a), s(:blockarg_expr, s(:ivasgn, :@b))),
1702
+ %q{|a, &@b|},
1703
+ %w(1.8))
1704
+
1705
+ # block_par tCOMMA tSTAR lhs tCOMMA tAMPER lhs
1706
+ # block_par tCOMMA tSTAR tCOMMA tAMPER lhs
1707
+ # block_par tCOMMA tSTAR lhs
1708
+ # block_par tCOMMA tSTAR
1709
+ # f_arg tCOMMA f_rest_arg opt_f_block_arg
1710
+ assert_parses_blockargs(
1711
+ s(:args, s(:arg, :a), s(:splatarg, :s), s(:blockarg, :b)),
1712
+ %q{|a, *s, &b|})
1713
+
1714
+ assert_parses_blockargs(
1715
+ s(:args, s(:arg, :a),
1716
+ s(:splatarg_expr, s(:ivasgn, :@s)),
1717
+ s(:blockarg_expr, s(:ivasgn, :@b))),
1718
+ %q{|a, *@s, &@b|},
1719
+ %w(1.8))
1720
+
1721
+ assert_parses_blockargs(
1722
+ s(:args, s(:arg, :a), s(:splatarg), s(:blockarg, :b)),
1723
+ %q{|a, *, &b|})
1724
+
1725
+ assert_parses_blockargs(
1726
+ s(:args, s(:arg, :a),
1727
+ s(:splatarg),
1728
+ s(:blockarg_expr, s(:ivasgn, :@b))),
1729
+ %q{|a, *, &@b|},
1730
+ %w(1.8))
1731
+
1732
+ assert_parses_blockargs(
1733
+ s(:args, s(:arg, :a), s(:splatarg, :s)),
1734
+ %q{|a, *s|})
1735
+
1736
+ assert_parses_blockargs(
1737
+ s(:args, s(:arg, :a),
1738
+ s(:splatarg_expr, s(:ivasgn, :@s))),
1739
+ %q{|a, *@s|},
1740
+ %w(1.8))
1741
+
1742
+ assert_parses_blockargs(
1743
+ s(:args, s(:arg, :a), s(:splatarg)),
1744
+ %q{|a, *|})
1745
+
1746
+ # tSTAR lhs tCOMMA tAMPER lhs
1747
+ # tSTAR lhs
1748
+ # tSTAR
1749
+ # tSTAR tCOMMA tAMPER lhs
1750
+ # f_rest_arg opt_f_block_arg
1751
+ assert_parses_blockargs(
1752
+ s(:args, s(:splatarg, :s), s(:blockarg, :b)),
1753
+ %q{|*s, &b|})
1754
+
1755
+ assert_parses_blockargs(
1756
+ s(:args,
1757
+ s(:splatarg_expr, s(:ivasgn, :@s)),
1758
+ s(:blockarg_expr, s(:ivasgn, :@b))),
1759
+ %q{|*@s, &@b|},
1760
+ %w(1.8))
1761
+
1762
+ assert_parses_blockargs(
1763
+ s(:args, s(:splatarg), s(:blockarg, :b)),
1764
+ %q{|*, &b|})
1765
+
1766
+ assert_parses_blockargs(
1767
+ s(:args,
1768
+ s(:splatarg),
1769
+ s(:blockarg_expr, s(:ivasgn, :@b))),
1770
+ %q{|*, &@b|},
1771
+ %w(1.8))
1772
+
1773
+ assert_parses_blockargs(
1774
+ s(:args, s(:splatarg, :s)),
1775
+ %q{|*s|})
1776
+
1777
+ assert_parses_blockargs(
1778
+ s(:args,
1779
+ s(:splatarg_expr, s(:ivasgn, :@s))),
1780
+ %q{|*@s|},
1781
+ %w(1.8))
1782
+
1783
+ assert_parses_blockargs(
1784
+ s(:args, s(:splatarg)),
1785
+ %q{|*|})
1786
+
1787
+ # tAMPER lhs
1788
+ # f_block_arg
1789
+ assert_parses_blockargs(
1790
+ s(:args, s(:blockarg, :b)),
1791
+ %q{|&b|})
1792
+
1793
+ assert_parses_blockargs(
1794
+ s(:args,
1795
+ s(:blockarg_expr, s(:ivasgn, :@b))),
1796
+ %q{|&@b|},
1797
+ %w(1.8))
1798
+
1799
+ # f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
1800
+ assert_parses_blockargs(
1801
+ s(:args,
1802
+ s(:arg, :a),
1803
+ s(:optarg, :o, s(:int, 1)),
1804
+ s(:optarg, :o1, s(:int, 2)),
1805
+ s(:splatarg, :r),
1806
+ s(:blockarg, :b)),
1807
+ %q{|a, o=1, o1=2, *r, &b|},
1808
+ ALL_VERSIONS - %w(1.8))
1809
+
1810
+ # f_arg tCOMMA f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
1811
+ assert_parses_blockargs(
1812
+ s(:args,
1813
+ s(:arg, :a),
1814
+ s(:optarg, :o, s(:int, 1)),
1815
+ s(:splatarg, :r),
1816
+ s(:arg, :p),
1817
+ s(:blockarg, :b)),
1818
+ %q{|a, o=1, *r, p, &b|},
1819
+ ALL_VERSIONS - %w(1.8))
1820
+
1821
+ # f_arg tCOMMA f_block_optarg opt_f_block_arg
1822
+ assert_parses_blockargs(
1823
+ s(:args,
1824
+ s(:arg, :a),
1825
+ s(:optarg, :o, s(:int, 1)),
1826
+ s(:blockarg, :b)),
1827
+ %q{|a, o=1, &b|},
1828
+ ALL_VERSIONS - %w(1.8))
1829
+
1830
+ # f_arg tCOMMA f_block_optarg tCOMMA f_arg opt_f_block_arg
1831
+ assert_parses_blockargs(
1832
+ s(:args,
1833
+ s(:arg, :a),
1834
+ s(:optarg, :o, s(:int, 1)),
1835
+ s(:arg, :p),
1836
+ s(:blockarg, :b)),
1837
+ %q{|a, o=1, p, &b|},
1838
+ ALL_VERSIONS - %w(1.8))
1839
+
1840
+ # f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
1841
+ assert_parses_blockargs(
1842
+ s(:args,
1843
+ s(:arg, :a),
1844
+ s(:splatarg, :r),
1845
+ s(:arg, :p),
1846
+ s(:blockarg, :b)),
1847
+ %q{|a, *r, p, &b|},
1848
+ ALL_VERSIONS - %w(1.8))
1849
+
1850
+ # f_block_optarg tCOMMA f_rest_arg opt_f_block_arg
1851
+ assert_parses_blockargs(
1852
+ s(:args,
1853
+ s(:optarg, :o, s(:int, 1)),
1854
+ s(:splatarg, :r),
1855
+ s(:blockarg, :b)),
1856
+ %q{|o=1, *r, &b|},
1857
+ ALL_VERSIONS - %w(1.8))
1858
+
1859
+ # f_block_optarg tCOMMA f_rest_arg tCOMMA f_arg opt_f_block_arg
1860
+ assert_parses_blockargs(
1861
+ s(:args,
1862
+ s(:optarg, :o, s(:int, 1)),
1863
+ s(:splatarg, :r),
1864
+ s(:arg, :p),
1865
+ s(:blockarg, :b)),
1866
+ %q{|o=1, *r, p, &b|},
1867
+ ALL_VERSIONS - %w(1.8))
1868
+
1869
+ # f_block_optarg opt_f_block_arg
1870
+ assert_parses_blockargs(
1871
+ s(:args,
1872
+ s(:optarg, :o, s(:int, 1)),
1873
+ s(:blockarg, :b)),
1874
+ %q{|o=1, &b|},
1875
+ ALL_VERSIONS - %w(1.8))
1876
+
1877
+ # f_block_optarg tCOMMA f_arg opt_f_block_arg
1878
+ assert_parses_blockargs(
1879
+ s(:args,
1880
+ s(:optarg, :o, s(:int, 1)),
1881
+ s(:arg, :p),
1882
+ s(:blockarg, :b)),
1883
+ %q{|o=1, p, &b|},
1884
+ ALL_VERSIONS - %w(1.8))
1885
+
1886
+ # f_rest_arg tCOMMA f_arg opt_f_block_arg
1887
+ assert_parses_blockargs(
1888
+ s(:args,
1889
+ s(:splatarg, :r),
1890
+ s(:arg, :p),
1891
+ s(:blockarg, :b)),
1892
+ %q{|*r, p, &b|},
1893
+ ALL_VERSIONS - %w(1.8))
1894
+ end
1895
+
1896
+ def test_arg_invalid
1897
+ assert_diagnoses(
1898
+ [:error, :argument_const],
1899
+ %q{def foo(Abc); end},
1900
+ %q{ ~~~ location})
1901
+
1902
+ assert_diagnoses(
1903
+ [:error, :argument_ivar],
1904
+ %q{def foo(@abc); end},
1905
+ %q{ ~~~~ location})
1906
+
1907
+ assert_diagnoses(
1908
+ [:error, :argument_gvar],
1909
+ %q{def foo($abc); end},
1910
+ %q{ ~~~~ location})
1911
+
1912
+ assert_diagnoses(
1913
+ [:error, :argument_cvar],
1914
+ %q{def foo(@@abc); end},
1915
+ %q{ ~~~~~ location})
1916
+ end
1917
+
1918
+ # def test_kwoptarg
1919
+ # flunk
1920
+ # end
1921
+
1922
+ # def test_kwsplat_named
1923
+ # flunk
1924
+ # end
1925
+
1926
+ # def test_kwsplat_unnamed
1927
+ # flunk
1928
+ # end
1929
+
1930
+ #
1931
+ # Sends
1932
+ #
1933
+
1934
+ # To self
1935
+
1936
+ def test_send_self
1937
+ assert_parses(
1938
+ s(:send, nil, :fun),
1939
+ %q{fun},
1940
+ %q{~~~ selector
1941
+ |~~~ expression})
1942
+
1943
+ assert_parses(
1944
+ s(:send, nil, :fun!),
1945
+ %q{fun!},
1946
+ %q{~~~~ selector
1947
+ |~~~~ expression})
1948
+
1949
+ assert_parses(
1950
+ s(:send, nil, :fun, s(:int, 1)),
1951
+ %q{fun(1)},
1952
+ %q{~~~ selector
1953
+ | ^ begin
1954
+ | ^ end
1955
+ |~~~~~~ expression})
1956
+ end
1957
+
1958
+ def test_send_self_block
1959
+ assert_parses(
1960
+ s(:block, s(:send, nil, :fun), s(:args), s(:nil)),
1961
+ %q{fun { }})
1962
+
1963
+ assert_parses(
1964
+ s(:block, s(:send, nil, :fun), s(:args), s(:nil)),
1965
+ %q{fun() { }})
1966
+
1967
+ assert_parses(
1968
+ s(:block, s(:send, nil, :fun, s(:int, 1)), s(:args), s(:nil)),
1969
+ %q{fun(1) { }})
1970
+
1971
+ assert_parses(
1972
+ s(:block, s(:send, nil, :fun), s(:args), s(:nil)),
1973
+ %q{fun do end})
1974
+ end
1975
+
1976
+ def test_send_block_blockarg
1977
+ assert_diagnoses(
1978
+ [:error, :block_and_blockarg],
1979
+ %q{fun(&bar) do end},
1980
+ %q{ ~~~~ location})
1981
+ end
1982
+
1983
+ # To receiver
1984
+
1985
+ def test_send_plain
1986
+ assert_parses(
1987
+ s(:send, s(:lvar, :foo), :fun),
1988
+ %q{foo.fun},
1989
+ %q{ ~~~ selector
1990
+ |~~~~~~~ expression})
1991
+
1992
+ assert_parses(
1993
+ s(:send, s(:lvar, :foo), :fun),
1994
+ %q{foo::fun},
1995
+ %q{ ~~~ selector
1996
+ |~~~~~~~~ expression})
1997
+
1998
+ assert_parses(
1999
+ s(:send, s(:lvar, :foo), :Fun),
2000
+ %q{foo::Fun()},
2001
+ %q{ ~~~ selector
2002
+ |~~~~~~~~~~ expression})
2003
+ end
2004
+
2005
+ def test_send_plain_cmd
2006
+ assert_parses(
2007
+ s(:send, s(:lvar, :foo), :fun, s(:lvar, :bar)),
2008
+ %q{foo.fun bar},
2009
+ %q{ ~~~ selector
2010
+ |~~~~~~~~~~~ expression})
2011
+
2012
+ assert_parses(
2013
+ s(:send, s(:lvar, :foo), :fun, s(:lvar, :bar)),
2014
+ %q{foo::fun bar},
2015
+ %q{ ~~~ selector
2016
+ |~~~~~~~~~~~~ expression})
2017
+
2018
+ assert_parses(
2019
+ s(:send, s(:lvar, :foo), :Fun, s(:lvar, :bar)),
2020
+ %q{foo::Fun bar},
2021
+ %q{ ~~~ selector
2022
+ |~~~~~~~~~~~~ expression})
2023
+ end
2024
+
2025
+ def test_send_block_chain_cmd
2026
+ assert_parses(
2027
+ s(:send,
2028
+ s(:block,
2029
+ s(:send, nil, :meth, s(:int, 1)),
2030
+ s(:args), s(:nil)),
2031
+ :fun, s(:lvar, :bar)),
2032
+ %q{meth 1 do end.fun bar},
2033
+ %q{ ~~~ selector
2034
+ |~~~~~~~~~~~~~~~~~~~~~ expression})
2035
+
2036
+ assert_parses(
2037
+ s(:send,
2038
+ s(:block,
2039
+ s(:send, nil, :meth, s(:int, 1)),
2040
+ s(:args), s(:nil)),
2041
+ :fun, s(:lvar, :bar)),
2042
+ %q{meth 1 do end.fun(bar)},
2043
+ %q{ ~~~ selector
2044
+ | ^ begin
2045
+ | ^ end
2046
+ |~~~~~~~~~~~~~~~~~~~~~~ expression})
2047
+
2048
+ assert_parses(
2049
+ s(:send,
2050
+ s(:block,
2051
+ s(:send, nil, :meth, s(:int, 1)),
2052
+ s(:args), s(:nil)),
2053
+ :fun, s(:lvar, :bar)),
2054
+ %q{meth 1 do end::fun bar},
2055
+ %q{ ~~~ selector
2056
+ |~~~~~~~~~~~~~~~~~~~~~~ expression})
2057
+
2058
+ assert_parses(
2059
+ s(:send,
2060
+ s(:block,
2061
+ s(:send, nil, :meth, s(:int, 1)),
2062
+ s(:args), s(:nil)),
2063
+ :fun, s(:lvar, :bar)),
2064
+ %q{meth 1 do end::fun(bar)},
2065
+ %q{ ~~~ selector
2066
+ | ^ begin
2067
+ | ^ end
2068
+ |~~~~~~~~~~~~~~~~~~~~~~~ expression})
2069
+ end
2070
+
2071
+ def test_send_paren_block_cmd
2072
+ assert_parses(
2073
+ s(:send, nil, :foo,
2074
+ s(:block,
2075
+ s(:send, nil, :meth, s(:int, 1)),
2076
+ s(:args), s(:nil))),
2077
+ %q{foo(meth 1 do end)},
2078
+ %q{},
2079
+ %w(1.8))
2080
+
2081
+ assert_parses(
2082
+ s(:send, nil, :foo,
2083
+ s(:int, 1),
2084
+ s(:block,
2085
+ s(:send, nil, :meth, s(:int, 1)),
2086
+ s(:args), s(:nil))),
2087
+ %q{foo(1, meth 1 do end)},
2088
+ %q{},
2089
+ %w(1.8))
2090
+ end
2091
+
2092
+ def test_send_binary_op
2093
+ assert_parses(
2094
+ s(:send, s(:lvar, :foo), :+, s(:int, 1)),
2095
+ %q{foo + 1},
2096
+ %q{ ~ selector
2097
+ |~~~~~~~ expression})
2098
+
2099
+ assert_parses(
2100
+ s(:send, s(:lvar, :foo), :-, s(:int, 1)),
2101
+ %q{foo - 1})
2102
+
2103
+ assert_parses(
2104
+ s(:send, s(:lvar, :foo), :*, s(:int, 1)),
2105
+ %q{foo * 1})
2106
+
2107
+ assert_parses(
2108
+ s(:send, s(:lvar, :foo), :/, s(:int, 1)),
2109
+ %q{foo / 1})
2110
+
2111
+ assert_parses(
2112
+ s(:send, s(:lvar, :foo), :%, s(:int, 1)),
2113
+ %q{foo % 1})
2114
+
2115
+ assert_parses(
2116
+ s(:send, s(:lvar, :foo), :**, s(:int, 1)),
2117
+ %q{foo ** 1})
2118
+
2119
+ assert_parses(
2120
+ s(:send, s(:lvar, :foo), :|, s(:int, 1)),
2121
+ %q{foo | 1})
2122
+
2123
+ assert_parses(
2124
+ s(:send, s(:lvar, :foo), :^, s(:int, 1)),
2125
+ %q{foo ^ 1})
2126
+
2127
+ assert_parses(
2128
+ s(:send, s(:lvar, :foo), :&, s(:int, 1)),
2129
+ %q{foo & 1})
2130
+
2131
+ assert_parses(
2132
+ s(:send, s(:lvar, :foo), :<=>, s(:int, 1)),
2133
+ %q{foo <=> 1})
2134
+
2135
+ assert_parses(
2136
+ s(:send, s(:lvar, :foo), :<, s(:int, 1)),
2137
+ %q{foo < 1})
2138
+
2139
+ assert_parses(
2140
+ s(:send, s(:lvar, :foo), :<=, s(:int, 1)),
2141
+ %q{foo <= 1})
2142
+
2143
+ assert_parses(
2144
+ s(:send, s(:lvar, :foo), :>, s(:int, 1)),
2145
+ %q{foo > 1})
2146
+
2147
+ assert_parses(
2148
+ s(:send, s(:lvar, :foo), :>=, s(:int, 1)),
2149
+ %q{foo >= 1})
2150
+
2151
+ assert_parses(
2152
+ s(:send, s(:lvar, :foo), :==, s(:int, 1)),
2153
+ %q{foo == 1})
2154
+
2155
+ assert_parses(
2156
+ s(:not, s(:send, s(:lvar, :foo), :==, s(:int, 1))),
2157
+ %q{foo != 1},
2158
+ %q{},
2159
+ %w(1.8))
2160
+
2161
+ assert_parses(
2162
+ s(:send, s(:lvar, :foo), :'!=', s(:int, 1)),
2163
+ %q{foo != 1},
2164
+ %q{},
2165
+ ALL_VERSIONS - %w(1.8))
2166
+
2167
+ assert_parses(
2168
+ s(:send, s(:lvar, :foo), :===, s(:int, 1)),
2169
+ %q{foo === 1})
2170
+
2171
+ assert_parses(
2172
+ s(:send, s(:lvar, :foo), :=~, s(:int, 1)),
2173
+ %q{foo =~ 1})
2174
+
2175
+ assert_parses(
2176
+ s(:not, s(:send, s(:lvar, :foo), :=~, s(:int, 1))),
2177
+ %q{foo !~ 1},
2178
+ %q{},
2179
+ %w(1.8))
2180
+
2181
+ assert_parses(
2182
+ s(:send, s(:lvar, :foo), :'!~', s(:int, 1)),
2183
+ %q{foo !~ 1},
2184
+ %q{},
2185
+ ALL_VERSIONS - %w(1.8))
2186
+
2187
+ assert_parses(
2188
+ s(:send, s(:lvar, :foo), :<<, s(:int, 1)),
2189
+ %q{foo << 1})
2190
+
2191
+ assert_parses(
2192
+ s(:send, s(:lvar, :foo), :>>, s(:int, 1)),
2193
+ %q{foo >> 1})
2194
+ end
2195
+
2196
+ def test_send_unary_op
2197
+ assert_parses(
2198
+ s(:send, s(:lvar, :foo), :-@),
2199
+ %q{-foo},
2200
+ %q{~ selector
2201
+ |~~~~ expression})
2202
+
2203
+ assert_parses(
2204
+ s(:send, s(:lvar, :foo), :+@),
2205
+ %q{+foo})
2206
+
2207
+ assert_parses(
2208
+ s(:send, s(:lvar, :foo), :~),
2209
+ %q{~foo})
2210
+ end
2211
+
2212
+ def test_bang
2213
+ assert_parses(
2214
+ s(:not, s(:lvar, :foo)),
2215
+ %q{!foo},
2216
+ %{},
2217
+ %w(1.8))
2218
+
2219
+ assert_parses(
2220
+ s(:send, s(:lvar, :foo), :'!'),
2221
+ %q{!foo},
2222
+ %{},
2223
+ ALL_VERSIONS - %w(1.8))
2224
+ end
2225
+
2226
+ def test_bang_cmd
2227
+ assert_parses(
2228
+ s(:not, s(:send, nil, :m, s(:lvar, :foo))),
2229
+ %q{!m foo},
2230
+ %{},
2231
+ %w(1.8))
2232
+
2233
+ assert_parses(
2234
+ s(:send, s(:send, nil, :m, s(:lvar, :foo)), :'!'),
2235
+ %q{!m foo},
2236
+ %{},
2237
+ ALL_VERSIONS - %w(1.8))
2238
+ end
2239
+
2240
+ def test_not
2241
+ assert_parses(
2242
+ s(:not, s(:lvar, :foo)),
2243
+ %q{not foo},
2244
+ %{},
2245
+ %w(1.8))
2246
+
2247
+ assert_parses(
2248
+ s(:send, s(:lvar, :foo), :'!'),
2249
+ %q{not foo},
2250
+ %{},
2251
+ ALL_VERSIONS - %w(1.8))
2252
+
2253
+ assert_parses(
2254
+ s(:send, s(:lvar, :foo), :'!'),
2255
+ %q{not(foo)},
2256
+ %{},
2257
+ ALL_VERSIONS - %w(1.8))
2258
+
2259
+ assert_parses(
2260
+ s(:send, s(:nil), :'!'),
2261
+ %q{not()},
2262
+ %{},
2263
+ ALL_VERSIONS - %w(1.8))
2264
+ end
2265
+
2266
+ def test_not_cmd
2267
+ assert_parses(
2268
+ s(:not, s(:send, nil, :m, s(:lvar, :foo))),
2269
+ %q{not m foo},
2270
+ %{},
2271
+ %w(1.8))
2272
+
2273
+ assert_parses(
2274
+ s(:send, s(:send, nil, :m, s(:lvar, :foo)), :'!'),
2275
+ %q{not m foo},
2276
+ %{},
2277
+ ALL_VERSIONS - %w(1.8))
2278
+ end
2279
+
2280
+ def test_pow_precedence
2281
+ assert_parses(
2282
+ s(:send, s(:send, s(:int, 2), :**, s(:int, 10)), :-@),
2283
+ %q{-2 ** 10})
2284
+
2285
+ assert_parses(
2286
+ s(:send, s(:send, s(:float, 2.0), :**, s(:int, 10)), :-@),
2287
+ %q{-2.0 ** 10})
2288
+ end
2289
+
2290
+ def test_send_attr_asgn
2291
+ assert_parses(
2292
+ s(:send, s(:lvar, :foo), :a=, s(:int, 1)),
2293
+ %q{foo.a = 1},
2294
+ %q{ ~~~ selector
2295
+ |~~~~~~~~~ expression})
2296
+
2297
+ assert_parses(
2298
+ s(:send, s(:lvar, :foo), :a=, s(:int, 1)),
2299
+ "foo::a = 1")
2300
+
2301
+ assert_parses(
2302
+ s(:send, s(:lvar, :foo), :A=, s(:int, 1)),
2303
+ "foo.A = 1")
2304
+
2305
+ assert_parses(
2306
+ s(:cdecl, s(:lvar, :foo), :A, s(:int, 1)),
2307
+ "foo::A = 1")
2308
+ end
2309
+
2310
+ def test_send_index
2311
+ assert_parses(
2312
+ s(:send, s(:lvar, :foo), :[],
2313
+ s(:int, 1), s(:int, 2)),
2314
+ %q{foo[1, 2]},
2315
+ %q{ ~~~~~~ selector
2316
+ | ^ begin
2317
+ | ^ end
2318
+ |~~~~~~~~~ expression})
2319
+ end
2320
+
2321
+ def test_send_index_cmd
2322
+ assert_parses(
2323
+ s(:send, s(:lvar, :foo), :[],
2324
+ s(:send, nil, :m, s(:lvar, :bar))),
2325
+ %q{foo[m bar]})
2326
+ end
2327
+
2328
+ def test_send_index_asgn
2329
+ assert_parses(
2330
+ s(:send, s(:lvar, :foo), :[]=,
2331
+ s(:int, 1), s(:int, 2), s(:int, 3)),
2332
+ %q{foo[1, 2] = 3},
2333
+ %q{ ~~~~~~~~ selector
2334
+ | ^ begin
2335
+ | ^ end
2336
+ |~~~~~~~~~~~~~ expression})
2337
+ end
2338
+
2339
+ def test_send_lambda
2340
+ assert_parses(
2341
+ s(:block, s(:send, nil, :lambda),
2342
+ s(:args), s(:nil)),
2343
+ %q{->{ }},
2344
+ %q{~~ selector (send)
2345
+ | ^ begin
2346
+ | ^ end
2347
+ |~~~~~ expression},
2348
+ ALL_VERSIONS - %w(1.8))
2349
+
2350
+ assert_parses(
2351
+ s(:block, s(:send, nil, :lambda),
2352
+ s(:args), s(:nil)),
2353
+ %q{-> do end},
2354
+ %q{~~ selector (send)
2355
+ | ^^ begin
2356
+ | ^^^ end
2357
+ |~~~~~~~~~ expression},
2358
+ ALL_VERSIONS - %w(1.8))
2359
+ end
2360
+
2361
+ def test_send_lambda_args
2362
+ assert_parses(
2363
+ s(:block, s(:send, nil, :lambda),
2364
+ s(:args,
2365
+ s(:arg, :a)),
2366
+ s(:nil)),
2367
+ %q{->(a) { }},
2368
+ %q{~~ selector (send)
2369
+ | ^ begin (args)
2370
+ | ^ end (args)
2371
+ | ^ begin
2372
+ | ^ end
2373
+ |~~~~~ expression},
2374
+ ALL_VERSIONS - %w(1.8))
2375
+ end
2376
+
2377
+ def test_send_lambda_args_shadow
2378
+ assert_parses(
2379
+ s(:block, s(:send, nil, :lambda),
2380
+ s(:args,
2381
+ s(:arg, :a),
2382
+ s(:shadowarg, :foo),
2383
+ s(:shadowarg, :bar)),
2384
+ s(:nil)),
2385
+ %q{->(a; foo, bar) { }},
2386
+ %q{ ~~~ expression (args.shadowarg)},
2387
+ ALL_VERSIONS - %w(1.8))
2388
+ end
2389
+
2390
+ def test_send_call
2391
+ assert_parses(
2392
+ s(:send, s(:lvar, :foo), :call,
2393
+ s(:int, 1)),
2394
+ %q{foo.(1)},
2395
+ %q{ ^ begin
2396
+ | ^ end
2397
+ |~~~~~~~ expression},
2398
+ ALL_VERSIONS - %w(1.8))
2399
+
2400
+ assert_parses(
2401
+ s(:send, s(:lvar, :foo), :call,
2402
+ s(:int, 1)),
2403
+ %q{foo::(1)},
2404
+ %q{ ^ begin
2405
+ | ^ end
2406
+ |~~~~~~~~ expression},
2407
+ ALL_VERSIONS - %w(1.8))
2408
+ end
2409
+
2410
+ # To superclass
2411
+
2412
+ def test_super
2413
+ assert_parses(
2414
+ s(:super, s(:lvar, :foo)),
2415
+ %q{super(foo)},
2416
+ %q{~~~~~ keyword
2417
+ | ^ begin
2418
+ | ^ end
2419
+ |~~~~~~~~~~ expression})
2420
+
2421
+ assert_parses(
2422
+ s(:super, s(:lvar, :foo)),
2423
+ %q{super foo},
2424
+ %q{~~~~~ keyword
2425
+ |~~~~~~~~~ expression})
2426
+
2427
+ assert_parses(
2428
+ s(:super),
2429
+ %q{super()},
2430
+ %q{~~~~~ keyword
2431
+ | ^ begin
2432
+ | ^ end
2433
+ |~~~~~~~ expression})
2434
+ end
2435
+
2436
+ def test_zsuper
2437
+ assert_parses(
2438
+ s(:zsuper),
2439
+ %q{super},
2440
+ %q{~~~~~ keyword
2441
+ |~~~~~ expression})
2442
+ end
2443
+
2444
+ # To block argument
2445
+
2446
+ def test_yield
2447
+ assert_parses(
2448
+ s(:yield, s(:lvar, :foo)),
2449
+ %q{yield(foo)},
2450
+ %q{~~~~~ keyword
2451
+ | ^ begin
2452
+ | ^ end
2453
+ |~~~~~~~~~~ expression})
2454
+
2455
+ assert_parses(
2456
+ s(:yield, s(:lvar, :foo)),
2457
+ %q{yield foo},
2458
+ %q{~~~~~ keyword
2459
+ |~~~~~~~~~ expression})
2460
+
2461
+ assert_parses(
2462
+ s(:yield),
2463
+ %q{yield()},
2464
+ %q{~~~~~ keyword
2465
+ | ^ begin
2466
+ | ^ end
2467
+ |~~~~~~~ expression})
2468
+
2469
+ assert_parses(
2470
+ s(:yield),
2471
+ %q{yield},
2472
+ %q{~~~~~ keyword
2473
+ |~~~~~ expression})
2474
+ end
2475
+
2476
+ # Call arguments
2477
+
2478
+ def test_args_cmd
2479
+ assert_parses(
2480
+ s(:send, nil, :fun,
2481
+ s(:send, nil, :f, s(:lvar, :bar))),
2482
+ %q{fun(f bar)})
2483
+ end
2484
+
2485
+ def test_args_args_star
2486
+ assert_parses(
2487
+ s(:send, nil, :fun,
2488
+ s(:lvar, :foo), s(:splat, s(:lvar, :bar))),
2489
+ %q{fun(foo, *bar)})
2490
+
2491
+ assert_parses(
2492
+ s(:send, nil, :fun,
2493
+ s(:lvar, :foo), s(:splat, s(:lvar, :bar)),
2494
+ s(:block_pass, s(:lvar, :baz))),
2495
+ %q{fun(foo, *bar, &baz)})
2496
+ end
2497
+
2498
+ def test_args_star
2499
+ assert_parses(
2500
+ s(:send, nil, :fun,
2501
+ s(:splat, s(:lvar, :bar))),
2502
+ %q{fun(*bar)})
2503
+
2504
+ assert_parses(
2505
+ s(:send, nil, :fun,
2506
+ s(:splat, s(:lvar, :bar)),
2507
+ s(:block_pass, s(:lvar, :baz))),
2508
+ %q{fun(*bar, &baz)})
2509
+ end
2510
+
2511
+ def test_args_block_pass
2512
+ assert_parses(
2513
+ s(:send, nil, :fun,
2514
+ s(:block_pass, s(:lvar, :bar))),
2515
+ %q{fun(&bar)})
2516
+ end
2517
+
2518
+ def test_args_args_comma
2519
+ assert_parses(
2520
+ s(:send, s(:lvar, :foo), :[],
2521
+ s(:lvar, :bar)),
2522
+ %q{foo[bar,]},
2523
+ %q{},
2524
+ ALL_VERSIONS - %w(1.8))
2525
+ end
2526
+
2527
+ def test_args_assocs
2528
+ assert_parses(
2529
+ s(:send, nil, :fun,
2530
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1)))),
2531
+ %q{fun(:foo => 1)})
2532
+
2533
+ assert_parses(
2534
+ s(:send, nil, :fun,
2535
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2536
+ s(:block_pass, s(:lvar, :baz))),
2537
+ %q{fun(:foo => 1, &baz)})
2538
+ end
2539
+
2540
+ def test_args_assocs_star
2541
+ assert_parses(
2542
+ s(:send, nil, :fun,
2543
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2544
+ s(:splat, s(:lvar, :bar))),
2545
+ %q{fun(:foo => 1, *bar)},
2546
+ %q{},
2547
+ %w(1.8))
2548
+
2549
+ assert_parses(
2550
+ s(:send, nil, :fun,
2551
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2552
+ s(:splat, s(:lvar, :bar)),
2553
+ s(:block_pass, s(:lvar, :baz))),
2554
+ %q{fun(:foo => 1, *bar, &baz)},
2555
+ %q{},
2556
+ %w(1.8))
2557
+ end
2558
+
2559
+ def test_args_assocs_comma
2560
+ assert_parses(
2561
+ s(:send, s(:lvar, :foo), :[],
2562
+ s(:hash, s(:pair, s(:sym, :baz), s(:int, 1)))),
2563
+ %q{foo[:baz => 1,]},
2564
+ %q{},
2565
+ ALL_VERSIONS - %w(1.8))
2566
+ end
2567
+
2568
+ def test_args_args_assocs
2569
+ assert_parses(
2570
+ s(:send, nil, :fun,
2571
+ s(:lvar, :foo),
2572
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1)))),
2573
+ %q{fun(foo, :foo => 1)})
2574
+
2575
+ assert_parses(
2576
+ s(:send, nil, :fun,
2577
+ s(:lvar, :foo),
2578
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2579
+ s(:block_pass, s(:lvar, :baz))),
2580
+ %q{fun(foo, :foo => 1, &baz)})
2581
+ end
2582
+
2583
+ def test_args_args_assocs_comma
2584
+ assert_parses(
2585
+ s(:send, s(:lvar, :foo), :[],
2586
+ s(:lvar, :bar),
2587
+ s(:hash, s(:pair, s(:sym, :baz), s(:int, 1)))),
2588
+ %q{foo[bar, :baz => 1,]},
2589
+ %q{},
2590
+ ALL_VERSIONS - %w(1.8))
2591
+ end
2592
+
2593
+ def test_args_args_assocs_star
2594
+ assert_parses(
2595
+ s(:send, nil, :fun,
2596
+ s(:lvar, :foo),
2597
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2598
+ s(:splat, s(:lvar, :bar))),
2599
+ %q{fun(foo, :foo => 1, *bar)},
2600
+ %q{},
2601
+ %w(1.8))
2602
+
2603
+ assert_parses(
2604
+ s(:send, nil, :fun,
2605
+ s(:lvar, :foo),
2606
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2607
+ s(:splat, s(:lvar, :bar)),
2608
+ s(:block_pass, s(:lvar, :baz))),
2609
+ %q{fun(foo, :foo => 1, *bar, &baz)},
2610
+ %q{},
2611
+ %w(1.8))
2612
+ end
2613
+
2614
+ # Call arguments with whitespace
2615
+
2616
+ def test_space_args_cmd
2617
+ assert_parses(
2618
+ s(:send, nil, :fun,
2619
+ s(:send, nil, :f, s(:lvar, :bar))),
2620
+ %q{fun (f bar)})
2621
+ end
2622
+
2623
+ def test_space_args_arg
2624
+ assert_parses(
2625
+ s(:send, nil, :fun, s(:int, 1)),
2626
+ %q{fun (1)})
2627
+ end
2628
+
2629
+ def test_space_args_arg_block
2630
+ assert_parses(
2631
+ s(:block,
2632
+ s(:send, nil, :fun, s(:int, 1)),
2633
+ s(:args), s(:nil)),
2634
+ %q{fun (1) {}})
2635
+
2636
+ assert_parses(
2637
+ s(:block,
2638
+ s(:send, s(:lvar, :foo), :fun, s(:int, 1)),
2639
+ s(:args), s(:nil)),
2640
+ %q{foo.fun (1) {}})
2641
+
2642
+ assert_parses(
2643
+ s(:block,
2644
+ s(:send, s(:lvar, :foo), :fun, s(:int, 1)),
2645
+ s(:args), s(:nil)),
2646
+ %q{foo::fun (1) {}})
2647
+ end
2648
+
2649
+ def test_space_args_arg_call
2650
+ assert_parses(
2651
+ s(:send, nil, :fun,
2652
+ s(:send, s(:int, 1), :to_i)),
2653
+ %q{fun (1).to_i})
2654
+
2655
+ assert_diagnoses(
2656
+ [:warning, :grouped_expression],
2657
+ %q{fun (1).to_i},
2658
+ %q{ ~~~ location})
2659
+ end
2660
+
2661
+ def test_space_args_block_pass
2662
+ assert_parses(
2663
+ s(:send, nil, :fun,
2664
+ s(:block_pass, s(:lvar, :foo))),
2665
+ %q{fun (&foo)},
2666
+ %q{},
2667
+ %w(1.8))
2668
+ end
2669
+
2670
+ def test_space_args_arg_block_pass
2671
+ assert_parses(
2672
+ s(:send, nil, :fun,
2673
+ s(:lvar, :foo),
2674
+ s(:block_pass, s(:lvar, :bar))),
2675
+ %q{fun (foo, &bar)},
2676
+ %q{},
2677
+ %w(1.8))
2678
+ end
2679
+
2680
+ def test_space_args_args_star
2681
+ assert_parses(
2682
+ s(:send, nil, :fun,
2683
+ s(:lvar, :foo), s(:splat, s(:lvar, :bar))),
2684
+ %q{fun (foo, *bar)},
2685
+ %q{},
2686
+ %w(1.8))
2687
+
2688
+ assert_parses(
2689
+ s(:send, nil, :fun,
2690
+ s(:lvar, :foo), s(:splat, s(:lvar, :bar)),
2691
+ s(:block_pass, s(:lvar, :baz))),
2692
+ %q{fun (foo, *bar, &baz)},
2693
+ %q{},
2694
+ %w(1.8))
2695
+
2696
+ assert_parses(
2697
+ s(:send, nil, :fun,
2698
+ s(:lvar, :foo), s(:int, 1),
2699
+ s(:splat, s(:lvar, :bar))),
2700
+ %q{fun (foo, 1, *bar)},
2701
+ %q{},
2702
+ %w(1.8))
2703
+
2704
+ assert_parses(
2705
+ s(:send, nil, :fun,
2706
+ s(:lvar, :foo), s(:int, 1),
2707
+ s(:splat, s(:lvar, :bar)),
2708
+ s(:block_pass, s(:lvar, :baz))),
2709
+ %q{fun (foo, 1, *bar, &baz)},
2710
+ %q{},
2711
+ %w(1.8))
2712
+ end
2713
+
2714
+ def test_space_args_star
2715
+ assert_parses(
2716
+ s(:send, nil, :fun,
2717
+ s(:splat, s(:lvar, :bar))),
2718
+ %q{fun (*bar)},
2719
+ %q{},
2720
+ %w(1.8))
2721
+
2722
+ assert_parses(
2723
+ s(:send, nil, :fun,
2724
+ s(:splat, s(:lvar, :bar)),
2725
+ s(:block_pass, s(:lvar, :baz))),
2726
+ %q{fun (*bar, &baz)},
2727
+ %q{},
2728
+ %w(1.8))
2729
+ end
2730
+
2731
+ def test_space_args_assocs
2732
+ assert_parses(
2733
+ s(:send, nil, :fun,
2734
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1)))),
2735
+ %q{fun (:foo => 1)},
2736
+ %q{},
2737
+ %w(1.8))
2738
+
2739
+ assert_parses(
2740
+ s(:send, nil, :fun,
2741
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2742
+ s(:block_pass, s(:lvar, :baz))),
2743
+ %q{fun (:foo => 1, &baz)},
2744
+ %q{},
2745
+ %w(1.8))
2746
+ end
2747
+
2748
+ def test_space_args_assocs_star
2749
+ assert_parses(
2750
+ s(:send, nil, :fun,
2751
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2752
+ s(:splat, s(:lvar, :bar))),
2753
+ %q{fun (:foo => 1, *bar)},
2754
+ %q{},
2755
+ %w(1.8))
2756
+
2757
+ assert_parses(
2758
+ s(:send, nil, :fun,
2759
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2760
+ s(:splat, s(:lvar, :bar)),
2761
+ s(:block_pass, s(:lvar, :baz))),
2762
+ %q{fun (:foo => 1, *bar, &baz)},
2763
+ %q{},
2764
+ %w(1.8))
2765
+ end
2766
+
2767
+ def test_space_args_args_assocs
2768
+ assert_parses(
2769
+ s(:send, nil, :fun,
2770
+ s(:lvar, :foo),
2771
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1)))),
2772
+ %q{fun (foo, :foo => 1)},
2773
+ %q{},
2774
+ %w(1.8))
2775
+
2776
+ assert_parses(
2777
+ s(:send, nil, :fun,
2778
+ s(:lvar, :foo),
2779
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2780
+ s(:block_pass, s(:lvar, :baz))),
2781
+ %q{fun (foo, :foo => 1, &baz)},
2782
+ %q{},
2783
+ %w(1.8))
2784
+
2785
+ assert_parses(
2786
+ s(:send, nil, :fun,
2787
+ s(:lvar, :foo), s(:int, 1),
2788
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1)))),
2789
+ %q{fun (foo, 1, :foo => 1)},
2790
+ %q{},
2791
+ %w(1.8))
2792
+
2793
+ assert_parses(
2794
+ s(:send, nil, :fun,
2795
+ s(:lvar, :foo), s(:int, 1),
2796
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2797
+ s(:block_pass, s(:lvar, :baz))),
2798
+ %q{fun (foo, 1, :foo => 1, &baz)},
2799
+ %q{},
2800
+ %w(1.8))
2801
+ end
2802
+
2803
+ def test_space_args_args_assocs_star
2804
+ assert_parses(
2805
+ s(:send, nil, :fun,
2806
+ s(:lvar, :foo),
2807
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2808
+ s(:splat, s(:lvar, :bar))),
2809
+ %q{fun (foo, :foo => 1, *bar)},
2810
+ %q{},
2811
+ %w(1.8))
2812
+
2813
+ assert_parses(
2814
+ s(:send, nil, :fun,
2815
+ s(:lvar, :foo),
2816
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2817
+ s(:splat, s(:lvar, :bar)),
2818
+ s(:block_pass, s(:lvar, :baz))),
2819
+ %q{fun (foo, :foo => 1, *bar, &baz)},
2820
+ %q{},
2821
+ %w(1.8))
2822
+
2823
+ assert_parses(
2824
+ s(:send, nil, :fun,
2825
+ s(:lvar, :foo), s(:int, 1),
2826
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2827
+ s(:splat, s(:lvar, :bar))),
2828
+ %q{fun (foo, 1, :foo => 1, *bar)},
2829
+ %q{},
2830
+ %w(1.8))
2831
+
2832
+ assert_parses(
2833
+ s(:send, nil, :fun,
2834
+ s(:lvar, :foo), s(:int, 1),
2835
+ s(:hash, s(:pair, s(:sym, :foo), s(:int, 1))),
2836
+ s(:splat, s(:lvar, :bar)),
2837
+ s(:block_pass, s(:lvar, :baz))),
2838
+ %q{fun (foo, 1, :foo => 1, *bar, &baz)},
2839
+ %q{},
2840
+ %w(1.8))
2841
+ end
2842
+
2843
+ def test_space_args_arg_arg
2844
+ assert_parses(
2845
+ s(:send, nil, :fun, s(:int, 1), s(:int, 2)),
2846
+ %q{fun (1, 2)},
2847
+ %q{},
2848
+ %w(1.8))
2849
+
2850
+ assert_diagnoses(
2851
+ [:warning, :space_before_lparen],
2852
+ %q{fun (1, 2)},
2853
+ %q{ ^ location},
2854
+ %w(1.8))
2855
+ end
2856
+
2857
+ def test_space_args_none
2858
+ assert_parses(
2859
+ s(:send, nil, :fun),
2860
+ %q{fun ()},
2861
+ %q{},
2862
+ %w(1.8))
2863
+
2864
+ assert_diagnoses(
2865
+ [:warning, :space_before_lparen],
2866
+ %q{fun ()},
2867
+ %q{ ^ location},
2868
+ %w(1.8))
2869
+ end
2870
+
2871
+ def test_space_args_block
2872
+ assert_parses(
2873
+ s(:block,
2874
+ s(:send, nil, :fun),
2875
+ s(:args), s(:nil)),
2876
+ %q{fun () {}},
2877
+ %q{ ^ begin (send)
2878
+ | ^ end (send)},
2879
+ %w(1.8))
2880
+
2881
+ assert_parses(
2882
+ s(:block,
2883
+ s(:send, s(:lvar, :foo), :fun),
2884
+ s(:args), s(:nil)),
2885
+ %q{foo.fun () {}},
2886
+ %q{ ^ begin (send)
2887
+ | ^ end (send)},
2888
+ %w(1.8))
2889
+
2890
+ assert_parses(
2891
+ s(:block,
2892
+ s(:send, s(:lvar, :foo), :fun),
2893
+ s(:args), s(:nil)),
2894
+ %q{foo::fun () {}},
2895
+ %q{ ^ begin (send)
2896
+ | ^ end (send)},
2897
+ %w(1.8))
2898
+ end
2899
+
2900
+ #
2901
+ # Control flow
2902
+ #
2903
+
2904
+ # Operators
2905
+
2906
+ def test_and
2907
+ assert_parses(
2908
+ s(:and, s(:lvar, :foo), s(:lvar, :bar)),
2909
+ %q{foo and bar},
2910
+ %q{ ~~~ operator
2911
+ |~~~~~~~~~~~ expression})
2912
+
2913
+ assert_parses(
2914
+ s(:and, s(:lvar, :foo), s(:lvar, :bar)),
2915
+ %q{foo && bar},
2916
+ %q{ ~~ operator
2917
+ |~~~~~~~~~~ expression})
2918
+ end
2919
+
2920
+ def test_or
2921
+ assert_parses(
2922
+ s(:or, s(:lvar, :foo), s(:lvar, :bar)),
2923
+ %q{foo or bar},
2924
+ %q{ ~~ operator
2925
+ |~~~~~~~~~~ expression})
2926
+
2927
+ assert_parses(
2928
+ s(:or, s(:lvar, :foo), s(:lvar, :bar)),
2929
+ %q{foo || bar},
2930
+ %q{ ~~ operator
2931
+ |~~~~~~~~~~ expression})
2932
+ end
2933
+
2934
+ # Branching
2935
+
2936
+ def test_if
2937
+ assert_parses(
2938
+ s(:if, s(:lvar, :foo), s(:lvar, :bar), nil),
2939
+ %q{if foo then bar; end},
2940
+ %q{~~ keyword
2941
+ | ~~~~ begin
2942
+ | ~~~ end
2943
+ |~~~~~~~~~~~~~~~~~~~~ expression})
2944
+
2945
+ assert_parses(
2946
+ s(:if, s(:lvar, :foo), s(:lvar, :bar), nil),
2947
+ %q{if foo; bar; end},
2948
+ %q{~~ keyword
2949
+ | ~~~ end
2950
+ |~~~~~~~~~~~~~~~~ expression})
2951
+ end
2952
+
2953
+ def test_if_mod
2954
+ assert_parses(
2955
+ s(:if, s(:lvar, :foo), s(:lvar, :bar), nil),
2956
+ %q{bar if foo},
2957
+ %q{ ~~ keyword
2958
+ |~~~~~~~~~~ expression})
2959
+ end
2960
+
2961
+ def test_unless
2962
+ assert_parses(
2963
+ s(:if, s(:lvar, :foo), nil, s(:lvar, :bar)),
2964
+ %q{unless foo then bar; end},
2965
+ %q{~~~~~~ keyword
2966
+ | ~~~~ begin
2967
+ | ~~~ end
2968
+ |~~~~~~~~~~~~~~~~~~~~~~~~ expression})
2969
+
2970
+ assert_parses(
2971
+ s(:if, s(:lvar, :foo), nil, s(:lvar, :bar)),
2972
+ %q{unless foo; bar; end},
2973
+ %q{~~~~~~ keyword
2974
+ | ~~~ end
2975
+ |~~~~~~~~~~~~~~~~~~~~ expression})
2976
+ end
2977
+
2978
+ def test_unless_mod
2979
+ assert_parses(
2980
+ s(:if, s(:lvar, :foo), nil, s(:lvar, :bar)),
2981
+ %q{bar unless foo},
2982
+ %q{ ~~~~~~ keyword
2983
+ |~~~~~~~~~~~~~~ expression})
2984
+ end
2985
+
2986
+ def test_if_else
2987
+ assert_parses(
2988
+ s(:if, s(:lvar, :foo), s(:lvar, :bar), s(:lvar, :baz)),
2989
+ %q{if foo then bar; else baz; end},
2990
+ %q{~~ keyword
2991
+ | ~~~~ begin
2992
+ | ~~~~ else
2993
+ | ~~~ end
2994
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
2995
+
2996
+ assert_parses(
2997
+ s(:if, s(:lvar, :foo), s(:lvar, :bar), s(:lvar, :baz)),
2998
+ %q{if foo; bar; else baz; end},
2999
+ %q{~~ keyword
3000
+ | ~~~~ else
3001
+ | ~~~ end
3002
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3003
+ end
3004
+
3005
+ def test_unless_else
3006
+ assert_parses(
3007
+ s(:if, s(:lvar, :foo), s(:lvar, :baz), s(:lvar, :bar)),
3008
+ %q{unless foo then bar; else baz; end},
3009
+ %q{~~~~~~ keyword
3010
+ | ~~~~ begin
3011
+ | ~~~~ else
3012
+ | ~~~ end
3013
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3014
+
3015
+ assert_parses(
3016
+ s(:if, s(:lvar, :foo), s(:lvar, :baz), s(:lvar, :bar)),
3017
+ %q{unless foo; bar; else baz; end},
3018
+ %q{~~~~~~ keyword
3019
+ | ~~~~ else
3020
+ | ~~~ end
3021
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3022
+ end
3023
+
3024
+ def test_if_elsif
3025
+ assert_parses(
3026
+ s(:if, s(:lvar, :foo), s(:lvar, :bar),
3027
+ s(:if, s(:lvar, :baz), s(:int, 1), s(:int, 2))),
3028
+ %q{if foo; bar; elsif baz; 1; else 2; end},
3029
+ %q{~~ keyword
3030
+ | ~~~~~ else
3031
+ | ~~~~~ keyword (if)
3032
+ | ~~~ end
3033
+ | ~~~ end (if)
3034
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3035
+ end
3036
+
3037
+ def test_ternary
3038
+ assert_parses(
3039
+ s(:if, s(:lvar, :foo), s(:int, 1), s(:int, 2)),
3040
+ %q{foo ? 1 : 2},
3041
+ %q{ ^ question
3042
+ | ^ colon
3043
+ |~~~~~~~~~~~ expression})
3044
+ end
3045
+
3046
+ def test_if_masgn
3047
+ assert_diagnoses(
3048
+ [:error, :masgn_as_condition],
3049
+ %q{if (a, b = foo); end},
3050
+ %q{ ~~~~~~~~~~~~ location})
3051
+ end
3052
+
3053
+ def test_if_mod_masgn
3054
+ assert_diagnoses(
3055
+ [:error, :masgn_as_condition],
3056
+ %q{1 if (a, b = foo)},
3057
+ %q{ ~~~~~~~~~~~~ location})
3058
+ end
3059
+
3060
+ def test_tern_masgn
3061
+ assert_diagnoses(
3062
+ [:error, :masgn_as_condition],
3063
+ %q{(a, b = foo) ? 1 : 2},
3064
+ %q{~~~~~~~~~~~~ location})
3065
+ end
3066
+
3067
+ # Case matching
3068
+
3069
+ def test_case_expr
3070
+ assert_parses(
3071
+ s(:case, s(:lvar, :foo),
3072
+ s(:when, s(:str, 'bar'),
3073
+ s(:lvar, :bar)),
3074
+ nil),
3075
+ %q{case foo; when 'bar'; bar; end},
3076
+ %q{~~~~ keyword
3077
+ | ~~~~ keyword (when)
3078
+ | ~~~ end
3079
+ | ~~~~~~~~~~~~~~~ expression (when)
3080
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3081
+ end
3082
+
3083
+ def test_case_expr_else
3084
+ assert_parses(
3085
+ s(:case, s(:lvar, :foo),
3086
+ s(:when, s(:str, 'bar'),
3087
+ s(:lvar, :bar)),
3088
+ s(:lvar, :baz)),
3089
+ %q{case foo; when 'bar'; bar; else baz; end},
3090
+ %q{~~~~ keyword
3091
+ | ~~~~ keyword (when)
3092
+ | ~~~~ else
3093
+ | ~~~ end
3094
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3095
+ end
3096
+
3097
+ def test_case_cond
3098
+ assert_parses(
3099
+ s(:case, nil,
3100
+ s(:when, s(:lvar, :foo),
3101
+ s(:str, 'foo')),
3102
+ nil),
3103
+ %q{case; when foo; 'foo'; end},
3104
+ %q{~~~~ keyword
3105
+ | ~~~~ keyword (when)
3106
+ | ~~~ end
3107
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3108
+ end
3109
+
3110
+ def test_case_cond_else
3111
+ assert_parses(
3112
+ s(:case, nil,
3113
+ s(:when, s(:lvar, :foo),
3114
+ s(:str, 'foo')),
3115
+ s(:str, 'bar')),
3116
+ %q{case; when foo; 'foo'; else 'bar'; end},
3117
+ %q{~~~~ keyword
3118
+ | ~~~~ keyword (when)
3119
+ | ~~~~ else
3120
+ | ~~~ end
3121
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3122
+ end
3123
+
3124
+ def test_case_cond_just_else
3125
+ assert_parses(
3126
+ s(:case, nil,
3127
+ s(:str, 'bar')),
3128
+ %q{case; else 'bar'; end},
3129
+ %q{~~~~ keyword
3130
+ | ~~~~ else
3131
+ | ~~~ end
3132
+ |~~~~~~~~~~~~~~~~~~~~~ expression},
3133
+ %w(1.8))
3134
+ end
3135
+
3136
+ def test_when_then
3137
+ assert_parses(
3138
+ s(:case, s(:lvar, :foo),
3139
+ s(:when, s(:str, 'bar'),
3140
+ s(:lvar, :bar)),
3141
+ nil),
3142
+ %q{case foo; when 'bar' then bar; end},
3143
+ %q{ ~~~~ keyword (when)
3144
+ | ~~~~ begin (when)
3145
+ | ~~~~~~~~~~~~~~~~~~~ expression (when)})
3146
+ end
3147
+
3148
+ def test_when_multi
3149
+ assert_parses(
3150
+ s(:case, s(:lvar, :foo),
3151
+ s(:when, s(:str, 'bar'), s(:str, 'baz'),
3152
+ s(:lvar, :bar)),
3153
+ nil),
3154
+ %q{case foo; when 'bar', 'baz'; bar; end})
3155
+ end
3156
+
3157
+ def test_when_splat
3158
+ assert_parses(
3159
+ s(:case, s(:lvar, :foo),
3160
+ s(:when,
3161
+ s(:int, 1),
3162
+ s(:splat, s(:lvar, :baz)),
3163
+ s(:lvar, :bar)),
3164
+ s(:when,
3165
+ s(:splat, s(:lvar, :foo)),
3166
+ s(:nil)),
3167
+ nil),
3168
+ %q{case foo; when 1, *baz; bar; when *foo; end},
3169
+ %q{ ^ operator (when/1.splat)
3170
+ | ~~~~ expression (when/1.splat)
3171
+ | ^ operator (when/2.splat)
3172
+ | ~~~~ expression (when/2.splat)})
3173
+ end
3174
+
3175
+ # Looping
3176
+
3177
+ def test_while
3178
+ assert_parses(
3179
+ s(:while, s(:lvar, :foo), s(:send, nil, :meth)),
3180
+ %q{while foo do meth end},
3181
+ %q{~~~~~ keyword
3182
+ | ~~ begin
3183
+ | ~~~ end
3184
+ |~~~~~~~~~~~~~~~~~~~~~ expression})
3185
+
3186
+ assert_parses(
3187
+ s(:while, s(:lvar, :foo), s(:send, nil, :meth)),
3188
+ %q{while foo; meth end},
3189
+ %q{~~~~~ keyword
3190
+ | ~~~ end
3191
+ |~~~~~~~~~~~~~~~~~~~ expression})
3192
+ end
3193
+
3194
+ def test_while_mod
3195
+ assert_parses(
3196
+ s(:while, s(:lvar, :foo), s(:send, nil, :meth)),
3197
+ %q{meth while foo},
3198
+ %q{ ~~~~~ keyword})
3199
+ end
3200
+
3201
+ def test_until
3202
+ assert_parses(
3203
+ s(:until, s(:lvar, :foo), s(:send, nil, :meth)),
3204
+ %q{until foo do meth end},
3205
+ %q{~~~~~ keyword
3206
+ | ~~ begin
3207
+ | ~~~ end})
3208
+
3209
+ assert_parses(
3210
+ s(:until, s(:lvar, :foo), s(:send, nil, :meth)),
3211
+ %q{until foo; meth end},
3212
+ %q{~~~~~ keyword
3213
+ | ~~~ end})
3214
+ end
3215
+
3216
+ def test_until_mod
3217
+ assert_parses(
3218
+ s(:until, s(:lvar, :foo), s(:send, nil, :meth)),
3219
+ %q{meth until foo},
3220
+ %q{ ~~~~~ keyword})
3221
+ end
3222
+
3223
+ # TODO implement this
3224
+ # def test_while_post
3225
+ # assert_parses(
3226
+ # s(:while_post, s(:lvar, :foo), s(:send, nil, :meth)),
3227
+ # %q{begin meth end while foo},
3228
+ # %q{ ~~~~~ keyword})
3229
+ # end
3230
+
3231
+ # TODO implement this
3232
+ # def test_until_post
3233
+ # assert_parses(
3234
+ # s(:until_post, s(:lvar, :foo), s(:send, nil, :meth)),
3235
+ # %q{begin meth end until foo},
3236
+ # %q{ ~~~~~ keyword})
3237
+ # end
3238
+
3239
+ def test_while_masgn
3240
+ assert_diagnoses(
3241
+ [:error, :masgn_as_condition],
3242
+ %q{while (a, b = foo); end},
3243
+ %q{ ~~~~~~~~~~~~ location})
3244
+ end
3245
+
3246
+ def test_while_mod_masgn
3247
+ assert_diagnoses(
3248
+ [:error, :masgn_as_condition],
3249
+ %q{foo while (a, b = foo)},
3250
+ %q{ ~~~~~~~~~~~~ location})
3251
+ end
3252
+
3253
+ def test_for
3254
+ assert_parses(
3255
+ s(:for,
3256
+ s(:lvasgn, :a),
3257
+ s(:lvar, :foo),
3258
+ s(:send, nil, :p, s(:lvar, :a))),
3259
+ %q{for a in foo do p a; end},
3260
+ %q{~~~ keyword
3261
+ | ~~ in
3262
+ | ~~ begin
3263
+ | ~~~ end
3264
+ |~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3265
+
3266
+ assert_parses(
3267
+ s(:for,
3268
+ s(:lvasgn, :a),
3269
+ s(:lvar, :foo),
3270
+ s(:send, nil, :p, s(:lvar, :a))),
3271
+ %q{for a in foo; p a; end})
3272
+ end
3273
+
3274
+ def test_for_mlhs
3275
+ assert_parses(
3276
+ s(:for,
3277
+ s(:mlhs,
3278
+ s(:lvasgn, :a),
3279
+ s(:lvasgn, :b)),
3280
+ s(:lvar, :foo),
3281
+ s(:send, nil, :p, s(:lvar, :a), s(:lvar, :b))),
3282
+ %q{for a, b in foo; p a, b; end},
3283
+ %q{ ~~~~ expression (mlhs)})
3284
+ end
3285
+
3286
+ # Control flow commands
3287
+
3288
+ def test_break
3289
+ assert_parses(
3290
+ s(:break, s(:lvar, :foo)),
3291
+ %q{break(foo)},
3292
+ %q{~~~~~ keyword
3293
+ | ^ begin
3294
+ | ^ end
3295
+ |~~~~~~~~~~ expression},
3296
+ ALL_VERSIONS - %w(1.8))
3297
+
3298
+ assert_parses(
3299
+ s(:break, s(:lvar, :foo)),
3300
+ %q{break(foo)},
3301
+ %q{~~~~~ keyword
3302
+ |~~~~~~~~~~ expression},
3303
+ %w(1.8))
3304
+
3305
+ assert_parses(
3306
+ s(:break, s(:lvar, :foo)),
3307
+ %q{break foo},
3308
+ %q{~~~~~ keyword
3309
+ |~~~~~~~~~ expression})
3310
+
3311
+ assert_parses(
3312
+ s(:break, s(:nil)),
3313
+ %q{break()},
3314
+ %q{~~~~~ keyword
3315
+ |~~~~~~~ expression},
3316
+ ALL_VERSIONS - %w(1.8))
3317
+
3318
+ assert_parses(
3319
+ s(:break),
3320
+ %q{break},
3321
+ %q{~~~~~ keyword
3322
+ |~~~~~ expression})
3323
+ end
3324
+
3325
+ def test_return
3326
+ assert_parses(
3327
+ s(:return, s(:lvar, :foo)),
3328
+ %q{return(foo)},
3329
+ %q{~~~~~~ keyword
3330
+ | ^ begin
3331
+ | ^ end
3332
+ |~~~~~~~~~~~ expression},
3333
+ ALL_VERSIONS - %w(1.8))
3334
+
3335
+ assert_parses(
3336
+ s(:return, s(:lvar, :foo)),
3337
+ %q{return(foo)},
3338
+ %q{~~~~~~ keyword
3339
+ |~~~~~~~~~~~ expression},
3340
+ %w(1.8))
3341
+
3342
+ assert_parses(
3343
+ s(:return, s(:lvar, :foo)),
3344
+ %q{return foo},
3345
+ %q{~~~~~~ keyword
3346
+ |~~~~~~~~~~ expression})
3347
+
3348
+ assert_parses(
3349
+ s(:return, s(:nil)),
3350
+ %q{return()},
3351
+ %q{~~~~~~ keyword
3352
+ |~~~~~~~~ expression},
3353
+ ALL_VERSIONS - %w(1.8))
3354
+
3355
+ assert_parses(
3356
+ s(:return),
3357
+ %q{return},
3358
+ %q{~~~~~~ keyword
3359
+ |~~~~~~ expression})
3360
+ end
3361
+
3362
+ def test_next
3363
+ assert_parses(
3364
+ s(:next, s(:lvar, :foo)),
3365
+ %q{next(foo)},
3366
+ %q{~~~~ keyword
3367
+ | ^ begin
3368
+ | ^ end
3369
+ |~~~~~~~~~ expression},
3370
+ ALL_VERSIONS - %w(1.8))
3371
+
3372
+ assert_parses(
3373
+ s(:next, s(:lvar, :foo)),
3374
+ %q{next(foo)},
3375
+ %q{~~~~ keyword
3376
+ |~~~~~~~~~ expression},
3377
+ %w(1.8))
3378
+
3379
+ assert_parses(
3380
+ s(:next, s(:lvar, :foo)),
3381
+ %q{next foo},
3382
+ %q{~~~~ keyword
3383
+ |~~~~~~~~ expression})
3384
+
3385
+ assert_parses(
3386
+ s(:next, s(:nil)),
3387
+ %q{next()},
3388
+ %q{~~~~ keyword
3389
+ |~~~~~~ expression},
3390
+ ALL_VERSIONS - %w(1.8))
3391
+
3392
+ assert_parses(
3393
+ s(:next),
3394
+ %q{next},
3395
+ %q{~~~~ keyword
3396
+ |~~~~ expression})
3397
+ end
3398
+
3399
+ def test_redo
3400
+ assert_parses(
3401
+ s(:redo),
3402
+ %q{redo},
3403
+ %q{~~~~ keyword
3404
+ |~~~~ expression})
3405
+ end
3406
+
3407
+ # Exception handling
3408
+
3409
+ def test_rescue
3410
+ assert_parses(
3411
+ s(:rescue, s(:send, nil, :meth),
3412
+ s(:resbody, nil, nil, s(:lvar, :foo)),
3413
+ nil),
3414
+ %q{begin; meth; rescue; foo; end},
3415
+ %q{~~~~~ begin
3416
+ | ~~~ end
3417
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3418
+ end
3419
+
3420
+ def test_rescue_else
3421
+ assert_parses(
3422
+ s(:rescue, s(:send, nil, :meth),
3423
+ s(:resbody, nil, nil, s(:lvar, :foo)),
3424
+ s(:lvar, :bar)),
3425
+ %q{begin; meth; rescue; foo; else; bar; end},
3426
+ %q{~~~~~ begin
3427
+ | ~~~~ else
3428
+ | ~~~ end
3429
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3430
+ end
3431
+
3432
+ def test_rescue_else_useless
3433
+ assert_diagnoses(
3434
+ [:warning, :useless_else],
3435
+ %q{begin; 1; else; 2; end},
3436
+ %q{ ~~~~ location})
3437
+ end
3438
+
3439
+ def test_ensure
3440
+ assert_parses(
3441
+ s(:ensure, s(:send, nil, :meth),
3442
+ s(:lvar, :bar)),
3443
+ %q{begin; meth; ensure; bar; end},
3444
+ %q{~~~~~ begin
3445
+ | ~~~~~~ keyword
3446
+ | ~~~ end
3447
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression})
3448
+ end
3449
+
3450
+ def test_rescue_ensure
3451
+ assert_parses(
3452
+ s(:ensure,
3453
+ s(:rescue,
3454
+ s(:send, nil, :meth),
3455
+ s(:resbody, nil, nil, s(:lvar, :baz)),
3456
+ nil),
3457
+ s(:lvar, :bar)),
3458
+ %q{begin; meth; rescue; baz; ensure; bar; end},
3459
+ %q{~~~~~ begin
3460
+ |~~~~~ begin (rescue)
3461
+ | ~~~~~~ keyword
3462
+ | ~~~~~~ keyword (rescue)
3463
+ | ~~~ end
3464
+ | ~~~ end (rescue)
3465
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
3466
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression (rescue)})
3467
+ end
3468
+
3469
+ def test_rescue_else_ensure
3470
+ assert_parses(
3471
+ s(:ensure,
3472
+ s(:rescue,
3473
+ s(:send, nil, :meth),
3474
+ s(:resbody, nil, nil, s(:lvar, :baz)),
3475
+ s(:lvar, :foo)),
3476
+ s(:lvar, :bar)),
3477
+ %q{begin; meth; rescue; baz; else foo; ensure; bar end},
3478
+ %q{~~~~~ begin
3479
+ |~~~~~ begin (rescue)
3480
+ | ~~~~~~ keyword
3481
+ | ~~~~~~ keyword (rescue)
3482
+ | ~~~~ else (rescue)
3483
+ | ~~~ end
3484
+ | ~~~ end (rescue)
3485
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression
3486
+ |~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ expression (rescue)})
3487
+ end
3488
+
3489
+ def test_rescue_mod
3490
+ assert_parses(
3491
+ s(:rescue,
3492
+ s(:send, nil, :meth),
3493
+ s(:resbody, nil, nil, s(:lvar, :bar)),
3494
+ nil),
3495
+ %q{meth rescue bar},
3496
+ %q{ ~~~~~~ keyword (resbody)
3497
+ |~~~~~~~~~~~~~~~ expression})
3498
+ end
3499
+
3500
+ def test_rescue_mod_asgn
3501
+ assert_parses(
3502
+ s(:lvasgn, :foo,
3503
+ s(:rescue,
3504
+ s(:send, nil, :meth),
3505
+ s(:resbody, nil, nil, s(:lvar, :bar)),
3506
+ nil)),
3507
+ %q{foo = meth rescue bar},
3508
+ %q{ ~~~~~~ keyword (rescue.resbody)
3509
+ | ~~~~~~~~~~~~~~~ expression (rescue)
3510
+ |~~~~~~~~~~~~~~~~~~~~~ expression})
3511
+ end
3512
+
3513
+ def test_rescue_mod_op_assign
3514
+ assert_parses(
3515
+ s(:op_asgn,
3516
+ s(:lvasgn, :foo), :+,
3517
+ s(:rescue,
3518
+ s(:send, nil, :meth),
3519
+ s(:resbody, nil, nil, s(:lvar, :bar)),
3520
+ nil)),
3521
+ %q{foo += meth rescue bar},
3522
+ %q{ ~~~~~~ keyword (rescue.resbody)
3523
+ | ~~~~~~~~~~~~~~~ expression (rescue)
3524
+ |~~~~~~~~~~~~~~~~~~~~~~ expression},
3525
+ ALL_VERSIONS - %w(1.8))
3526
+ end
3527
+
3528
+ def test_resbody_list
3529
+ assert_parses(
3530
+ s(:rescue,
3531
+ s(:send, nil, :meth),
3532
+ s(:resbody,
3533
+ s(:array, s(:const, nil, :Exception)),
3534
+ nil,
3535
+ s(:lvar, :bar)),
3536
+ nil),
3537
+ %q{begin; meth; rescue Exception; bar; end})
3538
+ end
3539
+
3540
+ def test_resbody_list_mrhs
3541
+ assert_parses(
3542
+ s(:rescue,
3543
+ s(:send, nil, :meth),
3544
+ s(:resbody,
3545
+ s(:array,
3546
+ s(:const, nil, :Exception),
3547
+ s(:lvar, :foo)),
3548
+ nil,
3549
+ s(:lvar, :bar)),
3550
+ nil),
3551
+ %q{begin; meth; rescue Exception, foo; bar; end})
3552
+ end
3553
+
3554
+ def test_resbody_var
3555
+ assert_parses(
3556
+ s(:rescue,
3557
+ s(:send, nil, :meth),
3558
+ s(:resbody, nil, s(:lvasgn, :ex), s(:lvar, :bar)),
3559
+ nil),
3560
+ %q{begin; meth; rescue => ex; bar; end})
3561
+
3562
+ assert_parses(
3563
+ s(:rescue,
3564
+ s(:send, nil, :meth),
3565
+ s(:resbody, nil, s(:ivasgn, :@ex), s(:lvar, :bar)),
3566
+ nil),
3567
+ %q{begin; meth; rescue => @ex; bar; end})
3568
+ end
3569
+
3570
+ def test_resbody_list_var
3571
+ assert_parses(
3572
+ s(:rescue,
3573
+ s(:send, nil, :meth),
3574
+ s(:resbody,
3575
+ s(:array, s(:lvar, :foo)),
3576
+ s(:lvasgn, :ex),
3577
+ s(:lvar, :bar)),
3578
+ nil),
3579
+ %q{begin; meth; rescue foo => ex; bar; end})
3580
+ end
3581
+
3582
+ def test_retry
3583
+ assert_parses(
3584
+ s(:retry),
3585
+ %q{retry},
3586
+ %q{~~~~~ keyword
3587
+ |~~~~~ expression})
3588
+ end
3589
+
3590
+ # BEGIN and END
3591
+
3592
+ def test_preexe
3593
+ assert_parses(
3594
+ s(:preexe, s(:int, 1)),
3595
+ %q{BEGIN { 1 }},
3596
+ %q{~~~~~ keyword
3597
+ | ^ begin
3598
+ | ^ end})
3599
+ end
3600
+
3601
+ def test_preexe_invalid
3602
+ assert_diagnoses(
3603
+ [:error, :begin_in_method],
3604
+ %q{def f; BEGIN{}; end},
3605
+ %q{ ~~~~~ location},
3606
+ # Yes. *Exclude 1.9*. Sigh.
3607
+ ALL_VERSIONS - %w(1.9))
3608
+ end
3609
+
3610
+ def test_postexe
3611
+ assert_parses(
3612
+ s(:postexe, s(:int, 1)),
3613
+ %q{END { 1 }},
3614
+ %q{~~~ keyword
3615
+ | ^ begin
3616
+ | ^ end})
3617
+
3618
+ assert_diagnoses(
3619
+ [:warning, :end_in_method],
3620
+ %q{def f; END{ 1 }; end},
3621
+ %q{ ~~~ location})
3622
+ end
3623
+
3624
+ #
3625
+ # Error recovery
3626
+ #
3627
+
3628
+ def test_unknown_percent_str
3629
+ assert_diagnoses(
3630
+ [:error, :unexpected_percent_str, { :type => '%k' }],
3631
+ %q{%k[foo]},
3632
+ %q{~~ location})
3633
+ end
3634
+
3635
+ def test_on_error
3636
+ assert_diagnoses(
3637
+ [:error, :unexpected_token, { :token => 'tIDENTIFIER' }],
3638
+ %q{def foo(bar baz); end},
3639
+ %q{ ~~~ location})
3640
+ end
3641
+
3642
+ #
3643
+ # Bug-specific tests
3644
+ #
3645
+
3646
+ def test_bug_cmd_string_lookahead
3647
+ assert_parses(
3648
+ s(:block,
3649
+ s(:send, nil, :desc,
3650
+ s(:str, "foo")),
3651
+ s(:args), s(:nil)),
3652
+ %q{desc "foo" do end})
3653
+ end
3654
+ end