ruby_parser 3.13.1 → 3.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/lib/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