ruby_parser 3.13.1 → 3.15.1

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.
@@ -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
@@ -255,13 +257,15 @@ rule
255
257
  }
256
258
  | primary_value tCOLON2 tCONSTANT tOP_ASGN command_rhs
257
259
  {
258
- result = s(:op_asgn, val[0], val[4], val[2], val[3])
259
- debug20 4, val, result
260
+ lhs1, _, lhs2, op, rhs = val
261
+
262
+ result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, op.to_sym)
260
263
  }
261
264
  | primary_value tCOLON2 tIDENTIFIER tOP_ASGN command_rhs
262
265
  {
263
- result = s(:op_asgn, val[0], val[4], val[2], val[3])
264
- debug20 5, val, result
266
+ lhs1, _, lhs2, op, rhs = val
267
+
268
+ result = s(:op_asgn, lhs1, rhs, lhs2.to_sym, op.to_sym)
265
269
  }
266
270
  | backref tOP_ASGN command_rhs
267
271
  {
@@ -278,19 +282,26 @@ rule
278
282
  expr: command_call
279
283
  | expr kAND expr
280
284
  {
281
- result = logical_op :and, val[0], val[2]
285
+ lhs, _, rhs = val
286
+ result = logical_op :and, lhs, rhs
282
287
  }
283
288
  | expr kOR expr
284
289
  {
285
- result = logical_op :or, val[0], val[2]
290
+ lhs, _, rhs = val
291
+ result = logical_op :or, lhs, rhs
286
292
  }
287
293
  | kNOT opt_nl expr
288
294
  {
289
- result = s(:call, val[2], :"!")
295
+ (_, line), _, expr = val
296
+ result = new_call(expr, :"!").line line
297
+ # REFACTOR: call_uni_op
290
298
  }
291
299
  | tBANG command_call
292
300
  {
293
- result = s(:call, val[1], :"!")
301
+ _, cmd = val
302
+ result = new_call(cmd, :"!").line cmd.line
303
+ # TODO: fix line number to tBANG... but causes BAD shift/reduce conflict
304
+ # REFACTOR: call_uni_op -- see parse26.y
294
305
  }
295
306
  | arg
296
307
 
@@ -317,7 +328,8 @@ rule
317
328
  block_command: block_call
318
329
  | block_call call_op2 operation2 command_args
319
330
  {
320
- result = new_call val[0], val[2].to_sym, val[3]
331
+ blk, _, msg, args = val
332
+ result = new_call(blk, msg.to_sym, args).line blk.line
321
333
  }
322
334
 
323
335
  cmd_brace_block: tLBRACE_ARG
@@ -337,26 +349,32 @@ rule
337
349
 
338
350
  fcall: operation
339
351
  {
340
- result = new_call nil, val[0].to_sym
352
+ msg, = val
353
+ result = new_call(nil, msg.to_sym).line lexer.lineno
341
354
  }
342
355
 
343
356
  command: fcall command_args =tLOWEST
344
357
  {
345
- result = val[0].concat val[1].sexp_body # REFACTOR pattern
358
+ call, args = val
359
+ result = call.concat args.sexp_body
346
360
  }
347
361
  | fcall command_args cmd_brace_block
348
362
  {
349
- result = val[0].concat val[1].sexp_body
350
- if val[2] then
351
- block_dup_check result, val[2]
363
+ call, args, block = val
364
+
365
+ result = call.concat args.sexp_body
366
+
367
+ if block then
368
+ block_dup_check result, block
352
369
 
353
- result, operation = val[2], result
370
+ result, operation = block, result
354
371
  result.insert 1, operation
355
372
  end
356
373
  }
357
374
  | primary_value call_op operation2 command_args =tLOWEST
358
375
  {
359
- result = new_call val[0], val[2].to_sym, val[3], val[1]
376
+ lhs, callop, op, args = val
377
+ result = new_call lhs, op.to_sym, args, callop
360
378
  }
361
379
  | primary_value call_op operation2 command_args cmd_brace_block
362
380
  {
@@ -388,7 +406,9 @@ rule
388
406
  }
389
407
  | kYIELD command_args
390
408
  {
391
- result = new_yield val[1]
409
+ (_, line), args = val
410
+ result = new_yield args
411
+ result.line line # TODO: push to new_yield
392
412
  }
393
413
  | k_return call_args
394
414
  {
@@ -397,8 +417,8 @@ rule
397
417
  }
398
418
  | kBREAK call_args
399
419
  {
400
- line = val[0].last
401
- result = s(:break, ret_args(val[1])).line(line)
420
+ (_, line), args = val
421
+ result = s(:break, ret_args(args)).line line
402
422
  }
403
423
  | kNEXT call_args
404
424
  {
@@ -415,56 +435,79 @@ rule
415
435
  mlhs_inner: mlhs_basic
416
436
  | tLPAREN mlhs_inner rparen
417
437
  {
418
- result = s(:masgn, s(:array, val[1]))
438
+ _, arg, _ = val
439
+ l = arg.line
440
+
441
+ result = s(:masgn, s(:array, arg).line(l)).line l
419
442
  }
420
443
 
421
444
  mlhs_basic: mlhs_head
422
445
  {
423
- result = s(:masgn, val[0])
446
+ head, = val
447
+ result = s(:masgn, head).line head.line
424
448
  }
425
449
  | mlhs_head mlhs_item
426
450
  {
427
- result = s(:masgn, val[0] << val[1].compact)
451
+ lhs, rhs = val
452
+ result = s(:masgn, lhs << rhs.compact).line lhs.line
428
453
  }
429
454
  | mlhs_head tSTAR mlhs_node
430
455
  {
431
- result = s(:masgn, val[0] << s(:splat, val[2]))
456
+ head, _, tail = val
457
+ head << s(:splat, tail).line(tail.line)
458
+ result = s(:masgn, head).line head.line
432
459
  }
433
460
  | mlhs_head tSTAR mlhs_node tCOMMA mlhs_post
434
461
  {
435
462
  ary1, _, splat, _, ary2 = val
436
463
 
437
- result = list_append ary1, s(:splat, splat)
464
+ result = list_append ary1, s(:splat, splat).line(splat.line)
438
465
  result.concat ary2.sexp_body
439
- result = s(:masgn, result)
466
+ result = s(:masgn, result).line result.line
440
467
  }
441
468
  | mlhs_head tSTAR
442
469
  {
443
- result = s(:masgn, val[0] << s(:splat))
470
+ head, _ = val
471
+ l = head.line
472
+ result = s(:masgn, head << s(:splat).line(l)).line l
444
473
  }
445
474
  | mlhs_head tSTAR tCOMMA mlhs_post
446
475
  {
447
- ary = list_append val[0], s(:splat)
448
- ary.concat val[3].sexp_body
449
- result = s(:masgn, ary)
476
+ head, _, _, post = val
477
+ ary = list_append head, s(:splat).line(head.line)
478
+ ary.concat post.sexp_body
479
+ result = s(:masgn, ary).line ary.line
450
480
  }
451
481
  | tSTAR mlhs_node
452
482
  {
453
- result = s(:masgn, s(:array, s(:splat, val[1])))
483
+ _, node = val
484
+ l = node.line
485
+ splat = s(:splat, node).line l
486
+ ary = s(:array, splat).line l
487
+ result = s(:masgn, ary).line l
454
488
  }
455
489
  | tSTAR mlhs_node tCOMMA mlhs_post
456
490
  {
457
- ary = s(:array, s(:splat, val[1]))
458
- ary.concat val[3].sexp_body
459
- result = s(:masgn, ary)
491
+ _, node, _, post = val
492
+
493
+ splat = s(:splat, node).line node.line
494
+ ary = s(:array, splat).line splat.line
495
+ ary.concat post.sexp_body
496
+ result = s(:masgn, ary).line ary.line
460
497
  }
461
498
  | tSTAR
462
499
  {
463
- result = s(:masgn, s(:array, s(:splat)))
500
+ l = lexer.lineno
501
+ result = s(:masgn, s(:array, s(:splat).line(l)).line(l)).line l
464
502
  }
465
503
  | tSTAR tCOMMA mlhs_post
466
504
  {
467
- result = s(:masgn, s(:array, s(:splat), *val[2].sexp_body))
505
+ _, _, post = val
506
+ l = post.line
507
+
508
+ splat = s(:splat).line l
509
+ ary = s(:array, splat, *post.sexp_body).line l
510
+ result = s(:masgn, ary).line l
468
511
  }
469
512
 
470
513
  mlhs_item: mlhs_node
@@ -475,7 +518,8 @@ rule
475
518
 
476
519
  mlhs_head: mlhs_item tCOMMA
477
520
  {
478
- result = s(:array, val[0])
521
+ lhs, _ = val
522
+ result = s(:array, lhs).line lhs.line
479
523
  }
480
524
  | mlhs_head mlhs_item tCOMMA
481
525
  {
@@ -484,7 +528,8 @@ rule
484
528
 
485
529
  mlhs_post: mlhs_item
486
530
  {
487
- result = s(:array, val[0])
531
+ item, = val
532
+ result = s(:array, item).line item.line
488
533
  }
489
534
  | mlhs_post tCOMMA mlhs_item
490
535
  {
@@ -509,7 +554,8 @@ rule
509
554
  }
510
555
  | primary_value tCOLON2 tIDENTIFIER
511
556
  {
512
- result = s(:attrasgn, val[0], :"#{val[2]}=")
557
+ recv, _, id = val
558
+ result = new_attrasgn recv, id
513
559
  }
514
560
  | primary_value call_op tCONSTANT
515
561
  {
@@ -522,7 +568,10 @@ rule
522
568
  yyerror "dynamic constant assignment"
523
569
  end
524
570
 
525
- result = s(:const, s(:colon2, val[0], val[2].to_sym), nil)
571
+ expr, _, id = val
572
+ l = expr.line
573
+
574
+ result = s(:const, s(:colon2, expr, id.to_sym).line(l), nil).line l
526
575
  }
527
576
  | tCOLON3 tCONSTANT
528
577
  {
@@ -531,7 +580,10 @@ rule
531
580
  yyerror "dynamic constant assignment"
532
581
  end
533
582
 
534
- result = s(:const, nil, s(:colon3, val[1].to_sym))
583
+ _, id = val
584
+ l = lexer.lineno
585
+
586
+ result = s(:const, nil, s(:colon3, id.to_sym).line(l)).line l
535
587
  }
536
588
  | backref
537
589
  {
@@ -540,24 +592,31 @@ rule
540
592
 
541
593
  lhs: user_variable
542
594
  {
595
+ line = lexer.lineno
543
596
  result = self.assignable val[0]
597
+ result.line = line
544
598
  }
545
599
  | keyword_variable
546
600
  {
601
+ line = lexer.lineno
547
602
  result = self.assignable val[0]
603
+ result.line = line
548
604
  debug20 9, val, result
549
605
  }
550
606
  | primary_value tLBRACK2 opt_call_args rbracket
551
607
  {
552
- result = self.aryset val[0], val[2]
608
+ lhs, _, args, _ = val
609
+ result = self.aryset lhs, args
553
610
  }
554
611
  | primary_value call_op tIDENTIFIER # REFACTOR
555
612
  {
556
- result = new_attrasgn val[0], val[2], val[1]
613
+ lhs, op, id = val
614
+ result = new_attrasgn lhs, id, op
557
615
  }
558
616
  | primary_value tCOLON2 tIDENTIFIER
559
617
  {
560
- result = s(:attrasgn, val[0], :"#{val[2]}=")
618
+ lhs, _, id = val
619
+ result = new_attrasgn lhs, id
561
620
  }
562
621
  | primary_value call_op tCONSTANT # REFACTOR?
563
622
  {
@@ -565,21 +624,27 @@ rule
565
624
  }
566
625
  | primary_value tCOLON2 tCONSTANT
567
626
  {
627
+ expr, _, id = val
628
+
568
629
  if (self.in_def || self.in_single > 0) then
569
630
  debug20 10
570
631
  yyerror "dynamic constant assignment"
571
632
  end
572
633
 
573
- result = s(:const, s(:colon2, val[0], val[2].to_sym))
634
+ l = expr.line
635
+ result = s(:const, s(:colon2, expr, id.to_sym).line(l)).line l
574
636
  }
575
637
  | tCOLON3 tCONSTANT
576
638
  {
639
+ _, id = val
640
+
577
641
  if (self.in_def || self.in_single > 0) then
578
642
  debug20 11
579
643
  yyerror "dynamic constant assignment"
580
644
  end
581
645
 
582
- result = s(:const, s(:colon3, val[1].to_sym))
646
+ l = lexer.lineno
647
+ result = s(:const, s(:colon3, id.to_sym).line(l)).line l
583
648
  }
584
649
  | backref
585
650
  {
@@ -594,7 +659,8 @@ rule
594
659
 
595
660
  cpath: tCOLON3 cname
596
661
  {
597
- result = s(:colon3, val[1].to_sym)
662
+ _, name = val
663
+ result = s(:colon3, name.to_sym).line lexer.lineno
598
664
  }
599
665
  | cname
600
666
  {
@@ -602,7 +668,10 @@ rule
602
668
  }
603
669
  | primary_value tCOLON2 cname
604
670
  {
605
- result = s(:colon2, val[0], val[2].to_sym)
671
+ pval, _, name = val
672
+
673
+ result = s(:colon2, pval, name.to_sym)
674
+ result.line pval.line
606
675
  }
607
676
 
608
677
  fname: tIDENTIFIER | tCONSTANT | tFID
@@ -623,7 +692,8 @@ rule
623
692
 
624
693
  fitem: fsym
625
694
  {
626
- result = s(:lit, val[0].to_sym)
695
+ id, = val
696
+ result = s(:lit, id.to_sym).line lexer.lineno
627
697
  }
628
698
  | dsym
629
699
 
@@ -646,6 +716,7 @@ rule
646
716
  | tNEQ | tLSHFT | tRSHFT | tPLUS | tMINUS | tSTAR2
647
717
  | tSTAR | tDIVIDE | tPERCENT | tPOW | tDSTAR | tBANG | tTILDE
648
718
  | tUPLUS | tUMINUS | tAREF | tASET | tBACK_REF2
719
+ # TODO: tUBANG dead?
649
720
  | tUBANG
650
721
 
651
722
  reswords: k__LINE__ | k__FILE__ | k__ENCODING__ | klBEGIN | klEND
@@ -668,8 +739,7 @@ rule
668
739
  }
669
740
  | primary_value tLBRACK2 opt_call_args rbracket tOP_ASGN arg_rhs
670
741
  {
671
- val[2].sexp_type = :arglist if val[2]
672
- result = s(:op_asgn1, val[0], val[2], val[4].to_sym, val[5])
742
+ result = new_op_asgn1 val
673
743
  }
674
744
  | primary_value call_op tIDENTIFIER tOP_ASGN arg_rhs
675
745
  {
@@ -681,7 +751,9 @@ rule
681
751
  }
682
752
  | primary_value tCOLON2 tIDENTIFIER tOP_ASGN arg_rhs
683
753
  {
684
- result = s(:op_asgn, val[0], val[4], val[2].to_sym, val[3].to_sym)
754
+ lhs, _, id, op, rhs = val
755
+
756
+ result = s(:op_asgn, lhs, rhs, id.to_sym, op.to_sym).line lhs.line
685
757
  }
686
758
  | primary_value tCOLON2 tCONSTANT tOP_ASGN arg_rhs
687
759
  {
@@ -711,18 +783,18 @@ rule
711
783
  {
712
784
  v1, v2 = val[0], val[2]
713
785
  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))
786
+ result = s(:lit, (v1.last)..(v2.last)).line v1.line
715
787
  else
716
- result = s(:dot2, v1, v2)
788
+ result = s(:dot2, v1, v2).line v1.line
717
789
  end
718
790
  }
719
791
  | arg tDOT3 arg
720
792
  {
721
793
  v1, v2 = val[0], val[2]
722
794
  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))
795
+ result = s(:lit, (v1.last)...(v2.last)).line v1.line
724
796
  else
725
- result = s(:dot3, v1, v2)
797
+ result = s(:dot3, v1, v2).line v1.line
726
798
  end
727
799
  }
728
800
  | arg tPLUS arg
@@ -751,11 +823,14 @@ rule
751
823
  }
752
824
  | tUMINUS_NUM tINTEGER tPOW arg
753
825
  {
754
- result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
826
+ lit = s(:lit, val[1]).line lexer.lineno
827
+ result = new_call(new_call(lit, :"**", argl(val[3])), :"-@")
755
828
  }
756
829
  | tUMINUS_NUM tFLOAT tPOW arg
757
830
  {
758
- result = new_call(new_call(s(:lit, val[1]), :"**", argl(val[3])), :"-@")
831
+ lit = s(:lit, val[1]).line lexer.lineno
832
+ result = new_call(new_call(lit, :"**", argl(val[3])), :"-@")
833
+
759
834
  ## TODO: why is this 2.0 only?
760
835
  debug20 12, val, result
761
836
  }
@@ -798,15 +873,19 @@ rule
798
873
  }
799
874
  | arg tMATCH arg
800
875
  {
801
- result = new_match val[0], val[2]
876
+ lhs, _, rhs = val
877
+ result = new_match lhs, rhs
802
878
  }
803
879
  | arg tNMATCH arg
804
880
  {
805
- result = s(:not, new_match(val[0], val[2]))
881
+ lhs, _, rhs = val
882
+ result = s(:not, new_match(lhs, rhs)).line lhs.line
806
883
  }
807
884
  | tBANG arg
808
885
  {
809
- result = new_call val[1], :"!"
886
+ _, arg = val
887
+ result = new_call arg, :"!"
888
+ result.line arg.line
810
889
  }
811
890
  | tTILDE arg
812
891
  {
@@ -834,11 +913,13 @@ rule
834
913
  }
835
914
  | kDEFINED opt_nl arg
836
915
  {
837
- result = s(:defined, val[2])
916
+ (_, line), _, arg = val
917
+ result = s(:defined, arg).line line
838
918
  }
839
919
  | arg tEH arg opt_nl tCOLON arg
840
920
  {
841
- result = s(:if, val[0], val[2], val[5])
921
+ c, _, t, _, _, f = val
922
+ result = s(:if, c, t, f).line c.line
842
923
  }
843
924
  | primary
844
925
 
@@ -881,28 +962,25 @@ rule
881
962
  arg_rhs: arg =tOP_ASGN
882
963
  | arg kRESCUE_MOD arg
883
964
  {
884
- body, _, resbody = val
965
+ body, (_, line), resbody = val
885
966
  body = value_expr body
886
967
  resbody = remove_begin resbody
887
- result = new_rescue(body, new_resbody(s(:array), resbody))
968
+
969
+ ary = s(:array).line line
970
+ result = new_rescue(body, new_resbody(ary, resbody))
888
971
  }
889
972
 
890
973
  paren_args: tLPAREN2 opt_call_args rparen
891
974
  {
892
- result = val[1]
975
+ _, args, _ = val
976
+ result = args
893
977
  }
894
978
 
895
979
  opt_paren_args: none
896
980
  | paren_args
897
981
 
898
982
  opt_call_args: none
899
- {
900
- result = val[0]
901
- }
902
983
  | call_args
903
- {
904
- result = val[0]
905
- }
906
984
  | args tCOMMA
907
985
  {
908
986
  result = args val
@@ -924,17 +1002,14 @@ rule
924
1002
  | args opt_block_arg
925
1003
  {
926
1004
  result = call_args val
927
- result = self.arg_blk_pass val[0], val[1]
928
1005
  }
929
1006
  | assocs opt_block_arg
930
1007
  {
931
- result = call_args [array_to_hash(val[0])]
932
- result = self.arg_blk_pass result, val[1]
1008
+ result = call_args [array_to_hash(val[0]), val[1]]
933
1009
  }
934
1010
  | args tCOMMA assocs opt_block_arg
935
1011
  {
936
- result = call_args [val[0], array_to_hash(val[2])]
937
- result = self.arg_blk_pass result, val[3]
1012
+ result = call_args [val[0], array_to_hash(val[2]), val[3]]
938
1013
  }
939
1014
  | block_arg
940
1015
  {
@@ -942,17 +1017,45 @@ rule
942
1017
  }
943
1018
 
944
1019
  command_args: {
945
- result = lexer.cmdarg.store true
1020
+ # parse26.y line 2200
1021
+
1022
+ # If call_args starts with a open paren '(' or
1023
+ # '[', look-ahead reading of the letters calls
1024
+ # CMDARG_PUSH(0), but the push must be done
1025
+ # after CMDARG_PUSH(1). So this code makes them
1026
+ # consistent by first cancelling the premature
1027
+ # CMDARG_PUSH(0), doing CMDARG_PUSH(1), and
1028
+ # finally redoing CMDARG_PUSH(0).
1029
+
1030
+ result = yychar = self.last_token_type.first
1031
+ lookahead = [:tLPAREN, :tLPAREN_ARG, :tLPAREN2, :tLBRACK, :tLBRACK2].include?(yychar)
1032
+ lexer.cmdarg.pop if lookahead
1033
+ lexer.cmdarg.push true
1034
+ lexer.cmdarg.push false if lookahead
946
1035
  }
947
1036
  call_args
948
1037
  {
949
- lexer.cmdarg.restore val[0]
950
- result = val[1]
1038
+ yychar, args = val
1039
+
1040
+ # call_args can be followed by tLBRACE_ARG (that
1041
+ # does CMDARG_PUSH(0) in the lexer) but the push
1042
+ # must be done after CMDARG_POP() in the parser.
1043
+ # So this code does CMDARG_POP() to pop 0 pushed
1044
+ # by tLBRACE_ARG, CMDARG_POP() to pop 1 pushed
1045
+ # by command_args, and CMDARG_PUSH(0) to restore
1046
+ # back the flag set by tLBRACE_ARG.
1047
+
1048
+ lookahead = [:tLBRACE_ARG].include?(yychar)
1049
+ lexer.cmdarg.pop if lookahead
1050
+ lexer.cmdarg.pop
1051
+ lexer.cmdarg.push false if lookahead
1052
+ result = args
951
1053
  }
952
1054
 
953
1055
  block_arg: tAMPER arg_value
954
1056
  {
955
- result = s(:block_pass, val[1])
1057
+ _, arg = val
1058
+ result = s(:block_pass, arg).line arg.line
956
1059
  }
957
1060
 
958
1061
  opt_block_arg: tCOMMA block_arg
@@ -963,19 +1066,27 @@ rule
963
1066
 
964
1067
  args: arg_value
965
1068
  {
966
- result = s(:array, val[0])
1069
+ arg, = val
1070
+ lineno = arg.line || lexer.lineno # HACK
1071
+
1072
+ result = s(:array, arg).line lineno
967
1073
  }
968
1074
  | tSTAR arg_value
969
1075
  {
970
- result = s(:array, s(:splat, val[1]))
1076
+ _, arg = val
1077
+ result = s(:array, s(:splat, arg).line(arg.line)).line arg.line
971
1078
  }
972
1079
  | args tCOMMA arg_value
973
1080
  {
974
- result = self.list_append val[0], val[2]
1081
+ args, _, id = val
1082
+ result = self.list_append args, id
975
1083
  }
976
1084
  | args tCOMMA tSTAR arg_value
977
1085
  {
978
- result = self.list_append val[0], s(:splat, val[3])
1086
+ # TODO: the line number from tSTAR has been dropped
1087
+ args, _, _, id = val
1088
+ line = lexer.lineno
1089
+ result = self.list_append args, s(:splat, id).line(line)
979
1090
  }
980
1091
 
981
1092
  mrhs: args tCOMMA arg_value
@@ -984,11 +1095,14 @@ rule
984
1095
  }
985
1096
  | args tCOMMA tSTAR arg_value
986
1097
  {
987
- result = self.arg_concat val[0], val[3]
1098
+ # TODO: make all tXXXX terminals include lexer.lineno
1099
+ arg, _, _, splat = val
1100
+ result = self.arg_concat arg, splat
988
1101
  }
989
1102
  | tSTAR arg_value
990
1103
  {
991
- result = s(:splat, val[1])
1104
+ _, arg = val
1105
+ result = s(:splat, arg).line arg.line
992
1106
  }
993
1107
 
994
1108
  primary: literal
@@ -1003,65 +1117,65 @@ rule
1003
1117
  | backref
1004
1118
  | tFID
1005
1119
  {
1006
- result = new_call nil, val[0].to_sym
1120
+ msg, = val
1121
+ result = new_call nil, msg.to_sym
1007
1122
  }
1008
1123
  | k_begin
1009
1124
  {
1125
+ lexer.cmdarg.push false
1010
1126
  result = self.lexer.lineno
1011
- # TODO:
1012
- # $<val>1 = cmdarg_stack;
1013
- # CMDARG_SET(0);
1014
1127
  }
1015
1128
  bodystmt k_end
1016
1129
  {
1017
- # TODO: CMDARG_SET($<val>1);
1018
- unless val[2] then
1019
- result = s(:nil)
1020
- else
1021
- result = s(:begin, val[2])
1022
- end
1023
-
1024
- result.line = val[1]
1130
+ lexer.cmdarg.pop
1131
+ result = new_begin val
1025
1132
  }
1026
- | tLPAREN_ARG rparen
1133
+ | tLPAREN_ARG
1027
1134
  {
1028
- # TODO: lex_state = EXPR_ENDARG in between
1029
- debug20 13, val, result
1135
+ lexer.lex_state = EXPR_ENDARG
1136
+ result = lexer.lineno
1030
1137
  }
1031
- | tLPAREN_ARG
1138
+ rparen
1032
1139
  {
1033
- result = lexer.cmdarg.store false
1034
- # result = self.lexer.cmdarg.stack.dup
1035
- # lexer.cmdarg.stack.replace [false] # TODO add api for these
1140
+ _, line, _ = val
1141
+ result = s(:begin).line line
1036
1142
  }
1143
+ | tLPAREN_ARG
1037
1144
  stmt
1038
1145
  {
1039
1146
  lexer.lex_state = EXPR_ENDARG
1040
1147
  }
1041
1148
  rparen
1042
1149
  {
1043
- _, cmdarg, stmt, _, _, = val
1044
- warning "(...) interpreted as grouped expression"
1045
- lexer.cmdarg.restore cmdarg
1150
+ _, stmt, _, _, = val
1151
+ # warning "(...) interpreted as grouped expression"
1046
1152
  result = stmt
1047
1153
  }
1048
1154
  | tLPAREN compstmt tRPAREN
1049
1155
  {
1050
- result = val[1] || s(:nil)
1156
+ _, stmt, _ = val
1157
+ result = stmt
1158
+ result ||= s(:nil).line lexer.lineno
1051
1159
  result.paren = true
1052
1160
  }
1053
1161
  | primary_value tCOLON2 tCONSTANT
1054
1162
  {
1055
- result = s(:colon2, val[0], val[2].to_sym)
1163
+ expr, _, id = val
1164
+
1165
+ result = s(:colon2, expr, id.to_sym).line expr.line
1056
1166
  }
1057
1167
  | tCOLON3 tCONSTANT
1058
1168
  {
1059
- result = s(:colon3, val[1].to_sym)
1169
+ _, id = val
1170
+
1171
+ result = s(:colon3, id.to_sym).line lexer.lineno
1060
1172
  }
1061
- | tLBRACK aref_args tRBRACK
1173
+ | tLBRACK { result = lexer.lineno } aref_args tRBRACK
1062
1174
  {
1063
- result = val[1] || s(:array)
1175
+ _, line, args, _ = val
1176
+ result = args || s(:array)
1064
1177
  result.sexp_type = :array # aref_args is :args
1178
+ result.line line
1065
1179
  }
1066
1180
  | tLBRACE
1067
1181
  {
@@ -1073,7 +1187,8 @@ rule
1073
1187
  }
1074
1188
  | k_return
1075
1189
  {
1076
- result = s(:return)
1190
+ (_, line), = val
1191
+ result = s(:return).line line
1077
1192
  }
1078
1193
  | kYIELD tLPAREN2 call_args rparen
1079
1194
  {
@@ -1089,11 +1204,14 @@ rule
1089
1204
  }
1090
1205
  | kDEFINED opt_nl tLPAREN2 expr rparen
1091
1206
  {
1092
- result = s(:defined, val[3])
1207
+ (_, line), _, _, arg, _ = val
1208
+
1209
+ result = s(:defined, arg).line line
1093
1210
  }
1094
1211
  | kNOT tLPAREN2 expr rparen
1095
1212
  {
1096
- result = s(:call, val[2], :"!")
1213
+ _, _, lhs, _ = val
1214
+ result = new_call lhs, :"!"
1097
1215
  }
1098
1216
  | kNOT tLPAREN2 rparen
1099
1217
  {
@@ -1101,11 +1219,11 @@ rule
1101
1219
  }
1102
1220
  | fcall brace_block
1103
1221
  {
1104
- oper, iter = val[0], val[1]
1105
- call = oper # FIX
1222
+ call, iter = val
1223
+
1106
1224
  iter.insert 1, call
1107
1225
  result = iter
1108
- call.line = iter.line
1226
+ # FIX: probably not: call.line = iter.line
1109
1227
  }
1110
1228
  | method_call
1111
1229
  | method_call brace_block
@@ -1213,66 +1331,82 @@ rule
1213
1331
  }
1214
1332
  | k_def fname
1215
1333
  {
1216
- result = [self.in_def, self.lexer.cmdarg.stack.dup]
1334
+ result = self.in_def
1217
1335
 
1218
- self.comments.push self.lexer.comments
1219
- self.in_def = true
1336
+ self.in_def = true # group = local_push
1220
1337
  self.env.extend
1221
- # TODO: local->cmdargs = cmdarg_stack;
1222
- # TODO: port local_push_gen and local_pop_gen
1223
- lexer.cmdarg.stack.replace [false]
1338
+ lexer.cmdarg.push false
1339
+ lexer.cond.push false
1340
+
1341
+ self.comments.push self.lexer.comments
1224
1342
  }
1225
- f_arglist bodystmt k_end
1343
+ f_arglist bodystmt { result = lexer.lineno } k_end
1226
1344
  {
1227
- in_def, cmdarg = val[2]
1345
+ in_def = val[2]
1228
1346
 
1229
1347
  result = new_defn val
1230
1348
 
1231
- lexer.cmdarg.stack.replace cmdarg
1349
+ lexer.cond.pop # group = local_pop
1350
+ lexer.cmdarg.pop
1232
1351
  self.env.unextend
1233
1352
  self.in_def = in_def
1353
+
1234
1354
  self.lexer.comments # we don't care about comments in the body
1235
1355
  }
1236
1356
  | k_def singleton dot_or_colon
1237
1357
  {
1238
- self.comments.push self.lexer.comments
1239
1358
  lexer.lex_state = EXPR_FNAME
1240
1359
  }
1241
1360
  fname
1242
1361
  {
1243
- self.in_single += 1
1362
+ result = [self.in_def, lexer.lineno]
1363
+
1364
+ self.in_single += 1 # TODO: remove?
1365
+
1366
+ self.in_def = true # local_push
1244
1367
  self.env.extend
1245
- lexer.lex_state = EXPR_ENDFN # force for args
1246
- result = [lexer.lineno, self.lexer.cmdarg.stack.dup]
1247
- lexer.cmdarg.stack.replace [false]
1368
+ lexer.cmdarg.push false
1369
+ lexer.cond.push false
1370
+
1371
+ lexer.lex_state = EXPR_ENDFN|EXPR_LABEL
1372
+ self.comments.push self.lexer.comments
1248
1373
  }
1249
1374
  f_arglist bodystmt k_end
1250
1375
  {
1251
- line, cmdarg = val[5]
1252
- result = new_defs val
1253
- result[3].line line
1376
+ _, _recv, _, _, _name, (in_def, _lineno), _args, _body, _ = val
1254
1377
 
1255
- lexer.cmdarg.stack.replace cmdarg
1378
+ result = new_defs val
1256
1379
 
1380
+ lexer.cond.pop # group = local_pop
1381
+ lexer.cmdarg.pop
1257
1382
  self.env.unextend
1383
+ self.in_def = in_def
1384
+
1258
1385
  self.in_single -= 1
1386
+
1387
+ # TODO: restore cur_arg ? what's cur_arg?
1388
+
1259
1389
  self.lexer.comments # we don't care about comments in the body
1260
1390
  }
1261
1391
  | kBREAK
1262
1392
  {
1263
- result = s(:break)
1393
+ (_, line), = val
1394
+ result = s(:break).line line
1264
1395
  }
1265
1396
  | kNEXT
1266
1397
  {
1267
- result = s(:next)
1398
+ (_, line), = val
1399
+ result = s(:next).line line
1268
1400
  }
1269
1401
  | kREDO
1270
1402
  {
1271
- result = s(:redo)
1403
+ (_, line), = val
1404
+ result = s(:redo).line line
1272
1405
  }
1273
1406
  | kRETRY
1274
1407
  {
1275
- result = s(:retry)
1408
+ (_, line), = val
1409
+ result = s(:retry).line line
1276
1410
  }
1277
1411
 
1278
1412
  primary_value: primary
@@ -1311,7 +1445,9 @@ rule
1311
1445
  if_tail: opt_else
1312
1446
  | k_elsif expr_value then compstmt if_tail
1313
1447
  {
1314
- result = s(:if, val[1], val[3], val[4])
1448
+ (_, line), c, _, t, rest = val
1449
+
1450
+ result = s(:if, c, t, rest).line line
1315
1451
  }
1316
1452
 
1317
1453
  opt_else: none
@@ -1334,7 +1470,9 @@ rule
1334
1470
 
1335
1471
  f_marg_list: f_marg
1336
1472
  {
1337
- result = s(:array, val[0])
1473
+ sym, = val
1474
+
1475
+ result = s(:array, sym).line lexer.lineno
1338
1476
  }
1339
1477
  | f_marg_list tCOMMA f_marg
1340
1478
  {
@@ -1408,7 +1546,9 @@ rule
1408
1546
  }
1409
1547
  | f_block_arg
1410
1548
  {
1411
- result = call_args val
1549
+ line = lexer.lineno
1550
+ result = call_args val # TODO: push line down
1551
+ result.line line
1412
1552
  }
1413
1553
 
1414
1554
  opt_block_args_tail: tCOMMA block_args_tail
@@ -1439,7 +1579,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1439
1579
  }
1440
1580
  | f_arg tCOMMA
1441
1581
  {
1442
- result = args val
1582
+ result = args(val) << nil
1443
1583
  }
1444
1584
  | f_arg tCOMMA f_rest_arg tCOMMA f_arg opt_block_args_tail
1445
1585
  {
@@ -1491,7 +1631,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1491
1631
  }
1492
1632
  | tOROP
1493
1633
  {
1494
- result = s(:args)
1634
+ result = s(:args).line lexer.lineno
1495
1635
  }
1496
1636
  | tPIPE block_param opt_bv_decl tPIPE
1497
1637
  {
@@ -1516,34 +1656,33 @@ opt_block_args_tail: tCOMMA block_args_tail
1516
1656
 
1517
1657
  bvar: tIDENTIFIER
1518
1658
  {
1519
- result = s(:shadow, val[0].to_sym)
1659
+ id, = val
1660
+ line = lexer.lineno
1661
+ result = s(:shadow, id.to_sym).line line
1520
1662
  }
1521
1663
  | f_bad_arg
1522
1664
 
1523
1665
  lambda: {
1524
1666
  self.env.extend :dynamic
1525
- result = self.lexer.lineno
1526
-
1527
- result = lexer.lpar_beg
1667
+ result = [lexer.lineno, lexer.lpar_beg]
1528
1668
  lexer.paren_nest += 1
1529
1669
  lexer.lpar_beg = lexer.paren_nest
1530
1670
  }
1531
1671
  f_larglist
1532
1672
  {
1533
- result = [lexer.cmdarg.store(false), self.lexer.lineno]
1673
+ lexer.cmdarg.push false
1534
1674
  }
1535
1675
  lambda_body
1536
1676
  {
1537
- lpar, args, (cmdarg, lineno), body = val
1677
+ (line, lpar), args, _cmdarg, body = val
1538
1678
  lexer.lpar_beg = lpar
1539
1679
 
1540
- lexer.cmdarg.restore cmdarg
1541
- lexer.cmdarg.lexpop
1680
+ lexer.cmdarg.pop
1542
1681
 
1543
- call = new_call nil, :lambda
1682
+ call = s(:lambda).line line
1544
1683
  result = new_iter call, args, body
1545
- result.line = lineno
1546
- self.env.unextend
1684
+ result.line = line
1685
+ self.env.unextend # TODO: dynapush & dynapop
1547
1686
  }
1548
1687
 
1549
1688
  f_larglist: tLPAREN2 f_args opt_bv_decl rparen
@@ -1567,8 +1706,8 @@ opt_block_args_tail: tCOMMA block_args_tail
1567
1706
 
1568
1707
  do_block: k_do_block do_body kEND
1569
1708
  {
1570
- # TODO: maybe fix lineno to kDO's lineno?
1571
- result = val[1]
1709
+ (_, line), iter, _ = val
1710
+ result = iter.line line
1572
1711
  }
1573
1712
 
1574
1713
  block_call: command do_block
@@ -1582,8 +1721,10 @@ opt_block_args_tail: tCOMMA block_args_tail
1582
1721
 
1583
1722
  val = invert_block_call val if inverted? val
1584
1723
 
1585
- result = val[1]
1586
- result.insert 1, val[0]
1724
+ cmd, blk = val
1725
+
1726
+ result = blk
1727
+ result.insert 1, cmd
1587
1728
  }
1588
1729
  | block_call call_op2 operation2 opt_paren_args
1589
1730
  {
@@ -1614,8 +1755,10 @@ opt_block_args_tail: tCOMMA block_args_tail
1614
1755
  }
1615
1756
  paren_args
1616
1757
  {
1617
- args = self.call_args val[2..-1]
1618
- result = val[0].concat args.sexp_body
1758
+ call, lineno, args = val
1759
+
1760
+ result = call.concat args.sexp_body if args
1761
+ result.line lineno
1619
1762
  }
1620
1763
  | primary_value call_op operation2 opt_paren_args
1621
1764
  {
@@ -1643,7 +1786,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1643
1786
  }
1644
1787
  | kSUPER
1645
1788
  {
1646
- result = s(:zsuper)
1789
+ result = s(:zsuper).line lexer.lineno
1647
1790
  }
1648
1791
  | primary_value tLBRACK2 opt_call_args rbracket
1649
1792
  {
@@ -1692,15 +1835,15 @@ opt_block_args_tail: tCOMMA block_args_tail
1692
1835
  }
1693
1836
 
1694
1837
  do_body: { self.env.extend :dynamic; result = self.lexer.lineno }
1695
- { result = lexer.cmdarg.store(false) }
1838
+ { lexer.cmdarg.push false }
1696
1839
  opt_block_param
1697
1840
  compstmt
1698
1841
  {
1699
- line, cmdarg, param, cmpstmt = val
1842
+ line, _cmdarg, param, cmpstmt = val
1700
1843
 
1701
1844
  result = new_do_body param, cmpstmt, line
1845
+ lexer.cmdarg.pop
1702
1846
  self.env.unextend
1703
- lexer.cmdarg.restore cmdarg
1704
1847
  }
1705
1848
 
1706
1849
  case_body: k_when
@@ -1721,7 +1864,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1721
1864
  (_, line), klasses, var, _, body, rest = val
1722
1865
 
1723
1866
  klasses ||= s(:array)
1724
- klasses << new_assign(var, s(:gvar, :"$!")) if var
1867
+ klasses << new_assign(var, s(:gvar, :"$!").line(var.line)) if var
1725
1868
  klasses.line line
1726
1869
 
1727
1870
  result = new_resbody(klasses, body)
@@ -1734,7 +1877,8 @@ opt_block_args_tail: tCOMMA block_args_tail
1734
1877
 
1735
1878
  exc_list: arg_value
1736
1879
  {
1737
- result = s(:array, val[0])
1880
+ arg, = val
1881
+ result = s(:array, arg).line arg.line
1738
1882
  }
1739
1883
  | mrhs
1740
1884
  | none
@@ -1747,26 +1891,31 @@ opt_block_args_tail: tCOMMA block_args_tail
1747
1891
 
1748
1892
  opt_ensure: k_ensure compstmt
1749
1893
  {
1750
- _, body = val
1894
+ (_, line), body = val
1751
1895
 
1752
- result = body || s(:nil)
1896
+ result = body || s(:nil).line(line)
1753
1897
  }
1754
1898
  | none
1755
1899
 
1756
1900
  literal: numeric
1757
1901
  {
1902
+ line = lexer.lineno
1758
1903
  result = s(:lit, val[0])
1904
+ result.line = line
1759
1905
  }
1760
1906
  | symbol
1761
1907
  {
1908
+ line = lexer.lineno
1762
1909
  result = s(:lit, val[0])
1910
+ result.line = line
1763
1911
  }
1764
1912
  | dsym
1765
1913
 
1766
1914
  strings: string
1767
1915
  {
1768
- val[0] = s(:dstr, val[0].value) if val[0].sexp_type == :evstr
1769
- result = val[0]
1916
+ str, = val
1917
+ str = s(:dstr, str.value) if str.sexp_type == :evstr
1918
+ result = str
1770
1919
  }
1771
1920
 
1772
1921
  string: tCHAR
@@ -1781,7 +1930,11 @@ opt_block_args_tail: tCOMMA block_args_tail
1781
1930
 
1782
1931
  string1: tSTRING_BEG string_contents tSTRING_END
1783
1932
  {
1784
- result = val[1]
1933
+ _, str, (_, func) = val
1934
+
1935
+ str = dedent str if func =~ RubyLexer::STR_FUNC_ICNTNT
1936
+
1937
+ result = str
1785
1938
  }
1786
1939
  | tSTRING
1787
1940
  {
@@ -1790,7 +1943,8 @@ opt_block_args_tail: tCOMMA block_args_tail
1790
1943
 
1791
1944
  xstring: tXSTRING_BEG xstring_contents tSTRING_END
1792
1945
  {
1793
- result = new_xstring val[1]
1946
+ result = new_xstring val
1947
+ # TODO: dedent?!?! SERIOUSLY?!?
1794
1948
  }
1795
1949
 
1796
1950
  regexp: tREGEXP_BEG regexp_contents tREGEXP_END
@@ -1800,7 +1954,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1800
1954
 
1801
1955
  words: tWORDS_BEG tSPACE tSTRING_END
1802
1956
  {
1803
- result = s(:array)
1957
+ result = s(:array).line lexer.lineno
1804
1958
  }
1805
1959
  | tWORDS_BEG word_list tSTRING_END
1806
1960
  {
@@ -1824,25 +1978,28 @@ opt_block_args_tail: tCOMMA block_args_tail
1824
1978
 
1825
1979
  symbols: tSYMBOLS_BEG tSPACE tSTRING_END
1826
1980
  {
1827
- result = s(:array)
1981
+ result = s(:array).line lexer.lineno
1828
1982
  }
1829
- | tSYMBOLS_BEG symbol_list tSTRING_END
1983
+ | tSYMBOLS_BEG { result = lexer.lineno } symbol_list tSTRING_END
1830
1984
  {
1831
- result = val[1]
1985
+ _, line, list, _, = val
1986
+ list.line = line
1987
+ result = list
1832
1988
  }
1833
1989
 
1834
1990
  symbol_list: none
1835
1991
  {
1836
- result = new_symbol_list
1992
+ result = new_symbol_list.line lexer.lineno
1837
1993
  }
1838
1994
  | symbol_list word tSPACE
1839
1995
  {
1840
- result = val[0].dup << new_symbol_list_entry(val)
1996
+ list, * = val
1997
+ result = list.dup << new_symbol_list_entry(val)
1841
1998
  }
1842
1999
 
1843
2000
  qwords: tQWORDS_BEG tSPACE tSTRING_END
1844
2001
  {
1845
- result = s(:array)
2002
+ result = s(:array).line lexer.lineno
1846
2003
  }
1847
2004
  | tQWORDS_BEG qword_list tSTRING_END
1848
2005
  {
@@ -1851,7 +2008,7 @@ opt_block_args_tail: tCOMMA block_args_tail
1851
2008
 
1852
2009
  qsymbols: tQSYMBOLS_BEG tSPACE tSTRING_END
1853
2010
  {
1854
- result = s(:array)
2011
+ result = s(:array).line lexer.lineno # FIX
1855
2012
  }
1856
2013
  | tQSYMBOLS_BEG qsym_list tSTRING_END
1857
2014
  {
@@ -1878,11 +2035,12 @@ opt_block_args_tail: tCOMMA block_args_tail
1878
2035
 
1879
2036
  string_contents: none
1880
2037
  {
1881
- result = s(:str, "")
2038
+ result = s(:str, "").line lexer.lineno
1882
2039
  }
1883
2040
  | string_contents string_content
1884
2041
  {
1885
- result = literal_concat(val[0], val[1])
2042
+ v1, v2 = val
2043
+ result = literal_concat v1, v2
1886
2044
  }
1887
2045
 
1888
2046
  xstring_contents: none
@@ -1891,7 +2049,8 @@ xstring_contents: none
1891
2049
  }
1892
2050
  | xstring_contents string_content
1893
2051
  {
1894
- result = literal_concat(val[0], val[1])
2052
+ v1, v2 = val
2053
+ result = literal_concat v1, v2
1895
2054
  }
1896
2055
 
1897
2056
  regexp_contents: none
@@ -1900,7 +2059,8 @@ regexp_contents: none
1900
2059
  }
1901
2060
  | regexp_contents string_content
1902
2061
  {
1903
- result = literal_concat(val[0], val[1])
2062
+ v1, v2 = val
2063
+ result = literal_concat v1, v2
1904
2064
  }
1905
2065
 
1906
2066
  string_content: tSTRING_CONTENT
@@ -1916,19 +2076,22 @@ regexp_contents: none
1916
2076
  }
1917
2077
  string_dvar
1918
2078
  {
1919
- lexer.lex_strterm = val[1]
1920
- result = s(:evstr, val[2])
2079
+ _, strterm, str = val
2080
+ lexer.lex_strterm = strterm
2081
+ result = s(:evstr, str).line str.line
1921
2082
  }
1922
2083
  | tSTRING_DBEG
1923
2084
  {
1924
2085
  result = [lexer.lex_strterm,
1925
2086
  lexer.brace_nest,
1926
2087
  lexer.string_nest, # TODO: remove
1927
- lexer.cond.store,
1928
- lexer.cmdarg.store,
1929
2088
  lexer.lex_state,
2089
+ lexer.lineno,
1930
2090
  ]
1931
2091
 
2092
+ lexer.cmdarg.push false
2093
+ lexer.cond.push false
2094
+
1932
2095
  lexer.lex_strterm = nil
1933
2096
  lexer.brace_nest = 0
1934
2097
  lexer.string_nest = 0
@@ -1940,14 +2103,15 @@ regexp_contents: none
1940
2103
  {
1941
2104
  _, memo, stmt, _ = val
1942
2105
 
1943
- lex_strterm, brace_nest, string_nest, oldcond, oldcmdarg, oldlex_state = memo
2106
+ lex_strterm, brace_nest, string_nest, oldlex_state, line = memo
2107
+ # TODO: heredoc_indent
1944
2108
 
1945
2109
  lexer.lex_strterm = lex_strterm
1946
2110
  lexer.brace_nest = brace_nest
1947
2111
  lexer.string_nest = string_nest
1948
2112
 
1949
- lexer.cond.restore oldcond
1950
- lexer.cmdarg.restore oldcmdarg
2113
+ lexer.cmdarg.pop
2114
+ lexer.cond.pop
1951
2115
 
1952
2116
  lexer.lex_state = oldlex_state
1953
2117
 
@@ -1957,19 +2121,19 @@ regexp_contents: none
1957
2121
  when :str, :dstr, :evstr then
1958
2122
  result = stmt
1959
2123
  else
1960
- result = s(:evstr, stmt)
2124
+ result = s(:evstr, stmt).line line
1961
2125
  end
1962
2126
  when nil then
1963
- result = s(:evstr)
2127
+ result = s(:evstr).line line
1964
2128
  else
1965
2129
  debug20 25
1966
2130
  raise "unknown string body: #{stmt.inspect}"
1967
2131
  end
1968
2132
  }
1969
2133
 
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) }
2134
+ string_dvar: tGVAR { result = s(:gvar, val[0].to_sym).line lexer.lineno }
2135
+ | tIVAR { result = s(:ivar, val[0].to_sym).line lexer.lineno }
2136
+ | tCVAR { result = s(:cvar, val[0].to_sym).line lexer.lineno }
1973
2137
  | backref
1974
2138
 
1975
2139
  symbol: tSYMBEG sym
@@ -1986,18 +2150,19 @@ regexp_contents: none
1986
2150
 
1987
2151
  dsym: tSYMBEG xstring_contents tSTRING_END
1988
2152
  {
2153
+ _, result, _ = val
2154
+
1989
2155
  lexer.lex_state = EXPR_END
1990
- result = val[1]
1991
2156
 
1992
- result ||= s(:str, "")
2157
+ result ||= s(:str, "").line lexer.lineno
1993
2158
 
1994
2159
  case result.sexp_type
1995
2160
  when :dstr then
1996
2161
  result.sexp_type = :dsym
1997
2162
  when :str then
1998
- result = s(:lit, result.last.to_sym)
2163
+ result = s(:lit, result.last.to_sym).line result.line
1999
2164
  when :evstr then
2000
- result = s(:dsym, "", result)
2165
+ result = s(:dsym, "", result).line result.line
2001
2166
  else
2002
2167
  debug20 26, val, result
2003
2168
  end
@@ -2020,19 +2185,20 @@ regexp_contents: none
2020
2185
  | tCONSTANT
2021
2186
  | tCVAR
2022
2187
 
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) }
2188
+ keyword_variable: kNIL { result = s(:nil).line lexer.lineno }
2189
+ | kSELF { result = s(:self).line lexer.lineno }
2190
+ | kTRUE { result = s(:true).line lexer.lineno }
2191
+ | kFALSE { result = s(:false).line lexer.lineno }
2192
+ | k__FILE__ { result = s(:str, self.file).line lexer.lineno }
2193
+ | k__LINE__ { result = s(:lit, lexer.lineno).line lexer.lineno }
2029
2194
  | k__ENCODING__
2030
2195
  {
2196
+ l = lexer.lineno
2031
2197
  result =
2032
2198
  if defined? Encoding then
2033
- s(:colon2, s(:const, :Encoding), :UTF_8)
2199
+ s(:colon2, s(:const, :Encoding).line(l), :UTF_8).line l
2034
2200
  else
2035
- s(:str, "Unsupported!")
2201
+ s(:str, "Unsupported!").line l
2036
2202
  end
2037
2203
  }
2038
2204
 
@@ -2057,8 +2223,8 @@ keyword_variable: kNIL { result = s(:nil) }
2057
2223
  debug20 29, val, result
2058
2224
  }
2059
2225
 
2060
- backref: tNTH_REF { result = s(:nth_ref, val[0]) }
2061
- | tBACK_REF { result = s(:back_ref, val[0]) }
2226
+ backref: tNTH_REF { result = s(:nth_ref, val[0]).line lexer.lineno }
2227
+ | tBACK_REF { result = s(:back_ref, val[0]).line lexer.lineno }
2062
2228
 
2063
2229
  superclass: tLT
2064
2230
  {
@@ -2213,12 +2379,13 @@ keyword_variable: kNIL { result = s(:nil) }
2213
2379
 
2214
2380
  f_arg: f_arg_item
2215
2381
  {
2216
- case val[0]
2382
+ arg, = val
2383
+
2384
+ case arg
2217
2385
  when Symbol then
2218
- result = s(:args)
2219
- result << val[0]
2386
+ result = s(:args, arg).line lexer.lineno
2220
2387
  when Sexp then
2221
- result = val[0]
2388
+ result = arg
2222
2389
  else
2223
2390
  debug20 32
2224
2391
  raise "Unknown f_arg type: #{val.inspect}"
@@ -2231,7 +2398,7 @@ keyword_variable: kNIL { result = s(:nil) }
2231
2398
  if list.sexp_type == :args then
2232
2399
  result = list
2233
2400
  else
2234
- result = s(:args, list)
2401
+ result = s(:args, list).line list.line
2235
2402
  end
2236
2403
 
2237
2404
  result << item
@@ -2239,22 +2406,24 @@ keyword_variable: kNIL { result = s(:nil) }
2239
2406
 
2240
2407
  f_kw: tLABEL arg_value
2241
2408
  {
2242
- # TODO: call_args
2243
- label, _ = val[0] # TODO: fix lineno?
2409
+ # TODO: new_kw_arg
2410
+ (label, line), arg = val
2411
+
2244
2412
  identifier = label.to_sym
2245
2413
  self.env[identifier] = :lvar
2246
2414
 
2247
- result = s(:array, s(:kwarg, identifier, val[1]))
2415
+ kwarg = s(:kwarg, identifier, arg).line line
2416
+ result = s(:array, kwarg).line line
2248
2417
  }
2249
2418
 
2250
2419
  f_block_kw: tLABEL primary_value
2251
2420
  {
2252
- # TODO: call_args
2253
- label, _ = val[0] # TODO: fix lineno?
2254
- identifier = label.to_sym
2255
- self.env[identifier] = :lvar
2421
+ # TODO: new_kw_arg
2422
+ (label, line), expr = val
2423
+ id = label.to_sym
2424
+ self.env[id] = :lvar
2256
2425
 
2257
- result = s(:array, s(:kwarg, identifier, val[1]))
2426
+ result = s(:array, s(:kwarg, id, expr).line(line)).line line
2258
2427
  }
2259
2428
 
2260
2429
  f_block_kwarg: f_block_kw
@@ -2297,17 +2466,20 @@ keyword_variable: kNIL { result = s(:nil) }
2297
2466
 
2298
2467
  f_block_optarg: f_block_opt
2299
2468
  {
2300
- result = s(:block, val[0])
2469
+ optblk, = val
2470
+ result = s(:block, optblk).line optblk.line
2301
2471
  }
2302
2472
  | f_block_optarg tCOMMA f_block_opt
2303
2473
  {
2304
- result = val[0]
2305
- result << val[2]
2474
+ optarg, _, optblk = val
2475
+ result = optarg
2476
+ result << optblk
2306
2477
  }
2307
2478
 
2308
2479
  f_optarg: f_opt
2309
2480
  {
2310
- result = s(:block, val[0])
2481
+ opt, = val
2482
+ result = s(:block, opt).line opt.line
2311
2483
  }
2312
2484
  | f_optarg tCOMMA f_opt
2313
2485
  {
@@ -2361,14 +2533,11 @@ keyword_variable: kNIL { result = s(:nil) }
2361
2533
  result.sexp_type == :lit
2362
2534
  }
2363
2535
 
2364
- assoc_list: none # [!nil]
2536
+ assoc_list: none
2365
2537
  {
2366
- result = s(:array)
2367
- }
2368
- | assocs trailer # [!nil]
2369
- {
2370
- result = val[0]
2538
+ result = s(:array).line lexer.lineno
2371
2539
  }
2540
+ | assocs trailer
2372
2541
 
2373
2542
  assocs: assoc
2374
2543
  | assocs tCOMMA assoc
@@ -2382,16 +2551,21 @@ keyword_variable: kNIL { result = s(:nil) }
2382
2551
 
2383
2552
  assoc: arg_value tASSOC arg_value
2384
2553
  {
2385
- result = s(:array, val[0], val[2])
2554
+ v1, _, v2 = val
2555
+ result = s(:array, v1, v2).line v1.line
2386
2556
  }
2387
2557
  | tLABEL arg_value
2388
2558
  {
2389
- (label, _), arg = val
2390
- result = s(:array, s(:lit, label.to_sym), arg)
2559
+ (label, line), arg = val
2560
+
2561
+ lit = s(:lit, label.to_sym).line line
2562
+ result = s(:array, lit, arg).line line
2391
2563
  }
2392
2564
  | tDSTAR arg_value
2393
2565
  {
2394
- result = s(:array, s(:kwsplat, val[1]))
2566
+ _, arg = val
2567
+ line = arg.line
2568
+ result = s(:array, s(:kwsplat, arg).line(line)).line line
2395
2569
  }
2396
2570
 
2397
2571
  operation: tIDENTIFIER | tCONSTANT | tFID