ruby_parser 3.13.1 → 3.14.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/ruby20_parser.y CHANGED
@@ -20,30 +20,30 @@ token kCLASS kMODULE kDEF kUNDEF kBEGIN kRESCUE kENSURE kEND kIF kUNLESS
20
20
  tSTRING tSYMBOL tNL tEH tCOLON tCOMMA tSPACE tSEMI tLAMBDA
21
21
  tLAMBEG tDSTAR tCHAR tSYMBOLS_BEG tQSYMBOLS_BEG tSTRING_DEND tUBANG
22
22
 
23
- prechigh
24
- right tBANG tTILDE tUPLUS
25
- right tPOW
26
- right tUMINUS_NUM tUMINUS
27
- left tSTAR2 tDIVIDE tPERCENT
28
- left tPLUS tMINUS
29
- left tLSHFT tRSHFT
30
- left tAMPER2
31
- left tPIPE tCARET
32
- left tGT tGEQ tLT tLEQ
33
- nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
34
- left tANDOP
35
- left tOROP
36
- nonassoc tDOT2 tDOT3
37
- right tEH tCOLON
38
- left kRESCUE_MOD
39
- right tEQL tOP_ASGN
40
- nonassoc kDEFINED
41
- right kNOT
42
- left kOR kAND
43
- nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
44
- nonassoc tLBRACE_ARG
45
- nonassoc tLOWEST
46
23
  preclow
24
+ nonassoc tLOWEST
25
+ nonassoc tLBRACE_ARG
26
+ nonassoc kIF_MOD kUNLESS_MOD kWHILE_MOD kUNTIL_MOD
27
+ left kOR kAND
28
+ right kNOT
29
+ nonassoc kDEFINED
30
+ right tEQL tOP_ASGN
31
+ left kRESCUE_MOD
32
+ right tEH tCOLON
33
+ nonassoc tDOT2 tDOT3
34
+ left tOROP
35
+ left tANDOP
36
+ nonassoc tCMP tEQ tEQQ tNEQ tMATCH tNMATCH
37
+ left tGT tGEQ tLT tLEQ
38
+ left tPIPE tCARET
39
+ left tAMPER2
40
+ left tLSHFT tRSHFT
41
+ left tPLUS tMINUS
42
+ left tSTAR2 tDIVIDE tPERCENT # TODO: tSTAR2 -> tMULT
43
+ right tUMINUS_NUM tUMINUS
44
+ right tPOW
45
+ right tBANG tTILDE tUPLUS
46
+ prechigh
47
47
 
48
48
  rule
49
49
 
@@ -57,7 +57,8 @@ rule
57
57
 
58
58
  top_compstmt: top_stmts opt_terms
59
59
  {
60
- result = val[0]
60
+ stmt, _ = val
61
+ result = stmt
61
62
  }
62
63
 
63
64
  top_stmts: none
@@ -69,14 +70,6 @@ rule
69
70
  | error top_stmt
70
71
 
71
72
  top_stmt: stmt
72
- {
73
- result = val[0]
74
-
75
- # TODO: remove once I have more confidence this is fixed
76
- # result.each_of_type :call_args do |s|
77
- # debug20 666, s, result
78
- # end
79
- }
80
73
  | klBEGIN
81
74
  {
82
75
  if (self.in_def || self.in_single > 0) then
@@ -87,14 +80,19 @@ rule
87
80
  }
88
81
  begin_block
89
82
  {
90
- _, _, block = val
91
- result = block
83
+ (_, lineno), _, iter = val
84
+ iter.line lineno
85
+
86
+ (_, preexe,) = iter
87
+ preexe.line lineno
88
+
89
+ result = iter
92
90
  }
93
91
 
94
- begin_block: tLCURLY top_compstmt tRCURLY
92
+ begin_block: tLCURLY { result = lexer.lineno } top_compstmt tRCURLY
95
93
  {
96
- _, stmt, _ = val
97
- result = new_iter s(:preexe), 0, stmt
94
+ _, line, stmt, _ = val
95
+ result = new_iter s(:preexe).line(line), 0, stmt
98
96
  }
99
97
 
100
98
  bodystmt: compstmt opt_rescue k_else
@@ -136,34 +134,27 @@ rule
136
134
  stmt_or_begin: stmt
137
135
  | klBEGIN
138
136
  {
139
- if (self.in_def || self.in_single > 0) then
140
- debug20 1
141
- yyerror "BEGIN in method"
142
- end
143
- self.env.extend
144
- }
145
- begin_block
146
- {
147
- _, _, stmt = val
148
- result = stmt
137
+ yyerror "BEGIN is permitted only at toplevel"
149
138
  }
150
139
 
151
140
  stmt: kALIAS fitem
152
141
  {
153
142
  lexer.lex_state = EXPR_FNAME
154
- result = self.lexer.lineno
155
143
  }
156
144
  fitem
157
145
  {
158
- result = s(:alias, val[1], val[3]).line(val[2])
146
+ (_, line), lhs, _, rhs = val
147
+ result = s(:alias, lhs, rhs).line(line).line line
159
148
  }
160
149
  | kALIAS tGVAR tGVAR
161
150
  {
162
- result = s(:valias, val[1].to_sym, val[2].to_sym)
151
+ (_, line), lhs, rhs = val
152
+ result = s(:valias, lhs.to_sym, rhs.to_sym).line line
163
153
  }
164
154
  | kALIAS tGVAR tBACK_REF
165
155
  {
166
- result = s(:valias, val[1].to_sym, :"$#{val[2]}")
156
+ (_, line), lhs, rhs = val
157
+ result = s(:valias, lhs.to_sym, :"$#{rhs}").line line
167
158
  }
168
159
  | kALIAS tGVAR tNTH_REF
169
160
  {
@@ -175,32 +166,41 @@ rule
175
166
  }
176
167
  | stmt kIF_MOD expr_value
177
168
  {
178
- result = new_if val[2], val[0], nil
169
+ t, _, c = val
170
+ result = new_if c, t, nil
179
171
  }
180
172
  | stmt kUNLESS_MOD expr_value
181
173
  {
182
- result = new_if val[2], nil, val[0]
174
+ f, _, c = val
175
+ result = new_if c, nil, f
183
176
  }
184
177
  | stmt kWHILE_MOD expr_value
185
178
  {
186
- result = new_while val[0], val[2], true
179
+ e, _, c = val
180
+ result = new_while e, c, true
187
181
  }
188
182
  | stmt kUNTIL_MOD expr_value
189
183
  {
190
- result = new_until val[0], val[2], true
184
+ e, _, c = val
185
+ result = new_until e, c, true
191
186
  }
192
187
  | stmt kRESCUE_MOD stmt
193
188
  {
194
189
  body, _, resbody = val
195
- result = new_rescue body, new_resbody(s(:array), resbody)
190
+
191
+ resbody = new_resbody s(:array).line(resbody.line), resbody
192
+ result = new_rescue body, resbody
196
193
  }
197
194
  | klEND tLCURLY compstmt tRCURLY
198
195
  {
196
+ (_, line), _, stmt, _ = val
197
+
199
198
  if (self.in_def || self.in_single > 0) then
200
199
  debug20 3
201
200
  yyerror "END in method; use at_exit"
202
201
  end
203
- result = new_iter s(:postexe), 0, val[2]
202
+
203
+ result = new_iter s(:postexe).line(line), 0, stmt
204
204
  }
205
205
  | command_asgn
206
206
  | mlhs tEQL command_call
@@ -209,7 +209,8 @@ rule
209
209
  }
210
210
  | lhs tEQL mrhs
211
211
  {
212
- result = new_assign val[0], s(:svalue, val[2])
212
+ lhs, _, rhs = val
213
+ result = new_assign lhs, s(:svalue, rhs).line(rhs.line)
213
214
  }
214
215
  | mlhs tEQL arg_value
215
216
  {
@@ -235,11 +236,12 @@ rule
235
236
  }
236
237
  | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN command_rhs
237
238
  {
238
- result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
239
+ result = new_op_asgn1 val
239
240
  }
240
241
  | primary_value call_op tIDENTIFIER tOP_ASGN command_rhs
241
242
  {
242
- result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
243
+ prim, _, id, opasgn, rhs = val
244
+ result = s(:op_asgn, prim, rhs, id.to_sym, opasgn.to_sym)
243
245
  if val[1] == '&.'
244
246
  result.sexp_type = :safe_op_asgn
245
247
  end
@@ -278,19 +280,26 @@ rule
278
280
  expr: command_call
279
281
  | expr kAND expr
280
282
  {
281
- result = logical_op :and, val[0], val[2]
283
+ lhs, _, rhs = val
284
+ result = logical_op :and, lhs, rhs
282
285
  }
283
286
  | expr kOR expr
284
287
  {
285
- result = logical_op :or, val[0], val[2]
288
+ lhs, _, rhs = val
289
+ result = logical_op :or, lhs, rhs
286
290
  }
287
291
  | kNOT opt_nl expr
288
292
  {
289
- result = s(:call, val[2], :"!")
293
+ (_, line), _, expr = val
294
+ result = new_call(expr, :"!").line line
295
+ # REFACTOR: call_uni_op
290
296
  }
291
297
  | tBANG command_call
292
298
  {
293
- result = s(:call, val[1], :"!")
299
+ _, cmd = val
300
+ result = new_call(cmd, :"!").line cmd.line
301
+ # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict
302
+ # REFACTOR: call_uni_op -- see parse26.y
294
303
  }
295
304
  | arg
296
305
 
@@ -317,7 +326,8 @@ rule
317
326
  block_command: block_call
318
327
  | block_call call_op2 operation2 command_args
319
328
  {
320
- result = new_call val[0], val[2].to_sym, val[3]
329
+ blk, _, msg, args = val
330
+ result = new_call(blk, msg.to_sym, args).line blk.line
321
331
  }
322
332
 
323
333
  cmd_brace_block: tLBRACE_ARG
@@ -337,26 +347,32 @@ rule
337
347
 
338
348
  fcall: operation
339
349
  {
340
- result = new_call nil, val[0].to_sym
350
+ msg, = val
351
+ result = new_call(nil, msg.to_sym).line lexer.lineno
341
352
  }
342
353
 
343
354
  command: fcall command_args =tLOWEST
344
355
  {
345
- result = val[0].concat val[1].sexp_body # REFACTOR pattern
356
+ call, args = val
357
+ result = call.concat args.sexp_body
346
358
  }
347
359
  | fcall command_args cmd_brace_block
348
360
  {
349
- result = val[0].concat val[1].sexp_body
350
- if val[2] then
351
- block_dup_check result, val[2]
361
+ call, args, block = val
362
+
363
+ result = call.concat args.sexp_body
352
364
 
353
- result, operation = val[2], result
365
+ if block then
366
+ block_dup_check result, block
367
+
368
+ result, operation = block, result
354
369
  result.insert 1, operation
355
370
  end
356
371
  }
357
372
  | primary_value call_op operation2 command_args =tLOWEST
358
373
  {
359
- result = new_call val[0], val[2].to_sym, val[3], val[1]
374
+ lhs, callop, op, args = val
375
+ result = new_call lhs, op.to_sym, args, callop
360
376
  }
361
377
  | primary_value call_op operation2 command_args cmd_brace_block
362
378
  {
@@ -388,7 +404,9 @@ rule
388
404
  }
389
405
  | kYIELD command_args
390
406
  {
391
- result = new_yield val[1]
407
+ (_, line), args = val
408
+ result = new_yield args
409
+ result.line line # TODO: push to new_yield
392
410
  }
393
411
  | k_return call_args
394
412
  {
@@ -397,8 +415,8 @@ rule
397
415
  }
398
416
  | kBREAK call_args
399
417
  {
400
- line = val[0].last
401
- result = s(:break, ret_args(val[1])).line(line)
418
+ (_, line), args = val
419
+ result = s(:break, ret_args(args)).line line
402
420
  }
403
421
  | kNEXT call_args
404
422
  {
@@ -415,56 +433,79 @@ rule
415
433
  mlhs_inner: mlhs_basic
416
434
  | tLPAREN mlhs_inner rparen
417
435
  {
418
- result = s(:masgn, s(:array, val[1]))
436
+ _, arg, _ = val
437
+ l = arg.line
438
+
439
+ result = s(:masgn, s(:array, arg).line(l)).line l
419
440
  }
420
441
 
421
442
  mlhs_basic: mlhs_head
422
443
  {
423
- result = s(:masgn, val[0])
444
+ head, = val
445
+ result = s(:masgn, head).line head.line
424
446
  }
425
447
  | mlhs_head mlhs_item
426
448
  {
427
- result = s(:masgn, val[0] << val[1].compact)
449
+ lhs, rhs = val
450
+ result = s(:masgn, lhs << rhs.compact).line lhs.line
428
451
  }
429
452
  | mlhs_head tSTAR mlhs_node
430
453
  {
431
- result = s(:masgn, val[0] << s(:splat, val[2]))
454
+ head, _, tail = val
455
+ head << s(:splat, tail).line(tail.line)
456
+ result = s(:masgn, head).line head.line
432
457
  }
433
458
  | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
434
459
  {
435
460
  ary1, _, splat, _, ary2 = val
436
461
 
437
- result = list_append ary1, s(:splat, splat)
462
+ result = list_append ary1, s(:splat, splat).line(splat.line)
438
463
  result.concat ary2.sexp_body
439
- result = s(:masgn, result)
464
+ result = s(:masgn, result).line result.line
440
465
  }
441
466
  | mlhs_head tSTAR
442
467
  {
443
- result = s(:masgn, val[0] << s(:splat))
468
+ head, _ = val
469
+ l = head.line
470
+ result = s(:masgn, head << s(:splat).line(l)).line l
444
471
  }
445
472
  | mlhs_head tSTAR tCOMMA mlhs_post
446
473
  {
447
- ary = list_append val[0], s(:splat)
448
- ary.concat val[3].sexp_body
449
- result = s(:masgn, ary)
474
+ head, _, _, post = val
475
+ ary = list_append head, s(:splat).line(head.line)
476
+ ary.concat post.sexp_body
477
+ result = s(:masgn, ary).line ary.line
450
478
  }
451
479
  | tSTAR mlhs_node
452
480
  {
453
- result = s(:masgn, s(:array, s(:splat, val[1])))
481
+ _, node = val
482
+ l = node.line
483
+ splat = s(:splat, node).line l
484
+ ary = s(:array, splat).line l
485
+ result = s(:masgn, ary).line l
454
486
  }
455
487
  | tSTAR mlhs_node tCOMMA mlhs_post
456
488
  {
457
- ary = s(:array, s(:splat, val[1]))
458
- ary.concat val[3].sexp_body
459
- result = s(:masgn, ary)
489
+ _, node, _, post = val
490
+
491
+ splat = s(:splat, node).line node.line
492
+ ary = s(:array, splat).line splat.line
493
+ ary.concat post.sexp_body
494
+ result = s(:masgn, ary).line ary.line
460
495
  }
461
496
  | tSTAR
462
497
  {
463
- result = s(:masgn, s(:array, s(:splat)))
498
+ l = lexer.lineno
499
+ result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l
464
500
  }
465
501
  | tSTAR tCOMMA mlhs_post
466
502
  {
467
- result = s(:masgn, s(:array, s(:splat), *val[2].sexp_body))
503
+ _, _, post = val
504
+ l = post.line
505
+
506
+ splat = s(:splat).line l
507
+ ary = s(:array, splat, *post.sexp_body).line l
508
+ result = s(:masgn, ary).line l
468
509
  }
469
510
 
470
511
  mlhs_item: mlhs_node
@@ -475,7 +516,8 @@ rule
475
516
 
476
517
  mlhs_head: mlhs_item tCOMMA
477
518
  {
478
- result = s(:array, val[0])
519
+ lhs, _ = val
520
+ result = s(:array, lhs).line lhs.line
479
521
  }
480
522
  | mlhs_head mlhs_item tCOMMA
481
523
  {
@@ -484,7 +526,8 @@ rule
484
526
 
485
527
  mlhs_post: mlhs_item
486
528
  {
487
- result = s(:array, val[0])
529
+ item, = val
530
+ result = s(:array, item).line item.line
488
531
  }
489
532
  | mlhs_post tCOMMA mlhs_item
490
533
  {
@@ -509,7 +552,8 @@ rule
509
552
  }
510
553
  | primary_value tCOLON2 tIDENTIFIER
511
554
  {
512
- result = s(:attrasgn, val[0], :"#{val[2]}=")
555
+ recv, _, id = val
556
+ result = new_attrasgn recv, id
513
557
  }
514
558
  | primary_value call_op tCONSTANT
515
559
  {
@@ -522,7 +566,10 @@ rule
522
566
  yyerror "dynamic constant assignment"
523
567
  end
524
568
 
525
- result = s(:const, s(:colon2, val[0], val[2].to_sym), nil)
569
+ expr, _, id = val
570
+ l = expr.line
571
+
572
+ result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l
526
573
  }
527
574
  | tCOLON3 tCONSTANT
528
575
  {
@@ -531,7 +578,10 @@ rule
531
578
  yyerror "dynamic constant assignment"
532
579
  end
533
580
 
534
- result = s(:const, nil, s(:colon3, val[1].to_sym))
581
+ _, id = val
582
+ l = lexer.lineno
583
+
584
+ result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l
535
585
  }
536
586
  | backref
537
587
  {
@@ -540,24 +590,31 @@ rule
540
590
 
541
591
  lhs: user_variable
542
592
  {
593
+ line = lexer.lineno
543
594
  result = self.assignable val[0]
595
+ result.line = line
544
596
  }
545
597
  | keyword_variable
546
598
  {
599
+ line = lexer.lineno
547
600
  result = self.assignable val[0]
601
+ result.line = line
548
602
  debug20 9, val, result
549
603
  }
550
604
  | primary_value tLBRACK2 opt_call_args rbracket
551
605
  {
552
- result = self.aryset val[0], val[2]
606
+ lhs, _, args, _ = val
607
+ result = self.aryset lhs, args
553
608
  }
554
609
  | primary_value call_op tIDENTIFIER # REFACTOR
555
610
  {
556
- result = new_attrasgn val[0], val[2], val[1]
611
+ lhs, op, id = val
612
+ result = new_attrasgn lhs, id, op
557
613
  }
558
614
  | primary_value tCOLON2 tIDENTIFIER
559
615
  {
560
- result = s(:attrasgn, val[0], :"#{val[2]}=")
616
+ lhs, _, id = val
617
+ result = new_attrasgn lhs, id
561
618
  }
562
619
  | primary_value call_op tCONSTANT # REFACTOR?
563
620
  {
@@ -565,21 +622,27 @@ rule
565
622
  }
566
623
  | primary_value tCOLON2 tCONSTANT
567
624
  {
625
+ expr, _, id = val
626
+
568
627
  if (self.in_def || self.in_single > 0) then
569
628
  debug20 10
570
629
  yyerror "dynamic constant assignment"
571
630
  end
572
631
 
573
- result = s(:const, s(:colon2, val[0], val[2].to_sym))
632
+ l = expr.line
633
+ result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l
574
634
  }
575
635
  | tCOLON3 tCONSTANT
576
636
  {
637
+ _, id = val
638
+
577
639
  if (self.in_def || self.in_single > 0) then
578
640
  debug20 11
579
641
  yyerror "dynamic constant assignment"
580
642
  end
581
643
 
582
- result = s(:const, s(:colon3, val[1].to_sym))
644
+ l = lexer.lineno
645
+ result = s(:const, s(:colon3, id.to_sym).line(l)).line l
583
646
  }
584
647
  | backref
585
648
  {
@@ -594,7 +657,8 @@ rule
594
657
 
595
658
  cpath: tCOLON3 cname
596
659
  {
597
- result = s(:colon3, val[1].to_sym)
660
+ _, name = val
661
+ result = s(:colon3, name.to_sym).line lexer.lineno
598
662
  }
599
663
  | cname
600
664
  {
@@ -602,7 +666,10 @@ rule
602
666
  }
603
667
  | primary_value tCOLON2 cname
604
668
  {
605
- result = s(:colon2, val[0], val[2].to_sym)
669
+ pval, _, name = val
670
+
671
+ result = s(:colon2, pval, name.to_sym)
672
+ result.line pval.line
606
673
  }
607
674
 
608
675
  fname: tIDENTIFIER | tCONSTANT | tFID
@@ -623,7 +690,8 @@ rule
623
690
 
624
691
  fitem: fsym
625
692
  {
626
- result = s(:lit, val[0].to_sym)
693
+ id, = val
694
+ result = s(:lit, id.to_sym).line lexer.lineno
627
695
  }
628
696
  | dsym
629
697
 
@@ -646,6 +714,7 @@ rule
646
714
  | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
647
715
  | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
648
716
  | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
717
+ # TODO: tUBANG dead?
649
718
  | tUBANG
650
719
 
651
720
  reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
@@ -668,8 +737,7 @@ rule
668
737
  }
669
738
  | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs
670
739
  {
671
- val[2].sexp_type = :arglist if val[2]
672
- result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
740
+ result = new_op_asgn1 val
673
741
  }
674
742
  | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
675
743
  {
@@ -681,7 +749,9 @@ rule
681
749
  }
682
750
  | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
683
751
  {
684
- result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
752
+ lhs, _, id, op, rhs = val
753
+
754
+ result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line
685
755
  }
686
756
  | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
687
757
  {
@@ -711,18 +781,18 @@ rule
711
781
  {
712
782
  v1, v2 = val[0], val[2]
713
783
  if v1.node_type == :lit and v2.node_type == :lit and Integer === v1.last and Integer === v2.last then
714
- result = s(:lit, (v1.last)..(v2.last))
784
+ result = s(:lit, (v1.last)..(v2.last)).line v1.line
715
785
  else
716
- result = s(:dot2, v1, v2)
786
+ result = s(:dot2, v1, v2).line v1.line
717
787
  end
718
788
  }
719
789
  | arg tDOT3 arg
720
790
  {
721
791
  v1, v2 = val[0], val[2]
722
792
  if v1.node_type == :lit and v2.node_type == :lit and Integer === v1.last and Integer === v2.last then
723
- result = s(:lit, (v1.last)...(v2.last))
793
+ result = s(:lit, (v1.last)...(v2.last)).line v1.line
724
794
  else
725
- result = s(:dot3, v1, v2)
795
+ result = s(:dot3, v1, v2).line v1.line
726
796
  end
727
797
  }
728
798
  | arg tPLUS arg
@@ -751,11 +821,14 @@ rule
751
821
  }
752
822
  | tUMINUS_NUM tINTEGER tPOW arg
753
823
  {
754
- result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
824
+ lit = s(:lit, val[1]).line lexer.lineno
825
+ result = new_call(new_call(lit, :"**", argl(val[3])), :"-@")
755
826
  }
756
827
  | tUMINUS_NUM tFLOAT tPOW arg
757
828
  {
758
- result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
829
+ lit = s(:lit, val[1]).line lexer.lineno
830
+ result = new_call(new_call(lit, :"**", argl(val[3])), :"-@")
831
+
759
832
  ## TODO: why is this 2.0 only?
760
833
  debug20 12, val, result
761
834
  }
@@ -798,15 +871,19 @@ rule
798
871
  }
799
872
  | arg tMATCH arg
800
873
  {
801
- result = new_match val[0], val[2]
874
+ lhs, _, rhs = val
875
+ result = new_match lhs, rhs
802
876
  }
803
877
  | arg tNMATCH arg
804
878
  {
805
- result = s(:not, new_match(val[0], val[2]))
879
+ lhs, _, rhs = val
880
+ result = s(:not, new_match(lhs, rhs)).line lhs.line
806
881
  }
807
882
  | tBANG arg
808
883
  {
809
- result = new_call val[1], :"!"
884
+ _, arg = val
885
+ result = new_call arg, :"!"
886
+ result.line arg.line
810
887
  }
811
888
  | tTILDE arg
812
889
  {
@@ -834,11 +911,13 @@ rule
834
911
  }
835
912
  | kDEFINED opt_nl arg
836
913
  {
837
- result = s(:defined, val[2])
914
+ (_, line), _, arg = val
915
+ result = s(:defined, arg).line line
838
916
  }
839
917
  | arg tEH arg opt_nl tCOLON arg
840
918
  {
841
- result = s(:if, val[0], val[2], val[5])
919
+ c, _, t, _, _, f = val
920
+ result = s(:if, c, t, f).line c.line
842
921
  }
843
922
  | primary
844
923
 
@@ -881,28 +960,25 @@ rule
881
960
  arg_rhs: arg =tOP_ASGN
882
961
  | arg kRESCUE_MOD arg
883
962
  {
884
- body, _, resbody = val
963
+ body, (_, line), resbody = val
885
964
  body = value_expr body
886
965
  resbody = remove_begin resbody
887
- result = new_rescue(body, new_resbody(s(:array), resbody))
966
+
967
+ ary = s(:array).line line
968
+ result = new_rescue(body, new_resbody(ary, resbody))
888
969
  }
889
970
 
890
971
  paren_args: tLPAREN2 opt_call_args rparen
891
972
  {
892
- result = val[1]
973
+ _, args, _ = val
974
+ result = args
893
975
  }
894
976
 
895
977
  opt_paren_args: none
896
978
  | paren_args
897
979
 
898
980
  opt_call_args: none
899
- {
900
- result = val[0]
901
- }
902
981
  | call_args
903
- {
904
- result = val[0]
905
- }
906
982
  | args tCOMMA
907
983
  {
908
984
  result = args val
@@ -952,7 +1028,8 @@ rule
952
1028
 
953
1029
  block_arg: tAMPER arg_value
954
1030
  {
955
- result = s(:block_pass, val[1])
1031
+ _, arg = val
1032
+ result = s(:block_pass, arg).line arg.line
956
1033
  }
957
1034
 
958
1035
  opt_block_arg: tCOMMA block_arg
@@ -963,19 +1040,24 @@ rule
963
1040
 
964
1041
  args: arg_value
965
1042
  {
966
- result = s(:array, val[0])
1043
+ arg, = val
1044
+
1045
+ result = s(:array, arg).line arg.line
967
1046
  }
968
1047
  | tSTAR arg_value
969
1048
  {
970
- result = s(:array, s(:splat, val[1]))
1049
+ _, arg = val
1050
+ result = s(:array, s(:splat, arg).line(arg.line)).line arg.line
971
1051
  }
972
1052
  | args tCOMMA arg_value
973
1053
  {
974
- result = self.list_append val[0], val[2]
1054
+ args, _, id = val
1055
+ result = self.list_append args, id
975
1056
  }
976
- | args tCOMMA tSTAR arg_value
1057
+ | args tCOMMA tSTAR { result = lexer.lineno } arg_value
977
1058
  {
978
- result = self.list_append val[0], s(:splat, val[3])
1059
+ args, _, _, line, id = val
1060
+ result = self.list_append args, s(:splat, id).line(line)
979
1061
  }
980
1062
 
981
1063
  mrhs: args tCOMMA arg_value
@@ -984,11 +1066,15 @@ rule
984
1066
  }
985
1067
  | args tCOMMA tSTAR arg_value
986
1068
  {
987
- result = self.arg_concat val[0], val[3]
1069
+ # FIX: bad shift/reduce conflict with rhs' comma star prod
1070
+ # TODO: make all tXXXX terminals include lexer.lineno
1071
+ arg, _, _, splat = val
1072
+ result = self.arg_concat arg, splat
988
1073
  }
989
1074
  | tSTAR arg_value
990
1075
  {
991
- result = s(:splat, val[1])
1076
+ _, arg = val
1077
+ result = s(:splat, arg).line arg.line
992
1078
  }
993
1079
 
994
1080
  primary: literal
@@ -1003,7 +1089,8 @@ rule
1003
1089
  | backref
1004
1090
  | tFID
1005
1091
  {
1006
- result = new_call nil, val[0].to_sym
1092
+ msg, = val
1093
+ result = new_call nil, msg.to_sym
1007
1094
  }
1008
1095
  | k_begin
1009
1096
  {
@@ -1023,16 +1110,19 @@ rule
1023
1110
 
1024
1111
  result.line = val[1]
1025
1112
  }
1026
- | tLPAREN_ARG rparen
1113
+ | tLPAREN_ARG
1027
1114
  {
1028
- # TODO: lex_state = EXPR_ENDARG in between
1029
- debug20 13, val, result
1115
+ lexer.lex_state = EXPR_ENDARG
1116
+ result = lexer.lineno
1117
+ }
1118
+ rparen
1119
+ {
1120
+ _, line, _ = val
1121
+ result = s(:begin).line line
1030
1122
  }
1031
1123
  | tLPAREN_ARG
1032
1124
  {
1033
1125
  result = lexer.cmdarg.store false
1034
- # result = self.lexer.cmdarg.stack.dup
1035
- # lexer.cmdarg.stack.replace [false] # TODO add api for these
1036
1126
  }
1037
1127
  stmt
1038
1128
  {
@@ -1047,21 +1137,29 @@ rule
1047
1137
  }
1048
1138
  | tLPAREN compstmt tRPAREN
1049
1139
  {
1050
- result = val[1] || s(:nil)
1140
+ _, stmt, _ = val
1141
+ result = stmt
1142
+ result ||= s(:nil).line lexer.lineno
1051
1143
  result.paren = true
1052
1144
  }
1053
1145
  | primary_value tCOLON2 tCONSTANT
1054
1146
  {
1055
- result = s(:colon2, val[0], val[2].to_sym)
1147
+ expr, _, id = val
1148
+
1149
+ result = s(:colon2, expr, id.to_sym).line expr.line
1056
1150
  }
1057
1151
  | tCOLON3 tCONSTANT
1058
1152
  {
1059
- result = s(:colon3, val[1].to_sym)
1153
+ _, id = val
1154
+
1155
+ result = s(:colon3, id.to_sym).line lexer.lineno
1060
1156
  }
1061
- | tLBRACK aref_args tRBRACK
1157
+ | tLBRACK { result = lexer.lineno } aref_args tRBRACK
1062
1158
  {
1063
- result = val[1] || s(:array)
1159
+ _, line, args, _ = val
1160
+ result = args || s(:array)
1064
1161
  result.sexp_type = :array # aref_args is :args
1162
+ result.line line
1065
1163
  }
1066
1164
  | tLBRACE
1067
1165
  {
@@ -1073,7 +1171,8 @@ rule
1073
1171
  }
1074
1172
  | k_return
1075
1173
  {
1076
- result = s(:return)
1174
+ (_, line), = val
1175
+ result = s(:return).line line
1077
1176
  }
1078
1177
  | kYIELD tLPAREN2 call_args rparen
1079
1178
  {
@@ -1089,11 +1188,14 @@ rule
1089
1188
  }
1090
1189
  | kDEFINED opt_nl tLPAREN2 expr rparen
1091
1190
  {
1092
- result = s(:defined, val[3])
1191
+ (_, line), _, _, arg, _ = val
1192
+
1193
+ result = s(:defined, arg).line line
1093
1194
  }
1094
1195
  | kNOT tLPAREN2 expr rparen
1095
1196
  {
1096
- result = s(:call, val[2], :"!")
1197
+ _, _, lhs, _ = val
1198
+ result = new_call lhs, :"!"
1097
1199
  }
1098
1200
  | kNOT tLPAREN2 rparen
1099
1201
  {
@@ -1101,11 +1203,11 @@ rule
1101
1203
  }
1102
1204
  | fcall brace_block
1103
1205
  {
1104
- oper, iter = val[0], val[1]
1105
- call = oper # FIX
1206
+ call, iter = val
1207
+
1106
1208
  iter.insert 1, call
1107
1209
  result = iter
1108
- call.line = iter.line
1210
+ # FIX: probably not: call.line = iter.line
1109
1211
  }
1110
1212
  | method_call
1111
1213
  | method_call brace_block
@@ -1222,7 +1324,7 @@ rule
1222
1324
  # TODO: port local_push_gen and local_pop_gen
1223
1325
  lexer.cmdarg.stack.replace [false]
1224
1326
  }
1225
- f_arglist bodystmt k_end
1327
+ f_arglist bodystmt { result = lexer.lineno } k_end
1226
1328
  {
1227
1329
  in_def, cmdarg = val[2]
1228
1330
 
@@ -1248,9 +1350,8 @@ rule
1248
1350
  }
1249
1351
  f_arglist bodystmt k_end
1250
1352
  {
1251
- line, cmdarg = val[5]
1353
+ _, cmdarg = val[5]
1252
1354
  result = new_defs val
1253
- result[3].line line
1254
1355
 
1255
1356
  lexer.cmdarg.stack.replace cmdarg
1256
1357
 
@@ -1260,19 +1361,23 @@ rule
1260
1361
  }
1261
1362
  | kBREAK
1262
1363
  {
1263
- result = s(:break)
1364
+ (_, line), = val
1365
+ result = s(:break).line line
1264
1366
  }
1265
1367
  | kNEXT
1266
1368
  {
1267
- result = s(:next)
1369
+ (_, line), = val
1370
+ result = s(:next).line line
1268
1371
  }
1269
1372
  | kREDO
1270
1373
  {
1271
- result = s(:redo)
1374
+ (_, line), = val
1375
+ result = s(:redo).line line
1272
1376
  }
1273
1377
  | kRETRY
1274
1378
  {
1275
- result = s(:retry)
1379
+ (_, line), = val
1380
+ result = s(:retry).line line
1276
1381
  }
1277
1382
 
1278
1383
  primary_value: primary
@@ -1311,7 +1416,9 @@ rule
1311
1416
  if_tail: opt_else
1312
1417
  | k_elsif expr_value then compstmt if_tail
1313
1418
  {
1314
- result = s(:if, val[1], val[3], val[4])
1419
+ (_, line), c, _, t, rest = val
1420
+
1421
+ result = s(:if, c, t, rest).line line
1315
1422
  }
1316
1423
 
1317
1424
  opt_else: none
@@ -1334,7 +1441,9 @@ rule
1334
1441
 
1335
1442
  f_marg_list: f_marg
1336
1443
  {
1337
- result = s(:array, val[0])
1444
+ sym, = val
1445
+
1446
+ result = s(:array, sym).line lexer.lineno
1338
1447
  }
1339
1448
  | f_marg_list tCOMMA f_marg
1340
1449
  {
@@ -1408,7 +1517,9 @@ rule
1408
1517
  }
1409
1518
  | f_block_arg
1410
1519
  {
1411
- result = call_args val
1520
+ line = lexer.lineno
1521
+ result = call_args val # TODO: push line down
1522
+ result.line line
1412
1523
  }
1413
1524
 
1414
1525
  opt_block_args_tail: tCOMMA block_args_tail
@@ -1439,7 +1550,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1439
1550
  }
1440
1551
  | f_arg tCOMMA
1441
1552
  {
1442
- result = args val
1553
+ result = args(val) << nil
1443
1554
  }
1444
1555
  | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1445
1556
  {
@@ -1491,7 +1602,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1491
1602
  }
1492
1603
  | tOROP
1493
1604
  {
1494
- result = s(:args)
1605
+ result = s(:args).line lexer.lineno
1495
1606
  }
1496
1607
  | tPIPE block_param opt_bv_decl tPIPE
1497
1608
  {
@@ -1516,33 +1627,33 @@ opt_block_args_tail: tCOMMA block_args_tail
1516
1627
 
1517
1628
  bvar: tIDENTIFIER
1518
1629
  {
1519
- result = s(:shadow, val[0].to_sym)
1630
+ id, = val
1631
+ line = lexer.lineno
1632
+ result = s(:shadow, id.to_sym).line line
1520
1633
  }
1521
1634
  | f_bad_arg
1522
1635
 
1523
1636
  lambda: {
1524
1637
  self.env.extend :dynamic
1525
- result = self.lexer.lineno
1526
-
1527
- result = lexer.lpar_beg
1638
+ result = [lexer.lineno, lexer.lpar_beg]
1528
1639
  lexer.paren_nest += 1
1529
1640
  lexer.lpar_beg = lexer.paren_nest
1530
1641
  }
1531
1642
  f_larglist
1532
1643
  {
1533
- result = [lexer.cmdarg.store(false), self.lexer.lineno]
1644
+ result = lexer.cmdarg.store(false)
1534
1645
  }
1535
1646
  lambda_body
1536
1647
  {
1537
- lpar, args, (cmdarg, lineno), body = val
1648
+ (line, lpar), args, cmdarg, body = val
1538
1649
  lexer.lpar_beg = lpar
1539
1650
 
1540
1651
  lexer.cmdarg.restore cmdarg
1541
1652
  lexer.cmdarg.lexpop
1542
1653
 
1543
- call = new_call nil, :lambda
1654
+ call = s(:lambda).line line
1544
1655
  result = new_iter call, args, body
1545
- result.line = lineno
1656
+ result.line = line
1546
1657
  self.env.unextend
1547
1658
  }
1548
1659
 
@@ -1567,8 +1678,8 @@ opt_block_args_tail: tCOMMA block_args_tail
1567
1678
 
1568
1679
  do_block: k_do_block do_body kEND
1569
1680
  {
1570
- # TODO: maybe fix lineno to kDO's lineno?
1571
- result = val[1]
1681
+ (_, line), iter, _ = val
1682
+ result = iter.line line
1572
1683
  }
1573
1684
 
1574
1685
  block_call: command do_block
@@ -1582,8 +1693,10 @@ opt_block_args_tail: tCOMMA block_args_tail
1582
1693
 
1583
1694
  val = invert_block_call val if inverted? val
1584
1695
 
1585
- result = val[1]
1586
- result.insert 1, val[0]
1696
+ cmd, blk = val
1697
+
1698
+ result = blk
1699
+ result.insert 1, cmd
1587
1700
  }
1588
1701
  | block_call call_op2 operation2 opt_paren_args
1589
1702
  {
@@ -1614,8 +1727,10 @@ opt_block_args_tail: tCOMMA block_args_tail
1614
1727
  }
1615
1728
  paren_args
1616
1729
  {
1617
- args = self.call_args val[2..-1]
1618
- result = val[0].concat args.sexp_body
1730
+ call, lineno, args = val
1731
+
1732
+ result = call.concat args.sexp_body if args
1733
+ result.line lineno
1619
1734
  }
1620
1735
  | primary_value call_op operation2 opt_paren_args
1621
1736
  {
@@ -1643,7 +1758,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1643
1758
  }
1644
1759
  | kSUPER
1645
1760
  {
1646
- result = s(:zsuper)
1761
+ result = s(:zsuper).line lexer.lineno
1647
1762
  }
1648
1763
  | primary_value tLBRACK2 opt_call_args rbracket
1649
1764
  {
@@ -1721,7 +1836,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1721
1836
  (_, line), klasses, var, _, body, rest = val
1722
1837
 
1723
1838
  klasses ||= s(:array)
1724
- klasses << new_assign(var, s(:gvar, :"$!")) if var
1839
+ klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var
1725
1840
  klasses.line line
1726
1841
 
1727
1842
  result = new_resbody(klasses, body)
@@ -1734,7 +1849,8 @@ opt_block_args_tail: tCOMMA block_args_tail
1734
1849
 
1735
1850
  exc_list: arg_value
1736
1851
  {
1737
- result = s(:array, val[0])
1852
+ arg, = val
1853
+ result = s(:array, arg).line arg.line
1738
1854
  }
1739
1855
  | mrhs
1740
1856
  | none
@@ -1747,26 +1863,31 @@ opt_block_args_tail: tCOMMA block_args_tail
1747
1863
 
1748
1864
  opt_ensure: k_ensure compstmt
1749
1865
  {
1750
- _, body = val
1866
+ (_, line), body = val
1751
1867
 
1752
- result = body || s(:nil)
1868
+ result = body || s(:nil).line(line)
1753
1869
  }
1754
1870
  | none
1755
1871
 
1756
1872
  literal: numeric
1757
1873
  {
1874
+ line = lexer.lineno
1758
1875
  result = s(:lit, val[0])
1876
+ result.line = line
1759
1877
  }
1760
1878
  | symbol
1761
1879
  {
1880
+ line = lexer.lineno
1762
1881
  result = s(:lit, val[0])
1882
+ result.line = line
1763
1883
  }
1764
1884
  | dsym
1765
1885
 
1766
1886
  strings: string
1767
1887
  {
1768
- val[0] = s(:dstr, val[0].value) if val[0].sexp_type == :evstr
1769
- result = val[0]
1888
+ str, = val
1889
+ str = s(:dstr, str.value) if str.sexp_type == :evstr
1890
+ result = str
1770
1891
  }
1771
1892
 
1772
1893
  string: tCHAR
@@ -1781,7 +1902,11 @@ opt_block_args_tail: tCOMMA block_args_tail
1781
1902
 
1782
1903
  string1: tSTRING_BEG string_contents tSTRING_END
1783
1904
  {
1784
- result = val[1]
1905
+ _, str, (_, func) = val
1906
+
1907
+ str = dedent str if func =~ RubyLexer::STR_FUNC_ICNTNT
1908
+
1909
+ result = str
1785
1910
  }
1786
1911
  | tSTRING
1787
1912
  {
@@ -1791,6 +1916,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1791
1916
  xstring: tXSTRING_BEG xstring_contents tSTRING_END
1792
1917
  {
1793
1918
  result = new_xstring val[1]
1919
+ # TODO: dedent?!?! SERIOUSLY?!?
1794
1920
  }
1795
1921
 
1796
1922
  regexp: tREGEXP_BEG regexp_contents tREGEXP_END
@@ -1800,7 +1926,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1800
1926
 
1801
1927
  words: tWORDS_BEG tSPACE tSTRING_END
1802
1928
  {
1803
- result = s(:array)
1929
+ result = s(:array).line lexer.lineno
1804
1930
  }
1805
1931
  | tWORDS_BEG word_list tSTRING_END
1806
1932
  {
@@ -1824,25 +1950,28 @@ opt_block_args_tail: tCOMMA block_args_tail
1824
1950
 
1825
1951
  symbols: tSYMBOLS_BEG tSPACE tSTRING_END
1826
1952
  {
1827
- result = s(:array)
1953
+ result = s(:array).line lexer.lineno
1828
1954
  }
1829
- | tSYMBOLS_BEG symbol_list tSTRING_END
1955
+ | tSYMBOLS_BEG { result = lexer.lineno } symbol_list tSTRING_END
1830
1956
  {
1831
- result = val[1]
1957
+ _, line, list, _, = val
1958
+ list.line = line
1959
+ result = list
1832
1960
  }
1833
1961
 
1834
1962
  symbol_list: none
1835
1963
  {
1836
- result = new_symbol_list
1964
+ result = new_symbol_list.line lexer.lineno
1837
1965
  }
1838
1966
  | symbol_list word tSPACE
1839
1967
  {
1840
- result = val[0].dup << new_symbol_list_entry(val)
1968
+ list, * = val
1969
+ result = list.dup << new_symbol_list_entry(val)
1841
1970
  }
1842
1971
 
1843
1972
  qwords: tQWORDS_BEG tSPACE tSTRING_END
1844
1973
  {
1845
- result = s(:array)
1974
+ result = s(:array).line lexer.lineno
1846
1975
  }
1847
1976
  | tQWORDS_BEG qword_list tSTRING_END
1848
1977
  {
@@ -1851,7 +1980,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1851
1980
 
1852
1981
  qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
1853
1982
  {
1854
- result = s(:array)
1983
+ result = s(:array).line lexer.lineno # FIX
1855
1984
  }
1856
1985
  | tQSYMBOLS_BEG qsym_list tSTRING_END
1857
1986
  {
@@ -1878,11 +2007,12 @@ opt_block_args_tail: tCOMMA block_args_tail
1878
2007
 
1879
2008
  string_contents: none
1880
2009
  {
1881
- result = s(:str, "")
2010
+ result = s(:str, "").line lexer.lineno
1882
2011
  }
1883
2012
  | string_contents string_content
1884
2013
  {
1885
- result = literal_concat(val[0], val[1])
2014
+ v1, v2 = val
2015
+ result = literal_concat v1, v2
1886
2016
  }
1887
2017
 
1888
2018
  xstring_contents: none
@@ -1891,7 +2021,8 @@ xstring_contents: none
1891
2021
  }
1892
2022
  | xstring_contents string_content
1893
2023
  {
1894
- result = literal_concat(val[0], val[1])
2024
+ v1, v2 = val
2025
+ result = literal_concat v1, v2
1895
2026
  }
1896
2027
 
1897
2028
  regexp_contents: none
@@ -1900,7 +2031,8 @@ regexp_contents: none
1900
2031
  }
1901
2032
  | regexp_contents string_content
1902
2033
  {
1903
- result = literal_concat(val[0], val[1])
2034
+ v1, v2 = val
2035
+ result = literal_concat v1, v2
1904
2036
  }
1905
2037
 
1906
2038
  string_content: tSTRING_CONTENT
@@ -1916,8 +2048,9 @@ regexp_contents: none
1916
2048
  }
1917
2049
  string_dvar
1918
2050
  {
1919
- lexer.lex_strterm = val[1]
1920
- result = s(:evstr, val[2])
2051
+ _, strterm, str = val
2052
+ lexer.lex_strterm = strterm
2053
+ result = s(:evstr, str).line str.line
1921
2054
  }
1922
2055
  | tSTRING_DBEG
1923
2056
  {
@@ -1927,6 +2060,7 @@ regexp_contents: none
1927
2060
  lexer.cond.store,
1928
2061
  lexer.cmdarg.store,
1929
2062
  lexer.lex_state,
2063
+ lexer.lineno,
1930
2064
  ]
1931
2065
 
1932
2066
  lexer.lex_strterm = nil
@@ -1940,7 +2074,7 @@ regexp_contents: none
1940
2074
  {
1941
2075
  _, memo, stmt, _ = val
1942
2076
 
1943
- lex_strterm, brace_nest, string_nest, oldcond, oldcmdarg, oldlex_state = memo
2077
+ lex_strterm, brace_nest, string_nest, oldcond, oldcmdarg, oldlex_state, line = memo
1944
2078
 
1945
2079
  lexer.lex_strterm = lex_strterm
1946
2080
  lexer.brace_nest = brace_nest
@@ -1957,19 +2091,19 @@ regexp_contents: none
1957
2091
  when :str, :dstr, :evstr then
1958
2092
  result = stmt
1959
2093
  else
1960
- result = s(:evstr, stmt)
2094
+ result = s(:evstr, stmt).line line
1961
2095
  end
1962
2096
  when nil then
1963
- result = s(:evstr)
2097
+ result = s(:evstr).line line
1964
2098
  else
1965
2099
  debug20 25
1966
2100
  raise "unknown string body: #{stmt.inspect}"
1967
2101
  end
1968
2102
  }
1969
2103
 
1970
- string_dvar: tGVAR { result = s(:gvar, val[0].to_sym) }
1971
- | tIVAR { result = s(:ivar, val[0].to_sym) }
1972
- | tCVAR { result = s(:cvar, val[0].to_sym) }
2104
+ string_dvar: tGVAR { result = s(:gvar, val[0].to_sym).line lexer.lineno }
2105
+ | tIVAR { result = s(:ivar, val[0].to_sym).line lexer.lineno }
2106
+ | tCVAR { result = s(:cvar, val[0].to_sym).line lexer.lineno }
1973
2107
  | backref
1974
2108
 
1975
2109
  symbol: tSYMBEG sym
@@ -1986,18 +2120,19 @@ regexp_contents: none
1986
2120
 
1987
2121
  dsym: tSYMBEG xstring_contents tSTRING_END
1988
2122
  {
2123
+ _, result, _ = val
2124
+
1989
2125
  lexer.lex_state = EXPR_END
1990
- result = val[1]
1991
2126
 
1992
- result ||= s(:str, "")
2127
+ result ||= s(:str, "").line lexer.lineno
1993
2128
 
1994
2129
  case result.sexp_type
1995
2130
  when :dstr then
1996
2131
  result.sexp_type = :dsym
1997
2132
  when :str then
1998
- result = s(:lit, result.last.to_sym)
2133
+ result = s(:lit, result.last.to_sym).line result.line
1999
2134
  when :evstr then
2000
- result = s(:dsym, "", result)
2135
+ result = s(:dsym, "", result).line result.line
2001
2136
  else
2002
2137
  debug20 26, val, result
2003
2138
  end
@@ -2020,19 +2155,20 @@ regexp_contents: none
2020
2155
  | tCONSTANT
2021
2156
  | tCVAR
2022
2157
 
2023
- keyword_variable: kNIL { result = s(:nil) }
2024
- | kSELF { result = s(:self) }
2025
- | kTRUE { result = s(:true) }
2026
- | kFALSE { result = s(:false) }
2027
- | k__FILE__ { result = s(:str, self.file) }
2028
- | k__LINE__ { result = s(:lit, lexer.lineno) }
2158
+ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
2159
+ | kSELF { result = s(:self).line lexer.lineno }
2160
+ | kTRUE { result = s(:true).line lexer.lineno }
2161
+ | kFALSE { result = s(:false).line lexer.lineno }
2162
+ | k__FILE__ { result = s(:str, self.file).line lexer.lineno }
2163
+ | k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno }
2029
2164
  | k__ENCODING__
2030
2165
  {
2166
+ l = lexer.lineno
2031
2167
  result =
2032
2168
  if defined? Encoding then
2033
- s(:colon2, s(:const, :Encoding), :UTF_8)
2169
+ s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l
2034
2170
  else
2035
- s(:str, "Unsupported!")
2171
+ s(:str, "Unsupported!").line l
2036
2172
  end
2037
2173
  }
2038
2174
 
@@ -2057,8 +2193,8 @@ keyword_variable: kNIL { result = s(:nil) }
2057
2193
  debug20 29, val, result
2058
2194
  }
2059
2195
 
2060
- backref: tNTH_REF { result = s(:nth_ref, val[0]) }
2061
- | tBACK_REF { result = s(:back_ref, val[0]) }
2196
+ backref: tNTH_REF { result = s(:nth_ref, val[0]).line lexer.lineno }
2197
+ | tBACK_REF { result = s(:back_ref, val[0]).line lexer.lineno }
2062
2198
 
2063
2199
  superclass: tLT
2064
2200
  {
@@ -2213,12 +2349,13 @@ keyword_variable: kNIL { result = s(:nil) }
2213
2349
 
2214
2350
  f_arg: f_arg_item
2215
2351
  {
2216
- case val[0]
2352
+ arg, = val
2353
+
2354
+ case arg
2217
2355
  when Symbol then
2218
- result = s(:args)
2219
- result << val[0]
2356
+ result = s(:args, arg).line lexer.lineno
2220
2357
  when Sexp then
2221
- result = val[0]
2358
+ result = arg
2222
2359
  else
2223
2360
  debug20 32
2224
2361
  raise "Unknown f_arg type: #{val.inspect}"
@@ -2231,7 +2368,7 @@ keyword_variable: kNIL { result = s(:nil) }
2231
2368
  if list.sexp_type == :args then
2232
2369
  result = list
2233
2370
  else
2234
- result = s(:args, list)
2371
+ result = s(:args, list).line list.line
2235
2372
  end
2236
2373
 
2237
2374
  result << item
@@ -2239,22 +2376,24 @@ keyword_variable: kNIL { result = s(:nil) }
2239
2376
 
2240
2377
  f_kw: tLABEL arg_value
2241
2378
  {
2242
- # TODO: call_args
2243
- label, _ = val[0] # TODO: fix lineno?
2379
+ # TODO: new_kw_arg
2380
+ (label, line), arg = val
2381
+
2244
2382
  identifier = label.to_sym
2245
2383
  self.env[identifier] = :lvar
2246
2384
 
2247
- result = s(:array, s(:kwarg, identifier, val[1]))
2385
+ kwarg = s(:kwarg, identifier, arg).line line
2386
+ result = s(:array, kwarg).line line
2248
2387
  }
2249
2388
 
2250
2389
  f_block_kw: tLABEL primary_value
2251
2390
  {
2252
- # TODO: call_args
2253
- label, _ = val[0] # TODO: fix lineno?
2254
- identifier = label.to_sym
2255
- self.env[identifier] = :lvar
2391
+ # TODO: new_kw_arg
2392
+ (label, line), expr = val
2393
+ id = label.to_sym
2394
+ self.env[id] = :lvar
2256
2395
 
2257
- result = s(:array, s(:kwarg, identifier, val[1]))
2396
+ result = s(:array, s(:kwarg, id, expr).line(line)).line line
2258
2397
  }
2259
2398
 
2260
2399
  f_block_kwarg: f_block_kw
@@ -2297,17 +2436,20 @@ keyword_variable: kNIL { result = s(:nil) }
2297
2436
 
2298
2437
  f_block_optarg: f_block_opt
2299
2438
  {
2300
- result = s(:block, val[0])
2439
+ optblk, = val
2440
+ result = s(:block, optblk).line optblk.line
2301
2441
  }
2302
2442
  | f_block_optarg tCOMMA f_block_opt
2303
2443
  {
2304
- result = val[0]
2305
- result << val[2]
2444
+ optarg, _, optblk = val
2445
+ result = optarg
2446
+ result << optblk
2306
2447
  }
2307
2448
 
2308
2449
  f_optarg: f_opt
2309
2450
  {
2310
- result = s(:block, val[0])
2451
+ opt, = val
2452
+ result = s(:block, opt).line opt.line
2311
2453
  }
2312
2454
  | f_optarg tCOMMA f_opt
2313
2455
  {
@@ -2361,14 +2503,11 @@ keyword_variable: kNIL { result = s(:nil) }
2361
2503
  result.sexp_type == :lit
2362
2504
  }
2363
2505
 
2364
- assoc_list: none # [!nil]
2506
+ assoc_list: none
2365
2507
  {
2366
- result = s(:array)
2367
- }
2368
- | assocs trailer # [!nil]
2369
- {
2370
- result = val[0]
2508
+ result = s(:array).line lexer.lineno
2371
2509
  }
2510
+ | assocs trailer
2372
2511
 
2373
2512
  assocs: assoc
2374
2513
  | assocs tCOMMA assoc
@@ -2382,16 +2521,21 @@ keyword_variable: kNIL { result = s(:nil) }
2382
2521
 
2383
2522
  assoc: arg_value tASSOC arg_value
2384
2523
  {
2385
- result = s(:array, val[0], val[2])
2524
+ v1, _, v2 = val
2525
+ result = s(:array, v1, v2).line v1.line
2386
2526
  }
2387
2527
  | tLABEL arg_value
2388
2528
  {
2389
- (label, _), arg = val
2390
- result = s(:array, s(:lit, label.to_sym), arg)
2529
+ (label, line), arg = val
2530
+
2531
+ lit = s(:lit, label.to_sym).line line
2532
+ result = s(:array, lit, arg).line line
2391
2533
  }
2392
2534
  | tDSTAR arg_value
2393
2535
  {
2394
- result = s(:array, s(:kwsplat, val[1]))
2536
+ _, arg = val
2537
+ line = arg.line
2538
+ result = s(:array, s(:kwsplat, arg).line(line)).line line
2395
2539
  }
2396
2540
 
2397
2541
  operation: tIDENTIFIER | tCONSTANT | tFID