prettier 1.1.0 → 1.2.4

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.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +57 -1
  3. data/CONTRIBUTING.md +2 -2
  4. data/README.md +16 -1
  5. data/lib/prettier.rb +2 -2
  6. data/package.json +2 -2
  7. data/rubocop.yml +26 -0
  8. data/src/{ruby.js → plugin.js} +2 -2
  9. data/src/prettier.js +1 -0
  10. data/src/{embed.js → ruby/embed.js} +6 -2
  11. data/src/{nodes.js → ruby/nodes.js} +0 -0
  12. data/src/{nodes → ruby/nodes}/alias.js +1 -1
  13. data/src/{nodes → ruby/nodes}/aref.js +8 -1
  14. data/src/{nodes → ruby/nodes}/args.js +2 -2
  15. data/src/{nodes → ruby/nodes}/arrays.js +2 -3
  16. data/src/{nodes → ruby/nodes}/assign.js +12 -4
  17. data/src/ruby/nodes/blocks.js +90 -0
  18. data/src/{nodes → ruby/nodes}/calls.js +18 -9
  19. data/src/ruby/nodes/case.js +65 -0
  20. data/src/{nodes → ruby/nodes}/class.js +1 -1
  21. data/src/ruby/nodes/commands.js +126 -0
  22. data/src/{nodes → ruby/nodes}/conditionals.js +3 -3
  23. data/src/{nodes → ruby/nodes}/constants.js +2 -2
  24. data/src/{nodes → ruby/nodes}/flow.js +2 -2
  25. data/src/{nodes → ruby/nodes}/hashes.js +32 -10
  26. data/src/{nodes → ruby/nodes}/heredocs.js +2 -2
  27. data/src/ruby/nodes/hooks.js +34 -0
  28. data/src/{nodes → ruby/nodes}/ints.js +0 -0
  29. data/src/{nodes → ruby/nodes}/lambdas.js +2 -2
  30. data/src/{nodes → ruby/nodes}/loops.js +10 -7
  31. data/src/{nodes → ruby/nodes}/massign.js +8 -1
  32. data/src/{nodes → ruby/nodes}/methods.js +32 -6
  33. data/src/{nodes → ruby/nodes}/operators.js +2 -2
  34. data/src/{nodes → ruby/nodes}/params.js +31 -16
  35. data/src/{nodes → ruby/nodes}/patterns.js +54 -15
  36. data/src/{nodes → ruby/nodes}/regexp.js +2 -2
  37. data/src/{nodes → ruby/nodes}/rescue.js +2 -2
  38. data/src/ruby/nodes/return.js +94 -0
  39. data/src/{nodes → ruby/nodes}/statements.js +6 -9
  40. data/src/{nodes → ruby/nodes}/strings.js +27 -36
  41. data/src/{nodes → ruby/nodes}/super.js +2 -2
  42. data/src/{nodes → ruby/nodes}/undef.js +1 -1
  43. data/src/{parser.js → ruby/parser.js} +4 -3
  44. data/src/{parser.rb → ruby/parser.rb} +498 -492
  45. data/src/{printer.js → ruby/printer.js} +33 -1
  46. data/src/{toProc.js → ruby/toProc.js} +4 -8
  47. data/src/utils.js +10 -93
  48. data/src/utils/containsAssignment.js +11 -0
  49. data/src/utils/getTrailingComma.js +5 -0
  50. data/src/utils/hasAncestor.js +17 -0
  51. data/src/utils/literal.js +7 -0
  52. data/src/utils/makeCall.js +14 -0
  53. data/src/utils/noIndent.js +10 -0
  54. data/src/utils/skipAssignIndent.js +10 -0
  55. metadata +49 -41
  56. data/src/nodes/blocks.js +0 -85
  57. data/src/nodes/case.js +0 -61
  58. data/src/nodes/commands.js +0 -91
  59. data/src/nodes/hooks.js +0 -44
  60. data/src/nodes/return.js +0 -72
@@ -1,5 +1,5 @@
1
- const { align, concat, group, join, line } = require("../prettier");
2
- const { literal } = require("../utils");
1
+ const { align, concat, group, join, line } = require("../../prettier");
2
+ const { literal } = require("../../utils");
3
3
 
4
4
  function printSuper(path, opts, print) {
5
5
  const args = path.getValue().body[0];
@@ -5,7 +5,7 @@ const {
5
5
  group,
6
6
  join,
7
7
  line
8
- } = require("../prettier");
8
+ } = require("../../prettier");
9
9
 
10
10
  function printUndefSymbol(path, opts, print) {
11
11
  const node = path.getValue();
@@ -4,6 +4,7 @@ const path = require("path");
4
4
  // In order to properly parse ruby code, we need to tell the ruby process to
5
5
  // parse using UTF-8. Unfortunately, the way that you accomplish this looks
6
6
  // differently depending on your platform.
7
+ /* istanbul ignore next */
7
8
  const LANG = (() => {
8
9
  const { env, platform } = process;
9
10
  const envValue = env.LC_ALL || env.LC_CTYPE || env.LANG;
@@ -42,7 +43,7 @@ function parse(text, _parsers, _opts) {
42
43
  {
43
44
  env: Object.assign({}, process.env, { LANG }),
44
45
  input: text,
45
- maxBuffer: 10 * 1024 * 1024 // 10MB
46
+ maxBuffer: 15 * 1024 * 1024 // 15MB
46
47
  }
47
48
  );
48
49
 
@@ -67,14 +68,14 @@ function hasPragma(text) {
67
68
  // for returning the index of the character within the source string that is the
68
69
  // beginning of the given node.
69
70
  function locStart(node) {
70
- return node.char_start;
71
+ return node.sc;
71
72
  }
72
73
 
73
74
  // This function is critical for comments and cursor support, and is responsible
74
75
  // for returning the index of the character within the source string that is the
75
76
  // ending of the given node.
76
77
  function locEnd(node) {
77
- return node.char_end;
78
+ return node.ec;
78
79
  }
79
80
 
80
81
  module.exports = {
@@ -63,14 +63,14 @@ class Prettier::Parser < Ripper
63
63
  # would happen to be the innermost keyword). Then the outer one would only be
64
64
  # able to grab the first one. In this way all of the scanner events act as
65
65
  # their own stack.
66
- def find_scanner_event(type, body = :any)
66
+ def find_scanner_event(type, body = :any, consume: true)
67
67
  index =
68
68
  scanner_events.rindex do |scanner_event|
69
69
  scanner_event[:type] == type &&
70
70
  (body == :any || (scanner_event[:body] == body))
71
71
  end
72
72
 
73
- scanner_events.delete_at(index)
73
+ consume ? scanner_events.delete_at(index) : (index && scanner_events[index])
74
74
  end
75
75
 
76
76
  # Scanner events occur when the lexer hits a new token, like a keyword or an
@@ -89,14 +89,14 @@ class Prettier::Parser < Ripper
89
89
 
90
90
  (SCANNER_EVENTS - defined).each do |event|
91
91
  define_method(:"on_#{event}") do |value|
92
- char_end = char_pos + value.size
92
+ ec = char_pos + value.size
93
93
  node = {
94
94
  type: :"@#{event}",
95
95
  body: value,
96
- start: lineno,
97
- end: lineno,
98
- char_start: char_pos,
99
- char_end: char_end
96
+ sl: lineno,
97
+ el: lineno,
98
+ sc: char_pos,
99
+ ec: ec
100
100
  }
101
101
 
102
102
  scanner_events << node
@@ -118,10 +118,10 @@ class Prettier::Parser < Ripper
118
118
  @comments << {
119
119
  type: :@comment,
120
120
  value: value[1..-1].chomp.force_encoding('UTF-8'),
121
- start: lineno,
122
- end: lineno,
123
- char_start: char_pos,
124
- char_end: char_pos + value.length - 1
121
+ sl: lineno,
122
+ el: lineno,
123
+ sc: char_pos,
124
+ ec: char_pos + value.length - 1
125
125
  }
126
126
  end
127
127
 
@@ -138,10 +138,10 @@ class Prettier::Parser < Ripper
138
138
  {
139
139
  type: :ignored_nl,
140
140
  body: nil,
141
- start: lineno,
142
- end: lineno,
143
- char_start: char_pos,
144
- char_end: char_pos
141
+ sl: lineno,
142
+ el: lineno,
143
+ sc: char_pos,
144
+ ec: char_pos
145
145
  }
146
146
  end
147
147
 
@@ -186,16 +186,13 @@ class Prettier::Parser < Ripper
186
186
  beging = find_scanner_event(:@lbrace)
187
187
  ending = find_scanner_event(:@rbrace)
188
188
 
189
- stmts.bind(
190
- find_next_statement_start(beging[:char_end]),
191
- ending[:char_start]
192
- )
189
+ stmts.bind(find_next_statement_start(beging[:ec]), ending[:sc])
193
190
 
194
191
  find_scanner_event(:@kw, 'BEGIN').merge!(
195
192
  type: :BEGIN,
196
193
  body: [beging, stmts],
197
- end: ending[:end],
198
- char_end: ending[:char_end]
194
+ el: ending[:el],
195
+ ec: ending[:ec]
199
196
  )
200
197
  end
201
198
 
@@ -213,16 +210,13 @@ class Prettier::Parser < Ripper
213
210
  beging = find_scanner_event(:@lbrace)
214
211
  ending = find_scanner_event(:@rbrace)
215
212
 
216
- stmts.bind(
217
- find_next_statement_start(beging[:char_end]),
218
- ending[:char_start]
219
- )
213
+ stmts.bind(find_next_statement_start(beging[:ec]), ending[:sc])
220
214
 
221
215
  find_scanner_event(:@kw, 'END').merge!(
222
216
  type: :END,
223
217
  body: [beging, stmts],
224
- end: ending[:end],
225
- char_end: ending[:char_end]
218
+ el: ending[:el],
219
+ ec: ending[:ec]
226
220
  )
227
221
  end
228
222
 
@@ -234,16 +228,16 @@ class Prettier::Parser < Ripper
234
228
  def on_alias(left, right)
235
229
  beging = find_scanner_event(:@kw, 'alias')
236
230
 
237
- paren = source[beging[:char_end]...left[:char_start]].include?('(')
231
+ paren = source[beging[:ec]...left[:sc]].include?('(')
238
232
  ending = paren ? find_scanner_event(:@rparen) : right
239
233
 
240
234
  {
241
235
  type: :alias,
242
236
  body: [left, right],
243
- start: beging[:start],
244
- char_start: beging[:char_start],
245
- end: ending[:end],
246
- char_end: ending[:char_end]
237
+ sl: beging[:sl],
238
+ sc: beging[:sc],
239
+ el: ending[:el],
240
+ ec: ending[:ec]
247
241
  }
248
242
  end
249
243
 
@@ -268,10 +262,10 @@ class Prettier::Parser < Ripper
268
262
  {
269
263
  type: :aref,
270
264
  body: [collection, index],
271
- start: collection[:start],
272
- char_start: collection[:char_start],
273
- end: ending[:end],
274
- char_end: ending[:char_end]
265
+ sl: collection[:sl],
266
+ sc: collection[:sc],
267
+ el: ending[:el],
268
+ ec: ending[:ec]
275
269
  }
276
270
  end
277
271
 
@@ -284,10 +278,10 @@ class Prettier::Parser < Ripper
284
278
  {
285
279
  type: :aref_field,
286
280
  body: [collection, index],
287
- start: collection[:start],
288
- char_start: collection[:char_start],
289
- end: ending[:end],
290
- char_end: ending[:char_end]
281
+ sl: collection[:sl],
282
+ sc: collection[:sc],
283
+ el: ending[:el],
284
+ ec: ending[:ec]
291
285
  }
292
286
  end
293
287
 
@@ -298,10 +292,10 @@ class Prettier::Parser < Ripper
298
292
  {
299
293
  type: :args,
300
294
  body: [],
301
- start: lineno,
302
- char_start: char_pos,
303
- end: lineno,
304
- char_end: char_pos
295
+ sl: lineno,
296
+ sc: char_pos,
297
+ el: lineno,
298
+ ec: char_pos
305
299
  }
306
300
  end
307
301
 
@@ -313,11 +307,7 @@ class Prettier::Parser < Ripper
313
307
  if args[:body].empty?
314
308
  arg.merge(type: :args, body: [arg])
315
309
  else
316
- args.merge!(
317
- body: args[:body] << arg,
318
- end: arg[:end],
319
- char_end: arg[:char_end]
320
- )
310
+ args.merge!(body: args[:body] << arg, el: arg[:el], ec: arg[:ec])
321
311
  end
322
312
  end
323
313
 
@@ -330,8 +320,8 @@ class Prettier::Parser < Ripper
330
320
  args.merge(
331
321
  type: :args_add_block,
332
322
  body: [args, block],
333
- end: ending[:end],
334
- char_end: ending[:char_end]
323
+ el: ending[:el],
324
+ ec: ending[:ec]
335
325
  )
336
326
  end
337
327
 
@@ -345,10 +335,10 @@ class Prettier::Parser < Ripper
345
335
  {
346
336
  type: :args_add_star,
347
337
  body: [args, part],
348
- start: beging[:start],
349
- char_start: beging[:char_start],
350
- end: ending[:end],
351
- char_end: ending[:char_end]
338
+ sl: beging[:sl],
339
+ sc: beging[:sc],
340
+ el: ending[:el],
341
+ ec: ending[:ec]
352
342
  }
353
343
  end
354
344
 
@@ -367,15 +357,15 @@ class Prettier::Parser < Ripper
367
357
  # If the arguments exceed the ending of the parentheses, then we know we
368
358
  # have a heredoc in the arguments, and we need to use the bounds of the
369
359
  # arguments to determine how large the arg_paren is.
370
- ending = (args && args[:end] > rparen[:end]) ? args : rparen
360
+ ending = (args && args[:el] > rparen[:el]) ? args : rparen
371
361
 
372
362
  {
373
363
  type: :arg_paren,
374
364
  body: [args],
375
- start: beging[:start],
376
- char_start: beging[:char_start],
377
- end: ending[:end],
378
- char_end: ending[:char_end]
365
+ sl: beging[:sl],
366
+ sc: beging[:sc],
367
+ el: ending[:el],
368
+ ec: ending[:ec]
379
369
  }
380
370
  end
381
371
 
@@ -391,20 +381,20 @@ class Prettier::Parser < Ripper
391
381
  {
392
382
  type: :array,
393
383
  body: [contents],
394
- start: beging[:start],
395
- char_start: beging[:char_start],
396
- end: ending[:end],
397
- char_end: ending[:char_end]
384
+ sl: beging[:sl],
385
+ sc: beging[:sc],
386
+ el: ending[:el],
387
+ ec: ending[:ec]
398
388
  }
399
389
  else
400
390
  ending = find_scanner_event(:@tstring_end)
401
- contents[:char_end] = ending[:char_end]
391
+ contents[:ec] = ending[:ec]
402
392
 
403
393
  ending.merge!(
404
394
  type: :array,
405
395
  body: [contents],
406
- start: contents[:start],
407
- char_start: contents[:char_start]
396
+ sl: contents[:sl],
397
+ sc: contents[:sc]
408
398
  )
409
399
  end
410
400
  end
@@ -417,10 +407,10 @@ class Prettier::Parser < Ripper
417
407
  {
418
408
  type: :aryptn,
419
409
  body: [const, preargs, splatarg, postargs],
420
- start: pieces[0][:start],
421
- char_start: pieces[0][:char_start],
422
- end: pieces[-1][:end],
423
- char_end: pieces[-1][:char_end]
410
+ sl: pieces[0][:sl],
411
+ sc: pieces[0][:sc],
412
+ el: pieces[-1][:el],
413
+ ec: pieces[-1][:ec]
424
414
  }
425
415
  end
426
416
 
@@ -431,8 +421,8 @@ class Prettier::Parser < Ripper
431
421
  left.merge(
432
422
  type: :assign,
433
423
  body: [left, right],
434
- end: right[:end],
435
- char_end: right[:char_end]
424
+ el: right[:el],
425
+ ec: right[:ec]
436
426
  )
437
427
  end
438
428
 
@@ -443,10 +433,10 @@ class Prettier::Parser < Ripper
443
433
  {
444
434
  type: :assoc_new,
445
435
  body: [key, value],
446
- start: key[:start],
447
- char_start: key[:char_start],
448
- end: value[:end],
449
- char_end: value[:char_end]
436
+ sl: key[:sl],
437
+ sc: key[:sc],
438
+ el: value[:el],
439
+ ec: value[:ec]
450
440
  }
451
441
  end
452
442
 
@@ -456,8 +446,8 @@ class Prettier::Parser < Ripper
456
446
  find_scanner_event(:@op, '**').merge!(
457
447
  type: :assoc_splat,
458
448
  body: [contents],
459
- end: contents[:end],
460
- char_end: contents[:char_end]
449
+ el: contents[:el],
450
+ ec: contents[:ec]
461
451
  )
462
452
  end
463
453
 
@@ -469,10 +459,10 @@ class Prettier::Parser < Ripper
469
459
  {
470
460
  type: :assoclist_from_args,
471
461
  body: assocs,
472
- start: assocs[0][:start],
473
- char_start: assocs[0][:char_start],
474
- end: assocs[-1][:end],
475
- char_end: assocs[-1][:char_end]
462
+ sl: assocs[0][:sl],
463
+ sc: assocs[0][:sc],
464
+ el: assocs[-1][:el],
465
+ ec: assocs[-1][:ec]
476
466
  }
477
467
  end
478
468
 
@@ -484,10 +474,10 @@ class Prettier::Parser < Ripper
484
474
  {
485
475
  type: :bare_assoc_hash,
486
476
  body: assoc_news,
487
- start: assoc_news[0][:start],
488
- char_start: assoc_news[0][:char_start],
489
- end: assoc_news[-1][:end],
490
- char_end: assoc_news[-1][:char_end]
477
+ sl: assoc_news[0][:sl],
478
+ sc: assoc_news[0][:sc],
479
+ el: assoc_news[-1][:el],
480
+ ec: assoc_news[-1][:ec]
491
481
  }
492
482
  end
493
483
 
@@ -495,20 +485,20 @@ class Prettier::Parser < Ripper
495
485
  # It includes a bodystmt event that has all of the consequent clauses.
496
486
  def on_begin(bodystmt)
497
487
  beging = find_scanner_event(:@kw, 'begin')
498
- char_end =
488
+ ec =
499
489
  if bodystmt[:body][1..-1].any?
500
- bodystmt[:char_end]
490
+ bodystmt[:ec]
501
491
  else
502
- find_scanner_event(:@kw, 'end')[:char_end]
492
+ find_scanner_event(:@kw, 'end')[:ec]
503
493
  end
504
494
 
505
- bodystmt.bind(beging[:char_end], char_end)
495
+ bodystmt.bind(beging[:ec], ec)
506
496
 
507
497
  beging.merge!(
508
498
  type: :begin,
509
499
  body: [bodystmt],
510
- end: bodystmt[:end],
511
- char_end: bodystmt[:char_end]
500
+ el: bodystmt[:el],
501
+ ec: bodystmt[:ec]
512
502
  )
513
503
  end
514
504
 
@@ -518,10 +508,10 @@ class Prettier::Parser < Ripper
518
508
  {
519
509
  type: :binary,
520
510
  body: [left, oper, right],
521
- start: left[:start],
522
- char_start: left[:char_start],
523
- end: right[:end],
524
- char_end: right[:char_end]
511
+ sl: left[:sl],
512
+ sc: left[:sc],
513
+ el: right[:el],
514
+ ec: right[:ec]
525
515
  }
526
516
  end
527
517
 
@@ -531,7 +521,7 @@ class Prettier::Parser < Ripper
531
521
  index =
532
522
  scanner_events.rindex do |event|
533
523
  event[:type] == :@op && %w[| ||].include?(event[:body]) &&
534
- event[:char_start] < params[:char_start]
524
+ event[:sc] < params[:sc]
535
525
  end
536
526
 
537
527
  beging = scanner_events[index]
@@ -540,10 +530,10 @@ class Prettier::Parser < Ripper
540
530
  {
541
531
  type: :block_var,
542
532
  body: [params, locals],
543
- start: beging[:start],
544
- char_start: beging[:char_start],
545
- end: ending[:end],
546
- char_end: ending[:char_end]
533
+ sl: beging[:sl],
534
+ sc: beging[:sc],
535
+ el: ending[:el],
536
+ ec: ending[:ec]
547
537
  }
548
538
  end
549
539
 
@@ -553,8 +543,8 @@ class Prettier::Parser < Ripper
553
543
  find_scanner_event(:@op, '&').merge!(
554
544
  type: :blockarg,
555
545
  body: [ident],
556
- end: ident[:end],
557
- char_end: ident[:char_end]
546
+ el: ident[:el],
547
+ ec: ident[:ec]
558
548
  )
559
549
  end
560
550
 
@@ -562,21 +552,18 @@ class Prettier::Parser < Ripper
562
552
  # doesn't necessarily know where it started. So the parent node needs to
563
553
  # report back down into this one where it goes.
564
554
  class BodyStmt < SimpleDelegator
565
- def bind(char_start, char_end)
566
- merge!(char_start: char_start, char_end: char_end)
555
+ def bind(sc, ec)
556
+ merge!(sc: sc, ec: ec)
567
557
  parts = self[:body]
568
558
 
569
559
  # Here we're going to determine the bounds for the stmts
570
560
  consequent = parts[1..-1].compact.first
571
- self[:body][0].bind(
572
- char_start,
573
- consequent ? consequent[:char_start] : char_end
574
- )
561
+ self[:body][0].bind(sc, consequent ? consequent[:sc] : ec)
575
562
 
576
563
  # Next we're going to determine the rescue clause if there is one
577
564
  if parts[1]
578
565
  consequent = parts[2..-1].compact.first
579
- self[:body][1].bind_end(consequent ? consequent[:char_start] : char_end)
566
+ self[:body][1].bind_end(consequent ? consequent[:sc] : ec)
580
567
  end
581
568
  end
582
569
  end
@@ -587,10 +574,10 @@ class Prettier::Parser < Ripper
587
574
  BodyStmt.new(
588
575
  type: :bodystmt,
589
576
  body: [stmts, rescued, ensured, elsed],
590
- start: lineno,
591
- char_start: char_pos,
592
- end: lineno,
593
- char_end: char_pos
577
+ sl: lineno,
578
+ sc: char_pos,
579
+ el: lineno,
580
+ ec: char_pos
594
581
  )
595
582
  end
596
583
 
@@ -602,15 +589,15 @@ class Prettier::Parser < Ripper
602
589
  beging = find_scanner_event(:@lbrace)
603
590
  ending = find_scanner_event(:@rbrace)
604
591
 
605
- stmts.bind((block_var || beging)[:char_end], ending[:char_start])
592
+ stmts.bind((block_var || beging)[:ec], ending[:sc])
606
593
 
607
594
  {
608
595
  type: :brace_block,
609
596
  body: [block_var, stmts],
610
- start: beging[:start],
611
- char_start: beging[:char_start],
612
- end: ending[:end],
613
- char_end: ending[:char_end]
597
+ sl: beging[:sl],
598
+ sc: beging[:sc],
599
+ el: ending[:el],
600
+ ec: ending[:ec]
614
601
  }
615
602
  end
616
603
 
@@ -630,8 +617,8 @@ class Prettier::Parser < Ripper
630
617
  beging.merge!(
631
618
  type: :break,
632
619
  body: [args_add_block],
633
- end: args_add_block[:end],
634
- char_end: args_add_block[:char_end]
620
+ el: args_add_block[:el],
621
+ ec: args_add_block[:ec]
635
622
  )
636
623
  end
637
624
 
@@ -664,10 +651,10 @@ class Prettier::Parser < Ripper
664
651
  {
665
652
  type: :call,
666
653
  body: [receiver, oper, sending],
667
- start: receiver[:start],
668
- char_start: receiver[:char_start],
669
- end: ending[:end],
670
- char_end: ending[:char_end]
654
+ sl: receiver[:sl],
655
+ sc: receiver[:sc],
656
+ el: ending[:el],
657
+ ec: ending[:ec]
671
658
  }
672
659
  end
673
660
 
@@ -675,11 +662,18 @@ class Prettier::Parser < Ripper
675
662
  # It accepts as arguments the switch of the case and the consequent
676
663
  # clause.
677
664
  def on_case(switch, consequent)
678
- find_scanner_event(:@kw, 'case').merge!(
679
- type: :case,
665
+ beging =
666
+ if event = find_scanner_event(:@kw, 'case', consume: false)
667
+ scanner_events.delete(event).merge!(type: :case)
668
+ else
669
+ keyword = find_scanner_event(:@kw, 'in', consume: false)
670
+ switch.merge(type: :rassign, keyword: keyword)
671
+ end
672
+
673
+ beging.merge!(
680
674
  body: [switch, consequent],
681
- end: consequent[:end],
682
- char_end: consequent[:char_end]
675
+ el: consequent[:el],
676
+ ec: consequent[:ec]
683
677
  )
684
678
  end
685
679
 
@@ -713,17 +707,17 @@ class Prettier::Parser < Ripper
713
707
  ending = find_scanner_event(:@kw, 'end')
714
708
 
715
709
  bodystmt.bind(
716
- find_next_statement_start((superclass || const)[:char_end]),
717
- ending[:char_start]
710
+ find_next_statement_start((superclass || const)[:ec]),
711
+ ending[:sc]
718
712
  )
719
713
 
720
714
  {
721
715
  type: :class,
722
716
  body: [const, superclass, bodystmt],
723
- start: beging[:start],
724
- char_start: beging[:char_start],
725
- end: ending[:end],
726
- char_end: ending[:char_end]
717
+ sl: beging[:sl],
718
+ sc: beging[:sc],
719
+ el: ending[:el],
720
+ ec: ending[:ec]
727
721
  }
728
722
  end
729
723
 
@@ -734,10 +728,10 @@ class Prettier::Parser < Ripper
734
728
  {
735
729
  type: :command,
736
730
  body: [ident, args],
737
- start: ident[:start],
738
- char_start: ident[:char_start],
739
- end: args[:end],
740
- char_end: args[:char_end]
731
+ sl: ident[:sl],
732
+ sc: ident[:sc],
733
+ el: args[:el],
734
+ ec: args[:ec]
741
735
  }
742
736
  end
743
737
 
@@ -746,15 +740,20 @@ class Prettier::Parser < Ripper
746
740
  # of the method, the operator being used to send the method, the name of
747
741
  # the method, and the arguments being passed to the method.
748
742
  def on_command_call(receiver, oper, ident, args)
743
+ # Make sure we take the operator out of the scanner events so that it
744
+ # doesn't get confused for a unary operator later.
745
+ scanner_events.delete(oper)
746
+
747
+ # Grab the ending from either the arguments or the method being sent
749
748
  ending = args || ident
750
749
 
751
750
  {
752
751
  type: :command_call,
753
752
  body: [receiver, oper, ident, args],
754
- start: receiver[:start],
755
- char_start: receiver[:char_start],
756
- end: ending[:end],
757
- char_end: ending[:char_end]
753
+ sl: receiver[:sl],
754
+ sc: receiver[:sc],
755
+ el: ending[:el],
756
+ ec: ending[:ec]
758
757
  }
759
758
  end
760
759
 
@@ -768,10 +767,10 @@ class Prettier::Parser < Ripper
768
767
  {
769
768
  type: :const_path_field,
770
769
  body: [left, const],
771
- start: left[:start],
772
- char_start: left[:char_start],
773
- end: const[:end],
774
- char_end: const[:char_end]
770
+ sl: left[:sl],
771
+ sc: left[:sc],
772
+ el: const[:el],
773
+ ec: const[:ec]
775
774
  }
776
775
  end
777
776
 
@@ -785,10 +784,10 @@ class Prettier::Parser < Ripper
785
784
  {
786
785
  type: :const_path_ref,
787
786
  body: [left, const],
788
- start: left[:start],
789
- char_start: left[:char_start],
790
- end: const[:end],
791
- char_end: const[:char_end]
787
+ sl: left[:sl],
788
+ sc: left[:sc],
789
+ el: const[:el],
790
+ ec: const[:ec]
792
791
  }
793
792
  end
794
793
 
@@ -814,32 +813,54 @@ class Prettier::Parser < Ripper
814
813
  # │ └> params
815
814
  # └> ident
816
815
  #
816
+ # You can also have single-line methods since Ruby 3.0+, which have slightly
817
+ # different syntax but still flow through this method. Those look like:
818
+ #
819
+ # def foo = bar
820
+ # | |
821
+ # | └> stmt
822
+ # └> ident
823
+ #
817
824
  def on_def(ident, params, bodystmt)
818
825
  # Make sure to delete this scanner event in case you're defining something
819
826
  # like def class which would lead to this being a kw and causing all kinds
820
827
  # of trouble
821
828
  scanner_events.delete(ident)
822
829
 
830
+ # Find the beginning of the method definition, which works for single-line
831
+ # and normal method definitions.
832
+ beging = find_scanner_event(:@kw, 'def')
833
+
834
+ # If we don't have a bodystmt node, then we have a single-line method
835
+ if bodystmt[:type] != :bodystmt
836
+ return(
837
+ {
838
+ type: :defsl,
839
+ body: [ident, params, bodystmt],
840
+ sl: beging[:sl],
841
+ sc: beging[:sc],
842
+ el: bodystmt[:el],
843
+ ec: bodystmt[:ec]
844
+ }
845
+ )
846
+ end
847
+
823
848
  if params[:type] == :params && !params[:body].any?
824
- location = ident[:char_end]
825
- params.merge!(char_start: location, char_end: location)
849
+ location = ident[:ec]
850
+ params.merge!(sc: location, ec: location)
826
851
  end
827
852
 
828
- beging = find_scanner_event(:@kw, 'def')
829
853
  ending = find_scanner_event(:@kw, 'end')
830
854
 
831
- bodystmt.bind(
832
- find_next_statement_start(params[:char_end]),
833
- ending[:char_start]
834
- )
855
+ bodystmt.bind(find_next_statement_start(params[:ec]), ending[:sc])
835
856
 
836
857
  {
837
858
  type: :def,
838
859
  body: [ident, params, bodystmt],
839
- start: beging[:start],
840
- char_start: beging[:char_start],
841
- end: ending[:end],
842
- char_end: ending[:char_end]
860
+ sl: beging[:sl],
861
+ sc: beging[:sc],
862
+ el: ending[:el],
863
+ ec: ending[:ec]
843
864
  }
844
865
  end
845
866
 
@@ -864,25 +885,22 @@ class Prettier::Parser < Ripper
864
885
  scanner_events.delete(ident)
865
886
 
866
887
  if params[:type] == :params && !params[:body].any?
867
- location = ident[:char_end]
868
- params.merge!(char_start: location, char_end: location)
888
+ location = ident[:ec]
889
+ params.merge!(sc: location, ec: location)
869
890
  end
870
891
 
871
892
  beging = find_scanner_event(:@kw, 'def')
872
893
  ending = find_scanner_event(:@kw, 'end')
873
894
 
874
- bodystmt.bind(
875
- find_next_statement_start(params[:char_end]),
876
- ending[:char_start]
877
- )
895
+ bodystmt.bind(find_next_statement_start(params[:ec]), ending[:sc])
878
896
 
879
897
  {
880
898
  type: :defs,
881
899
  body: [target, oper, ident, params, bodystmt],
882
- start: beging[:start],
883
- char_start: beging[:char_start],
884
- end: ending[:end],
885
- char_end: ending[:char_end]
900
+ sl: beging[:sl],
901
+ sc: beging[:sc],
902
+ el: ending[:el],
903
+ ec: ending[:ec]
886
904
  }
887
905
  end
888
906
 
@@ -893,14 +911,14 @@ class Prettier::Parser < Ripper
893
911
  def on_defined(value)
894
912
  beging = find_scanner_event(:@kw, 'defined?')
895
913
 
896
- paren = source[beging[:char_end]...value[:char_start]].include?('(')
914
+ paren = source[beging[:ec]...value[:sc]].include?('(')
897
915
  ending = paren ? find_scanner_event(:@rparen) : value
898
916
 
899
917
  beging.merge!(
900
918
  type: :defined,
901
919
  body: [value],
902
- end: ending[:end],
903
- char_end: ending[:char_end]
920
+ el: ending[:el],
921
+ ec: ending[:ec]
904
922
  )
905
923
  end
906
924
 
@@ -912,15 +930,15 @@ class Prettier::Parser < Ripper
912
930
  beging = find_scanner_event(:@kw, 'do')
913
931
  ending = find_scanner_event(:@kw, 'end')
914
932
 
915
- bodystmt.bind((block_var || beging)[:char_end], ending[:char_start])
933
+ bodystmt.bind((block_var || beging)[:ec], ending[:sc])
916
934
 
917
935
  {
918
936
  type: :do_block,
919
937
  body: [block_var, bodystmt],
920
- start: beging[:start],
921
- char_start: beging[:char_start],
922
- end: ending[:end],
923
- char_end: ending[:char_end]
938
+ sl: beging[:sl],
939
+ sc: beging[:sc],
940
+ el: ending[:el],
941
+ ec: ending[:ec]
924
942
  }
925
943
  end
926
944
 
@@ -936,10 +954,10 @@ class Prettier::Parser < Ripper
936
954
  {
937
955
  type: :dot2,
938
956
  body: [left, right],
939
- start: beging[:start],
940
- char_start: beging[:char_start],
941
- end: ending[:end],
942
- char_end: ending[:char_end]
957
+ sl: beging[:sl],
958
+ sc: beging[:sc],
959
+ el: ending[:el],
960
+ ec: ending[:ec]
943
961
  }
944
962
  end
945
963
 
@@ -955,10 +973,10 @@ class Prettier::Parser < Ripper
955
973
  {
956
974
  type: :dot3,
957
975
  body: [left, right],
958
- start: beging[:start],
959
- char_start: beging[:char_start],
960
- end: ending[:end],
961
- char_end: ending[:char_end]
976
+ sl: beging[:sl],
977
+ sc: beging[:sc],
978
+ el: ending[:el],
979
+ ec: ending[:ec]
962
980
  }
963
981
  end
964
982
 
@@ -981,7 +999,7 @@ class Prettier::Parser < Ripper
981
999
  #
982
1000
  # which would be the same symbol as above.
983
1001
  def on_dyna_symbol(string)
984
- if scanner_events.any? { |event| event[:type] == :@symbeg }
1002
+ if find_scanner_event(:@symbeg, consume: false)
985
1003
  # A normal dynamic symbol
986
1004
  beging = find_scanner_event(:@symbeg)
987
1005
  ending = find_scanner_event(:@tstring_end)
@@ -990,8 +1008,8 @@ class Prettier::Parser < Ripper
990
1008
  type: :dyna_symbol,
991
1009
  quote: beging[:body][1],
992
1010
  body: string[:body],
993
- end: ending[:end],
994
- char_end: ending[:char_end]
1011
+ el: ending[:el],
1012
+ ec: ending[:ec]
995
1013
  )
996
1014
  else
997
1015
  # A dynamic symbol as a hash key
@@ -1001,10 +1019,10 @@ class Prettier::Parser < Ripper
1001
1019
  string.merge!(
1002
1020
  type: :dyna_symbol,
1003
1021
  quote: ending[:body][0],
1004
- start: beging[:start],
1005
- char_start: beging[:char_start],
1006
- end: ending[:end],
1007
- char_end: ending[:char_end]
1022
+ sl: beging[:sl],
1023
+ sc: beging[:sc],
1024
+ el: ending[:el],
1025
+ ec: ending[:ec]
1008
1026
  )
1009
1027
  end
1010
1028
  end
@@ -1029,15 +1047,15 @@ class Prettier::Parser < Ripper
1029
1047
  beging = find_scanner_event(:@kw, 'else')
1030
1048
  ending = find_else_ending
1031
1049
 
1032
- stmts.bind(beging[:char_end], ending[:char_start])
1050
+ stmts.bind(beging[:ec], ending[:sc])
1033
1051
 
1034
1052
  {
1035
1053
  type: :else,
1036
1054
  body: [stmts],
1037
- start: beging[:start],
1038
- char_start: beging[:char_start],
1039
- end: ending[:end],
1040
- char_end: ending[:char_end]
1055
+ sl: beging[:sl],
1056
+ sc: beging[:sc],
1057
+ el: ending[:el],
1058
+ ec: ending[:ec]
1041
1059
  }
1042
1060
  end
1043
1061
 
@@ -1049,15 +1067,15 @@ class Prettier::Parser < Ripper
1049
1067
  beging = find_scanner_event(:@kw, 'elsif')
1050
1068
  ending = consequent || find_scanner_event(:@kw, 'end')
1051
1069
 
1052
- stmts.bind(predicate[:char_end], ending[:char_start])
1070
+ stmts.bind(predicate[:ec], ending[:sc])
1053
1071
 
1054
1072
  {
1055
1073
  type: :elsif,
1056
1074
  body: [predicate, stmts, consequent],
1057
- start: beging[:start],
1058
- char_start: beging[:char_start],
1059
- end: ending[:end],
1060
- char_end: ending[:char_end]
1075
+ sl: beging[:sl],
1076
+ sc: beging[:sc],
1077
+ el: ending[:el],
1078
+ ec: ending[:ec]
1061
1079
  }
1062
1080
  end
1063
1081
 
@@ -1067,12 +1085,7 @@ class Prettier::Parser < Ripper
1067
1085
  # and add to it as we get content. It always starts with this scanner
1068
1086
  # event, so here we'll initialize the current embdoc.
1069
1087
  def on_embdoc_beg(value)
1070
- @embdoc = {
1071
- type: :@embdoc,
1072
- value: value,
1073
- start: lineno,
1074
- char_start: char_pos
1075
- }
1088
+ @embdoc = { type: :@embdoc, value: value, sl: lineno, sc: char_pos }
1076
1089
  end
1077
1090
 
1078
1091
  # This is a scanner event that gets hit when we're inside an embdoc and
@@ -1091,8 +1104,8 @@ class Prettier::Parser < Ripper
1091
1104
  @comments <<
1092
1105
  @embdoc.merge!(
1093
1106
  value: @embdoc[:value] << value.chomp,
1094
- end: lineno,
1095
- char_end: char_pos + value.length - 1
1107
+ el: lineno,
1108
+ ec: char_pos + value.length - 1
1096
1109
  )
1097
1110
 
1098
1111
  @embdoc = nil
@@ -1111,18 +1124,15 @@ class Prettier::Parser < Ripper
1111
1124
  end
1112
1125
 
1113
1126
  ending = scanner_events[index]
1114
- stmts.bind(
1115
- find_next_statement_start(beging[:char_end]),
1116
- ending[:char_start]
1117
- )
1127
+ stmts.bind(find_next_statement_start(beging[:ec]), ending[:sc])
1118
1128
 
1119
1129
  {
1120
1130
  type: :ensure,
1121
1131
  body: [beging, stmts],
1122
- start: beging[:start],
1123
- char_start: beging[:char_start],
1124
- end: ending[:end],
1125
- char_end: ending[:char_end]
1132
+ sl: beging[:sl],
1133
+ sc: beging[:sc],
1134
+ el: ending[:el],
1135
+ ec: ending[:ec]
1126
1136
  }
1127
1137
  end
1128
1138
 
@@ -1150,10 +1160,26 @@ class Prettier::Parser < Ripper
1150
1160
  {
1151
1161
  type: :field,
1152
1162
  body: [left, oper, right],
1153
- start: left[:start],
1154
- char_start: left[:char_start],
1155
- end: right[:end],
1156
- char_end: right[:char_end]
1163
+ sl: left[:sl],
1164
+ sc: left[:sc],
1165
+ el: right[:el],
1166
+ ec: right[:ec]
1167
+ }
1168
+ end
1169
+
1170
+ # fndptn is a parser event that represents matching against a pattern where
1171
+ # you find a pattern in an array using the Ruby 3.0+ pattern matching syntax.
1172
+ def on_fndptn(const, presplat, args, postsplat)
1173
+ beging = const || find_scanner_event(:@lbracket)
1174
+ ending = find_scanner_event(:@rbracket)
1175
+
1176
+ {
1177
+ type: :fndptn,
1178
+ body: [const, presplat, args, postsplat],
1179
+ sl: beging[:sl],
1180
+ sc: beging[:sc],
1181
+ el: ending[:el],
1182
+ ec: ending[:ec]
1157
1183
  }
1158
1184
  end
1159
1185
 
@@ -1165,15 +1191,15 @@ class Prettier::Parser < Ripper
1165
1191
  beging = find_scanner_event(:@kw, 'for')
1166
1192
  ending = find_scanner_event(:@kw, 'end')
1167
1193
 
1168
- stmts.bind(enumerable[:char_end], ending[:char_start])
1194
+ stmts.bind(enumerable[:ec], ending[:sc])
1169
1195
 
1170
1196
  {
1171
1197
  type: :for,
1172
1198
  body: [ident, enumerable, stmts],
1173
- start: beging[:start],
1174
- char_start: beging[:char_start],
1175
- end: ending[:end],
1176
- char_end: ending[:char_end]
1199
+ sl: beging[:sl],
1200
+ sc: beging[:sc],
1201
+ el: ending[:el],
1202
+ ec: ending[:ec]
1177
1203
  }
1178
1204
  end
1179
1205
 
@@ -1187,19 +1213,16 @@ class Prettier::Parser < Ripper
1187
1213
  if assoclist_from_args
1188
1214
  # Here we're going to expand out the location information for the assocs
1189
1215
  # node so that it can grab up any remaining comments inside the hash.
1190
- assoclist_from_args.merge!(
1191
- char_start: beging[:char_end],
1192
- char_end: ending[:char_start]
1193
- )
1216
+ assoclist_from_args.merge!(sc: beging[:ec], ec: ending[:sc])
1194
1217
  end
1195
1218
 
1196
1219
  {
1197
1220
  type: :hash,
1198
1221
  body: [assoclist_from_args],
1199
- start: beging[:start],
1200
- char_start: beging[:char_start],
1201
- end: ending[:end],
1202
- char_end: ending[:char_end]
1222
+ sl: beging[:sl],
1223
+ sc: beging[:sc],
1224
+ el: ending[:el],
1225
+ ec: ending[:ec]
1203
1226
  }
1204
1227
  end
1205
1228
 
@@ -1211,10 +1234,10 @@ class Prettier::Parser < Ripper
1211
1234
  # printer through our embed function.
1212
1235
  def on_heredoc_beg(beging)
1213
1236
  location = {
1214
- start: lineno,
1215
- end: lineno,
1216
- char_start: char_pos,
1217
- char_end: char_pos + beging.length + 1
1237
+ sl: lineno,
1238
+ el: lineno,
1239
+ sc: char_pos,
1240
+ ec: char_pos + beging.length + 1
1218
1241
  }
1219
1242
 
1220
1243
  # Here we're going to artificially create an extra node type so that if
@@ -1236,7 +1259,7 @@ class Prettier::Parser < Ripper
1236
1259
 
1237
1260
  # This is a scanner event that represents the end of the heredoc.
1238
1261
  def on_heredoc_end(ending)
1239
- @heredocs[-1].merge!(ending: ending.chomp, end: lineno, char_end: char_pos)
1262
+ @heredocs[-1].merge!(ending: ending.chomp, el: lineno, ec: char_pos)
1240
1263
  end
1241
1264
 
1242
1265
  # hshptn is a parser event that represents matching against a hash pattern
@@ -1247,10 +1270,10 @@ class Prettier::Parser < Ripper
1247
1270
  {
1248
1271
  type: :hshptn,
1249
1272
  body: [const, kw, kwrest],
1250
- start: pieces[0][:start],
1251
- char_start: pieces[0][:char_start],
1252
- end: pieces[-1][:end],
1253
- char_end: pieces[-1][:char_end]
1273
+ sl: pieces[0][:sl],
1274
+ sc: pieces[0][:sc],
1275
+ el: pieces[-1][:el],
1276
+ ec: pieces[-1][:ec]
1254
1277
  }
1255
1278
  end
1256
1279
 
@@ -1261,15 +1284,15 @@ class Prettier::Parser < Ripper
1261
1284
  beging = find_scanner_event(:@kw, 'if')
1262
1285
  ending = consequent || find_scanner_event(:@kw, 'end')
1263
1286
 
1264
- stmts.bind(predicate[:char_end], ending[:char_start])
1287
+ stmts.bind(predicate[:ec], ending[:sc])
1265
1288
 
1266
1289
  {
1267
1290
  type: :if,
1268
1291
  body: [predicate, stmts, consequent],
1269
- start: beging[:start],
1270
- char_start: beging[:char_start],
1271
- end: ending[:end],
1272
- char_end: ending[:char_end]
1292
+ sl: beging[:sl],
1293
+ sc: beging[:sc],
1294
+ el: ending[:el],
1295
+ ec: ending[:ec]
1273
1296
  }
1274
1297
  end
1275
1298
 
@@ -1280,8 +1303,8 @@ class Prettier::Parser < Ripper
1280
1303
  predicate.merge(
1281
1304
  type: :ifop,
1282
1305
  body: [predicate, truthy, falsy],
1283
- end: falsy[:end],
1284
- char_end: falsy[:char_end]
1306
+ el: falsy[:el],
1307
+ ec: falsy[:ec]
1285
1308
  )
1286
1309
  end
1287
1310
 
@@ -1294,26 +1317,30 @@ class Prettier::Parser < Ripper
1294
1317
  {
1295
1318
  type: :if_mod,
1296
1319
  body: [predicate, statement],
1297
- start: statement[:start],
1298
- char_start: statement[:char_start],
1299
- end: predicate[:end],
1300
- char_end: predicate[:char_end]
1320
+ sl: statement[:sl],
1321
+ sc: statement[:sc],
1322
+ el: predicate[:el],
1323
+ ec: predicate[:ec]
1301
1324
  }
1302
1325
  end
1303
1326
 
1304
1327
  # in is a parser event that represents using the in keyword within the
1305
- # Ruby 2.7+ pattern matching syntax.
1328
+ # Ruby 2.7+ pattern matching syntax. Alternatively in Ruby 3+ it is also used
1329
+ # to handle rightward assignment for pattern matching.
1306
1330
  def on_in(pattern, stmts, consequent)
1331
+ # Here we have a rightward assignment
1332
+ return pattern unless stmts
1333
+
1307
1334
  beging = find_scanner_event(:@kw, 'in')
1308
1335
  ending = consequent || find_scanner_event(:@kw, 'end')
1309
1336
 
1310
- stmts.bind(beging[:char_end], ending[:char_start])
1337
+ stmts.bind(beging[:ec], ending[:sc])
1311
1338
 
1312
1339
  beging.merge!(
1313
1340
  type: :in,
1314
1341
  body: [pattern, stmts, consequent],
1315
- end: ending[:end],
1316
- char_end: ending[:char_end]
1342
+ el: ending[:el],
1343
+ ec: ending[:ec]
1317
1344
  )
1318
1345
  end
1319
1346
 
@@ -1326,8 +1353,8 @@ class Prettier::Parser < Ripper
1326
1353
  oper.merge!(
1327
1354
  type: :kwrest_param,
1328
1355
  body: [ident],
1329
- end: ident[:end],
1330
- char_end: ident[:char_end]
1356
+ el: ident[:el],
1357
+ ec: ident[:ec]
1331
1358
  )
1332
1359
  end
1333
1360
 
@@ -1341,23 +1368,23 @@ class Prettier::Parser < Ripper
1341
1368
  def on_lambda(params, stmts)
1342
1369
  beging = find_scanner_event(:@tlambda)
1343
1370
 
1344
- if scanner_events.any? { |event| event[:type] == :@tlambeg }
1345
- opening = find_scanner_event(:@tlambeg)
1371
+ if event = find_scanner_event(:@tlambeg, consume: false)
1372
+ opening = scanner_events.delete(event)
1346
1373
  closing = find_scanner_event(:@rbrace)
1347
1374
  else
1348
1375
  opening = find_scanner_event(:@kw, 'do')
1349
1376
  closing = find_scanner_event(:@kw, 'end')
1350
1377
  end
1351
1378
 
1352
- stmts.bind(opening[:char_end], closing[:char_start])
1379
+ stmts.bind(opening[:ec], closing[:sc])
1353
1380
 
1354
1381
  {
1355
1382
  type: :lambda,
1356
1383
  body: [params, stmts],
1357
- start: beging[:start],
1358
- char_start: beging[:char_start],
1359
- end: closing[:end],
1360
- char_end: closing[:char_end]
1384
+ sl: beging[:sl],
1385
+ sc: beging[:sc],
1386
+ el: closing[:el],
1387
+ ec: closing[:ec]
1361
1388
  }
1362
1389
  end
1363
1390
 
@@ -1379,17 +1406,15 @@ class Prettier::Parser < Ripper
1379
1406
  # in which case we need to explicitly track the comma and add it onto the
1380
1407
  # child node.
1381
1408
  def on_massign(left, right)
1382
- if source[left[:char_end]...right[:char_start]].strip.start_with?(',')
1383
- left[:comma] = true
1384
- end
1409
+ left[:comma] = true if source[left[:ec]...right[:sc]].strip.start_with?(',')
1385
1410
 
1386
1411
  {
1387
1412
  type: :massign,
1388
1413
  body: [left, right],
1389
- start: left[:start],
1390
- char_start: left[:char_start],
1391
- end: right[:end],
1392
- char_end: right[:char_end]
1414
+ sl: left[:sl],
1415
+ sc: left[:sc],
1416
+ el: right[:el],
1417
+ ec: right[:ec]
1393
1418
  }
1394
1419
  end
1395
1420
 
@@ -1408,10 +1433,10 @@ class Prettier::Parser < Ripper
1408
1433
  {
1409
1434
  type: :method_add_arg,
1410
1435
  body: [fcall, arg_paren],
1411
- start: fcall[:start],
1412
- char_start: fcall[:char_start],
1413
- end: arg_paren[:end],
1414
- char_end: arg_paren[:char_end]
1436
+ sl: fcall[:sl],
1437
+ sc: fcall[:sc],
1438
+ el: arg_paren[:el],
1439
+ ec: arg_paren[:ec]
1415
1440
  }
1416
1441
  end
1417
1442
 
@@ -1422,10 +1447,10 @@ class Prettier::Parser < Ripper
1422
1447
  {
1423
1448
  type: :method_add_block,
1424
1449
  body: [method_add_arg, block],
1425
- start: method_add_arg[:start],
1426
- char_start: method_add_arg[:char_start],
1427
- end: block[:end],
1428
- char_end: block[:char_end]
1450
+ sl: method_add_arg[:sl],
1451
+ sc: method_add_arg[:sc],
1452
+ el: block[:el],
1453
+ ec: block[:ec]
1429
1454
  }
1430
1455
  end
1431
1456
 
@@ -1436,10 +1461,10 @@ class Prettier::Parser < Ripper
1436
1461
  {
1437
1462
  type: :mlhs,
1438
1463
  body: [],
1439
- start: lineno,
1440
- char_start: char_pos,
1441
- end: lineno,
1442
- char_end: char_pos
1464
+ sl: lineno,
1465
+ sc: char_pos,
1466
+ el: lineno,
1467
+ ec: char_pos
1443
1468
  }
1444
1469
  end
1445
1470
 
@@ -1450,11 +1475,7 @@ class Prettier::Parser < Ripper
1450
1475
  if mlhs[:body].empty?
1451
1476
  part.merge(type: :mlhs, body: [part])
1452
1477
  else
1453
- mlhs.merge!(
1454
- body: mlhs[:body] << part,
1455
- end: part[:end],
1456
- char_end: part[:char_end]
1457
- )
1478
+ mlhs.merge!(body: mlhs[:body] << part, el: part[:el], ec: part[:ec])
1458
1479
  end
1459
1480
  end
1460
1481
 
@@ -1467,8 +1488,8 @@ class Prettier::Parser < Ripper
1467
1488
  mlhs_add_star.merge(
1468
1489
  type: :mlhs_add_post,
1469
1490
  body: [mlhs_add_star, mlhs],
1470
- end: mlhs[:end],
1471
- char_end: mlhs[:char_end]
1491
+ el: mlhs[:el],
1492
+ ec: mlhs[:ec]
1472
1493
  )
1473
1494
  end
1474
1495
 
@@ -1483,10 +1504,10 @@ class Prettier::Parser < Ripper
1483
1504
  {
1484
1505
  type: :mlhs_add_star,
1485
1506
  body: [mlhs, part],
1486
- start: beging[:start],
1487
- char_start: beging[:char_start],
1488
- end: ending[:end],
1489
- char_end: ending[:char_end]
1507
+ sl: beging[:sl],
1508
+ sc: beging[:sc],
1509
+ el: ending[:el],
1510
+ ec: ending[:ec]
1490
1511
  }
1491
1512
  end
1492
1513
 
@@ -1498,17 +1519,17 @@ class Prettier::Parser < Ripper
1498
1519
  beging = find_scanner_event(:@lparen)
1499
1520
  ending = find_scanner_event(:@rparen)
1500
1521
 
1501
- if source[beging[:char_end]...ending[:char_start]].strip.end_with?(',')
1522
+ if source[beging[:ec]...ending[:sc]].strip.end_with?(',')
1502
1523
  contents[:comma] = true
1503
1524
  end
1504
1525
 
1505
1526
  {
1506
1527
  type: :mlhs_paren,
1507
1528
  body: [contents],
1508
- start: beging[:start],
1509
- char_start: beging[:char_start],
1510
- end: ending[:end],
1511
- char_end: ending[:char_end]
1529
+ sl: beging[:sl],
1530
+ sc: beging[:sc],
1531
+ el: ending[:el],
1532
+ ec: ending[:ec]
1512
1533
  }
1513
1534
  end
1514
1535
 
@@ -1519,18 +1540,15 @@ class Prettier::Parser < Ripper
1519
1540
  beging = find_scanner_event(:@kw, 'module')
1520
1541
  ending = find_scanner_event(:@kw, 'end')
1521
1542
 
1522
- bodystmt.bind(
1523
- find_next_statement_start(const[:char_end]),
1524
- ending[:char_start]
1525
- )
1543
+ bodystmt.bind(find_next_statement_start(const[:ec]), ending[:sc])
1526
1544
 
1527
1545
  {
1528
1546
  type: :module,
1529
1547
  body: [const, bodystmt],
1530
- start: beging[:start],
1531
- char_start: beging[:char_start],
1532
- end: ending[:end],
1533
- char_end: ending[:char_end]
1548
+ sl: beging[:sl],
1549
+ sc: beging[:sc],
1550
+ el: ending[:el],
1551
+ ec: ending[:ec]
1534
1552
  }
1535
1553
  end
1536
1554
 
@@ -1542,10 +1560,10 @@ class Prettier::Parser < Ripper
1542
1560
  {
1543
1561
  type: :mrhs,
1544
1562
  body: [],
1545
- start: lineno,
1546
- char_start: char_pos,
1547
- end: lineno,
1548
- char_end: char_pos
1563
+ sl: lineno,
1564
+ sc: char_pos,
1565
+ el: lineno,
1566
+ ec: char_pos
1549
1567
  }
1550
1568
  end
1551
1569
 
@@ -1555,11 +1573,7 @@ class Prettier::Parser < Ripper
1555
1573
  if mrhs[:body].empty?
1556
1574
  part.merge(type: :mrhs, body: [part])
1557
1575
  else
1558
- mrhs.merge!(
1559
- body: mrhs[:body] << part,
1560
- end: part[:end],
1561
- char_end: part[:char_end]
1562
- )
1576
+ mrhs.merge!(body: mrhs[:body] << part, el: part[:el], ec: part[:ec])
1563
1577
  end
1564
1578
  end
1565
1579
 
@@ -1573,10 +1587,10 @@ class Prettier::Parser < Ripper
1573
1587
  {
1574
1588
  type: :mrhs_add_star,
1575
1589
  body: [mrhs, part],
1576
- start: beging[:start],
1577
- char_start: beging[:char_start],
1578
- end: ending[:end],
1579
- char_end: ending[:char_end]
1590
+ sl: beging[:sl],
1591
+ sc: beging[:sc],
1592
+ el: ending[:el],
1593
+ ec: ending[:ec]
1580
1594
  }
1581
1595
  end
1582
1596
 
@@ -1599,8 +1613,8 @@ class Prettier::Parser < Ripper
1599
1613
  find_scanner_event(:@kw, 'next').merge!(
1600
1614
  type: :next,
1601
1615
  body: [args_add_block],
1602
- end: args_add_block[:end],
1603
- char_end: args_add_block[:char_end]
1616
+ el: args_add_block[:el],
1617
+ ec: args_add_block[:ec]
1604
1618
  )
1605
1619
  end
1606
1620
 
@@ -1612,8 +1626,8 @@ class Prettier::Parser < Ripper
1612
1626
  left.merge(
1613
1627
  type: :opassign,
1614
1628
  body: [left, oper, right],
1615
- end: right[:end],
1616
- char_end: right[:char_end]
1629
+ el: right[:el],
1630
+ ec: right[:ec]
1617
1631
  )
1618
1632
  end
1619
1633
 
@@ -1627,13 +1641,13 @@ class Prettier::Parser < Ripper
1627
1641
  location =
1628
1642
  if flattened.any?
1629
1643
  {
1630
- start: flattened[0][:start],
1631
- char_start: flattened[0][:char_start],
1632
- end: flattened[-1][:end],
1633
- char_end: flattened[-1][:char_end]
1644
+ sl: flattened[0][:sl],
1645
+ sc: flattened[0][:sc],
1646
+ el: flattened[-1][:el],
1647
+ ec: flattened[-1][:ec]
1634
1648
  }
1635
1649
  else
1636
- { start: lineno, char_start: char_pos, end: lineno, char_end: char_pos }
1650
+ { sl: lineno, sc: char_pos, el: lineno, ec: char_pos }
1637
1651
  end
1638
1652
 
1639
1653
  location.merge!(type: :params, body: types)
@@ -1643,13 +1657,18 @@ class Prettier::Parser < Ripper
1643
1657
  # anywhere in a Ruby program. It accepts as arguments the contents, which
1644
1658
  # can be either params or statements.
1645
1659
  def on_paren(contents)
1660
+ beging = find_scanner_event(:@lparen)
1646
1661
  ending = find_scanner_event(:@rparen)
1647
1662
 
1648
- find_scanner_event(:@lparen).merge!(
1663
+ if contents && contents[:type] == :params
1664
+ contents.merge!(sc: beging[:ec], ec: ending[:sc])
1665
+ end
1666
+
1667
+ beging.merge!(
1649
1668
  type: :paren,
1650
1669
  body: [contents],
1651
- end: ending[:end],
1652
- char_end: ending[:char_end]
1670
+ el: ending[:el],
1671
+ ec: ending[:ec]
1653
1672
  )
1654
1673
  end
1655
1674
 
@@ -1658,12 +1677,7 @@ class Prettier::Parser < Ripper
1658
1677
  # source string. We'll also attach on the __END__ content if there was
1659
1678
  # some found at the end of the source string.
1660
1679
  def on_program(stmts)
1661
- range = {
1662
- start: 1,
1663
- end: lines.length,
1664
- char_start: 0,
1665
- char_end: source.length
1666
- }
1680
+ range = { sl: 1, el: lines.length, sc: 0, ec: source.length }
1667
1681
 
1668
1682
  stmts[:body] << @__end__ if @__end__
1669
1683
  stmts.bind(0, source.length)
@@ -1685,8 +1699,8 @@ class Prettier::Parser < Ripper
1685
1699
  def on_qsymbols_add(qsymbols, tstring_content)
1686
1700
  qsymbols.merge!(
1687
1701
  body: qsymbols[:body] << tstring_content,
1688
- end: tstring_content[:end],
1689
- char_end: tstring_content[:char_end]
1702
+ el: tstring_content[:el],
1703
+ ec: tstring_content[:ec]
1690
1704
  )
1691
1705
  end
1692
1706
 
@@ -1704,8 +1718,8 @@ class Prettier::Parser < Ripper
1704
1718
  def on_qwords_add(qwords, tstring_content)
1705
1719
  qwords.merge!(
1706
1720
  body: qwords[:body] << tstring_content,
1707
- end: tstring_content[:end],
1708
- char_end: tstring_content[:char_end]
1721
+ el: tstring_content[:el],
1722
+ ec: tstring_content[:ec]
1709
1723
  )
1710
1724
  end
1711
1725
 
@@ -1730,8 +1744,8 @@ class Prettier::Parser < Ripper
1730
1744
  def on_regexp_add(regexp, piece)
1731
1745
  regexp.merge!(
1732
1746
  body: regexp[:body] << piece,
1733
- end: regexp[:end],
1734
- char_end: regexp[:char_end]
1747
+ el: regexp[:el],
1748
+ ec: regexp[:ec]
1735
1749
  )
1736
1750
  end
1737
1751
 
@@ -1743,8 +1757,8 @@ class Prettier::Parser < Ripper
1743
1757
  regexp.merge!(
1744
1758
  type: :regexp_literal,
1745
1759
  ending: ending[:body],
1746
- end: ending[:end],
1747
- char_end: ending[:char_end]
1760
+ el: ending[:el],
1761
+ ec: ending[:ec]
1748
1762
  )
1749
1763
  end
1750
1764
 
@@ -1753,17 +1767,17 @@ class Prettier::Parser < Ripper
1753
1767
  # determine its ending. Therefore it relies on its parent bodystmt node to
1754
1768
  # report its ending to it.
1755
1769
  class Rescue < SimpleDelegator
1756
- def bind_end(char_end)
1757
- merge!(char_end: char_end)
1770
+ def bind_end(ec)
1771
+ merge!(ec: ec)
1758
1772
 
1759
1773
  stmts = self[:body][2]
1760
1774
  consequent = self[:body][3]
1761
1775
 
1762
1776
  if consequent
1763
- consequent.bind_end(char_end)
1764
- stmts.bind_end(consequent[:char_start])
1777
+ consequent.bind_end(ec)
1778
+ stmts.bind_end(consequent[:sc])
1765
1779
  else
1766
- stmts.bind_end(char_end)
1780
+ stmts.bind_end(ec)
1767
1781
  end
1768
1782
  end
1769
1783
  end
@@ -1776,14 +1790,14 @@ class Prettier::Parser < Ripper
1776
1790
  last_exception = exceptions.is_a?(Array) ? exceptions[-1] : exceptions
1777
1791
  last_node = variable || last_exception || beging
1778
1792
 
1779
- stmts.bind(find_next_statement_start(last_node[:char_end]), char_pos)
1793
+ stmts.bind(find_next_statement_start(last_node[:ec]), char_pos)
1780
1794
 
1781
1795
  Rescue.new(
1782
1796
  beging.merge!(
1783
1797
  type: :rescue,
1784
1798
  body: [exceptions, variable, stmts, consequent],
1785
- end: lineno,
1786
- char_end: char_pos
1799
+ el: lineno,
1800
+ ec: char_pos
1787
1801
  )
1788
1802
  )
1789
1803
  end
@@ -1797,10 +1811,10 @@ class Prettier::Parser < Ripper
1797
1811
  {
1798
1812
  type: :rescue_mod,
1799
1813
  body: [statement, rescued],
1800
- start: statement[:start],
1801
- char_start: statement[:char_start],
1802
- end: rescued[:end],
1803
- char_end: rescued[:char_end]
1814
+ sl: statement[:sl],
1815
+ sc: statement[:sc],
1816
+ el: rescued[:el],
1817
+ ec: rescued[:ec]
1804
1818
  }
1805
1819
  end
1806
1820
 
@@ -1815,8 +1829,8 @@ class Prettier::Parser < Ripper
1815
1829
  oper.merge!(
1816
1830
  type: :rest_param,
1817
1831
  body: [ident],
1818
- end: ident[:end],
1819
- char_end: ident[:char_end]
1832
+ el: ident[:el],
1833
+ ec: ident[:ec]
1820
1834
  )
1821
1835
  end
1822
1836
 
@@ -1833,8 +1847,8 @@ class Prettier::Parser < Ripper
1833
1847
  find_scanner_event(:@kw, 'return').merge!(
1834
1848
  type: :return,
1835
1849
  body: [args_add_block],
1836
- end: args_add_block[:end],
1837
- char_end: args_add_block[:char_end]
1850
+ el: args_add_block[:el],
1851
+ ec: args_add_block[:ec]
1838
1852
  )
1839
1853
  end
1840
1854
 
@@ -1860,18 +1874,15 @@ class Prettier::Parser < Ripper
1860
1874
  beging = find_scanner_event(:@kw, 'class')
1861
1875
  ending = find_scanner_event(:@kw, 'end')
1862
1876
 
1863
- bodystmt.bind(
1864
- find_next_statement_start(target[:char_end]),
1865
- ending[:char_start]
1866
- )
1877
+ bodystmt.bind(find_next_statement_start(target[:ec]), ending[:sc])
1867
1878
 
1868
1879
  {
1869
1880
  type: :sclass,
1870
1881
  body: [target, bodystmt],
1871
- start: beging[:start],
1872
- char_start: beging[:char_start],
1873
- end: ending[:end],
1874
- char_end: ending[:char_end]
1882
+ sl: beging[:sl],
1883
+ sc: beging[:sc],
1884
+ el: ending[:el],
1885
+ ec: ending[:ec]
1875
1886
  }
1876
1887
  end
1877
1888
 
@@ -1883,23 +1894,23 @@ class Prettier::Parser < Ripper
1883
1894
  # propagate that onto void_stmt nodes inside the stmts in order to make sure
1884
1895
  # all comments get printed appropriately.
1885
1896
  class Stmts < SimpleDelegator
1886
- def bind(char_start, char_end)
1887
- merge!(char_start: char_start, char_end: char_end)
1897
+ def bind(sc, ec)
1898
+ merge!(sc: sc, ec: ec)
1888
1899
 
1889
1900
  if self[:body][0][:type] == :void_stmt
1890
- self[:body][0].merge!(char_start: char_start, char_end: char_start)
1901
+ self[:body][0].merge!(sc: sc, ec: sc)
1891
1902
  end
1892
1903
  end
1893
1904
 
1894
- def bind_end(char_end)
1895
- merge!(char_end: char_end)
1905
+ def bind_end(ec)
1906
+ merge!(ec: ec)
1896
1907
  end
1897
1908
 
1898
1909
  def <<(statement)
1899
1910
  if self[:body].any?
1900
- merge!(statement.slice(:end, :char_end))
1911
+ merge!(statement.slice(:el, :ec))
1901
1912
  else
1902
- merge!(statement.slice(:start, :end, :char_start, :char_end))
1913
+ merge!(statement.slice(:sl, :el, :sc, :ec))
1903
1914
  end
1904
1915
 
1905
1916
  self[:body] << statement
@@ -1914,10 +1925,10 @@ class Prettier::Parser < Ripper
1914
1925
  Stmts.new(
1915
1926
  type: :stmts,
1916
1927
  body: [],
1917
- start: lineno,
1918
- end: lineno,
1919
- char_start: char_pos,
1920
- char_end: char_pos
1928
+ sl: lineno,
1929
+ el: lineno,
1930
+ sc: char_pos,
1931
+ ec: char_pos
1921
1932
  )
1922
1933
  end
1923
1934
 
@@ -1939,10 +1950,10 @@ class Prettier::Parser < Ripper
1939
1950
  {
1940
1951
  type: :string_concat,
1941
1952
  body: [left, right],
1942
- start: left[:start],
1943
- char_start: left[:char_start],
1944
- end: right[:end],
1945
- char_end: right[:char_end]
1953
+ sl: left[:sl],
1954
+ sc: left[:sc],
1955
+ el: right[:el],
1956
+ ec: right[:ec]
1946
1957
  }
1947
1958
  end
1948
1959
 
@@ -1955,10 +1966,10 @@ class Prettier::Parser < Ripper
1955
1966
  {
1956
1967
  type: :string,
1957
1968
  body: [],
1958
- start: lineno,
1959
- end: lineno,
1960
- char_start: char_pos,
1961
- char_end: char_pos
1969
+ sl: lineno,
1970
+ el: lineno,
1971
+ sc: char_pos,
1972
+ ec: char_pos
1962
1973
  }
1963
1974
  end
1964
1975
 
@@ -1967,11 +1978,7 @@ class Prettier::Parser < Ripper
1967
1978
  # It accepts as arguments the parent string node as well as the additional
1968
1979
  # piece of the string.
1969
1980
  def on_string_add(string, piece)
1970
- string.merge!(
1971
- body: string[:body] << piece,
1972
- end: piece[:end],
1973
- char_end: piece[:char_end]
1974
- )
1981
+ string.merge!(body: string[:body] << piece, el: piece[:el], ec: piece[:ec])
1975
1982
  end
1976
1983
 
1977
1984
  # string_dvar is a parser event that represents a very special kind of
@@ -1983,8 +1990,8 @@ class Prettier::Parser < Ripper
1983
1990
  find_scanner_event(:@embvar).merge!(
1984
1991
  type: :string_dvar,
1985
1992
  body: [var_ref],
1986
- end: var_ref[:end],
1987
- char_end: var_ref[:char_end]
1993
+ el: var_ref[:el],
1994
+ ec: var_ref[:ec]
1988
1995
  )
1989
1996
  end
1990
1997
 
@@ -1996,15 +2003,15 @@ class Prettier::Parser < Ripper
1996
2003
  beging = find_scanner_event(:@embexpr_beg)
1997
2004
  ending = find_scanner_event(:@embexpr_end)
1998
2005
 
1999
- stmts.bind(beging[:char_end], ending[:char_start])
2006
+ stmts.bind(beging[:ec], ending[:sc])
2000
2007
 
2001
2008
  {
2002
2009
  type: :string_embexpr,
2003
2010
  body: [stmts],
2004
- start: beging[:start],
2005
- char_start: beging[:char_start],
2006
- end: ending[:end],
2007
- char_end: ending[:char_end]
2011
+ sl: beging[:sl],
2012
+ sc: beging[:sc],
2013
+ el: ending[:el],
2014
+ ec: ending[:ec]
2008
2015
  }
2009
2016
  end
2010
2017
 
@@ -2023,10 +2030,10 @@ class Prettier::Parser < Ripper
2023
2030
  type: :string_literal,
2024
2031
  body: string[:body],
2025
2032
  quote: beging[:body],
2026
- start: beging[:start],
2027
- char_start: beging[:char_start],
2028
- end: ending[:end],
2029
- char_end: ending[:char_end]
2033
+ sl: beging[:sl],
2034
+ sc: beging[:sc],
2035
+ el: ending[:el],
2036
+ ec: ending[:ec]
2030
2037
  }
2031
2038
  end
2032
2039
  end
@@ -2039,8 +2046,8 @@ class Prettier::Parser < Ripper
2039
2046
  find_scanner_event(:@kw, 'super').merge!(
2040
2047
  type: :super,
2041
2048
  body: [contents],
2042
- end: contents[:end],
2043
- char_end: contents[:char_end]
2049
+ el: contents[:el],
2050
+ ec: contents[:ec]
2044
2051
  )
2045
2052
  end
2046
2053
 
@@ -2071,7 +2078,7 @@ class Prettier::Parser < Ripper
2071
2078
  contents.merge(type: :symbol_literal, body: [contents])
2072
2079
  else
2073
2080
  beging = find_scanner_event(:@symbeg)
2074
- contents.merge!(type: :symbol_literal, char_start: beging[:char_start])
2081
+ contents.merge!(type: :symbol_literal, sc: beging[:sc])
2075
2082
  end
2076
2083
  end
2077
2084
 
@@ -2090,8 +2097,8 @@ class Prettier::Parser < Ripper
2090
2097
  def on_symbols_add(symbols, word_add)
2091
2098
  symbols.merge!(
2092
2099
  body: symbols[:body] << word_add,
2093
- end: word_add[:end],
2094
- char_end: word_add[:char_end]
2100
+ el: word_add[:el],
2101
+ ec: word_add[:ec]
2095
2102
  )
2096
2103
  end
2097
2104
 
@@ -2102,8 +2109,7 @@ class Prettier::Parser < Ripper
2102
2109
  def find_colon2_before(const)
2103
2110
  index =
2104
2111
  scanner_events.rindex do |event|
2105
- event[:type] == :@op && event[:body] == '::' &&
2106
- event[:char_start] < const[:char_start]
2112
+ event[:type] == :@op && event[:body] == '::' && event[:sc] < const[:sc]
2107
2113
  end
2108
2114
 
2109
2115
  scanner_events[index]
@@ -2120,8 +2126,8 @@ class Prettier::Parser < Ripper
2120
2126
  const.merge(
2121
2127
  type: :top_const_field,
2122
2128
  body: [const],
2123
- start: beging[:start],
2124
- char_start: beging[:char_start]
2129
+ sl: beging[:sl],
2130
+ sc: beging[:sc]
2125
2131
  )
2126
2132
  end
2127
2133
 
@@ -2136,8 +2142,8 @@ class Prettier::Parser < Ripper
2136
2142
  const.merge(
2137
2143
  type: :top_const_ref,
2138
2144
  body: [const],
2139
- start: beging[:start],
2140
- char_start: beging[:char_start]
2145
+ sl: beging[:sl],
2146
+ sc: beging[:sc]
2141
2147
  )
2142
2148
  end
2143
2149
 
@@ -2149,15 +2155,15 @@ class Prettier::Parser < Ripper
2149
2155
  if oper == :not
2150
2156
  node = find_scanner_event(:@kw, 'not')
2151
2157
 
2152
- paren = source[node[:char_end]...value[:char_start]].include?('(')
2158
+ paren = source[node[:ec]...value[:sc]].include?('(')
2153
2159
  ending = paren ? find_scanner_event(:@rparen) : value
2154
2160
 
2155
2161
  node.merge!(
2156
2162
  type: :unary,
2157
2163
  oper: oper,
2158
2164
  body: [value],
2159
- end: ending[:end],
2160
- char_end: ending[:char_end],
2165
+ el: ending[:el],
2166
+ ec: ending[:ec],
2161
2167
  paren: paren
2162
2168
  )
2163
2169
  else
@@ -2176,8 +2182,8 @@ class Prettier::Parser < Ripper
2176
2182
  type: :unary,
2177
2183
  oper: oper[0],
2178
2184
  body: [value],
2179
- end: value[:end],
2180
- char_end: value[:char_end]
2185
+ el: value[:el],
2186
+ ec: value[:ec]
2181
2187
  )
2182
2188
  end
2183
2189
  end
@@ -2192,8 +2198,8 @@ class Prettier::Parser < Ripper
2192
2198
  find_scanner_event(:@kw, 'undef').merge!(
2193
2199
  type: :undef,
2194
2200
  body: symbol_literals,
2195
- end: last[:end],
2196
- char_end: last[:char_end]
2201
+ el: last[:el],
2202
+ ec: last[:ec]
2197
2203
  )
2198
2204
  end
2199
2205
 
@@ -2205,15 +2211,15 @@ class Prettier::Parser < Ripper
2205
2211
  beging = find_scanner_event(:@kw, 'unless')
2206
2212
  ending = consequent || find_scanner_event(:@kw, 'end')
2207
2213
 
2208
- stmts.bind(predicate[:char_end], ending[:char_start])
2214
+ stmts.bind(predicate[:ec], ending[:sc])
2209
2215
 
2210
2216
  {
2211
2217
  type: :unless,
2212
2218
  body: [predicate, stmts, consequent],
2213
- start: beging[:start],
2214
- char_start: beging[:char_start],
2215
- end: ending[:end],
2216
- char_end: ending[:char_end]
2219
+ sl: beging[:sl],
2220
+ sc: beging[:sc],
2221
+ el: ending[:el],
2222
+ ec: ending[:ec]
2217
2223
  }
2218
2224
  end
2219
2225
 
@@ -2226,10 +2232,10 @@ class Prettier::Parser < Ripper
2226
2232
  {
2227
2233
  type: :unless_mod,
2228
2234
  body: [predicate, statement],
2229
- start: statement[:start],
2230
- char_start: statement[:char_start],
2231
- end: predicate[:end],
2232
- char_end: predicate[:char_end]
2235
+ sl: statement[:sl],
2236
+ sc: statement[:sc],
2237
+ el: predicate[:el],
2238
+ ec: predicate[:ec]
2233
2239
  }
2234
2240
  end
2235
2241
 
@@ -2240,15 +2246,22 @@ class Prettier::Parser < Ripper
2240
2246
  beging = find_scanner_event(:@kw, 'until')
2241
2247
  ending = find_scanner_event(:@kw, 'end')
2242
2248
 
2243
- stmts.bind(predicate[:char_end], ending[:char_start])
2249
+ # Consume the do keyword if it exists so that it doesn't get confused for
2250
+ # some other block
2251
+ do_event = find_scanner_event(:@kw, 'do', consume: false)
2252
+ if do_event && do_event[:sc] > predicate[:ec] && do_event[:ec] < ending[:sc]
2253
+ scanner_events.delete(do_event)
2254
+ end
2255
+
2256
+ stmts.bind(predicate[:ec], ending[:sc])
2244
2257
 
2245
2258
  {
2246
2259
  type: :until,
2247
2260
  body: [predicate, stmts],
2248
- start: beging[:start],
2249
- char_start: beging[:char_start],
2250
- end: ending[:end],
2251
- char_end: ending[:char_end]
2261
+ sl: beging[:sl],
2262
+ sc: beging[:sc],
2263
+ el: ending[:el],
2264
+ ec: ending[:ec]
2252
2265
  }
2253
2266
  end
2254
2267
 
@@ -2261,10 +2274,10 @@ class Prettier::Parser < Ripper
2261
2274
  {
2262
2275
  type: :until_mod,
2263
2276
  body: [predicate, statement],
2264
- start: statement[:start],
2265
- char_start: statement[:char_start],
2266
- end: predicate[:end],
2267
- char_end: predicate[:char_end]
2277
+ sl: statement[:sl],
2278
+ sc: statement[:sc],
2279
+ el: predicate[:el],
2280
+ ec: predicate[:ec]
2268
2281
  }
2269
2282
  end
2270
2283
 
@@ -2275,16 +2288,16 @@ class Prettier::Parser < Ripper
2275
2288
  def on_var_alias(left, right)
2276
2289
  beging = find_scanner_event(:@kw, 'alias')
2277
2290
 
2278
- paren = source[beging[:char_end]...left[:char_start]].include?('(')
2291
+ paren = source[beging[:ec]...left[:sc]].include?('(')
2279
2292
  ending = paren ? find_scanner_event(:@rparen) : right
2280
2293
 
2281
2294
  {
2282
2295
  type: :var_alias,
2283
2296
  body: [left, right],
2284
- start: beging[:start],
2285
- char_start: beging[:char_start],
2286
- end: ending[:end],
2287
- char_end: ending[:char_end]
2297
+ sl: beging[:sl],
2298
+ sc: beging[:sc],
2299
+ el: ending[:el],
2300
+ ec: ending[:ec]
2288
2301
  }
2289
2302
  end
2290
2303
 
@@ -2306,7 +2319,7 @@ class Prettier::Parser < Ripper
2306
2319
  else
2307
2320
  # You can hit this pattern if you're assigning to a splat using pattern
2308
2321
  # matching syntax in Ruby 2.7+
2309
- { type: :var_field, body: [] }
2322
+ { type: :var_field, body: nil }
2310
2323
  end
2311
2324
  end
2312
2325
 
@@ -2336,13 +2349,7 @@ class Prettier::Parser < Ripper
2336
2349
  # block of code. It often will have comments attached to it, so it requires
2337
2350
  # some special handling.
2338
2351
  def on_void_stmt
2339
- {
2340
- type: :void_stmt,
2341
- start: lineno,
2342
- end: lineno,
2343
- char_start: char_pos,
2344
- char_end: char_pos
2345
- }
2352
+ { type: :void_stmt, sl: lineno, el: lineno, sc: char_pos, ec: char_pos }
2346
2353
  end
2347
2354
 
2348
2355
  # when is a parser event that represents another clause in a case chain.
@@ -2353,15 +2360,15 @@ class Prettier::Parser < Ripper
2353
2360
  beging = find_scanner_event(:@kw, 'when')
2354
2361
  ending = consequent || find_scanner_event(:@kw, 'end')
2355
2362
 
2356
- stmts.bind(predicate[:char_end], ending[:char_start])
2363
+ stmts.bind(predicate[:ec], ending[:sc])
2357
2364
 
2358
2365
  {
2359
2366
  type: :when,
2360
2367
  body: [predicate, stmts, consequent],
2361
- start: beging[:start],
2362
- char_start: beging[:char_start],
2363
- end: ending[:end],
2364
- char_end: ending[:char_end]
2368
+ sl: beging[:sl],
2369
+ sc: beging[:sc],
2370
+ el: ending[:el],
2371
+ ec: ending[:ec]
2365
2372
  }
2366
2373
  end
2367
2374
 
@@ -2372,15 +2379,22 @@ class Prettier::Parser < Ripper
2372
2379
  beging = find_scanner_event(:@kw, 'while')
2373
2380
  ending = find_scanner_event(:@kw, 'end')
2374
2381
 
2375
- stmts.bind(predicate[:char_end], ending[:char_start])
2382
+ # Consume the do keyword if it exists so that it doesn't get confused for
2383
+ # some other block
2384
+ do_event = find_scanner_event(:@kw, 'do', consume: false)
2385
+ if do_event && do_event[:sc] > predicate[:ec] && do_event[:ec] < ending[:sc]
2386
+ scanner_events.delete(do_event)
2387
+ end
2388
+
2389
+ stmts.bind(predicate[:ec], ending[:sc])
2376
2390
 
2377
2391
  {
2378
2392
  type: :while,
2379
2393
  body: [predicate, stmts],
2380
- start: beging[:start],
2381
- char_start: beging[:char_start],
2382
- end: ending[:end],
2383
- char_end: ending[:char_end]
2394
+ sl: beging[:sl],
2395
+ sc: beging[:sc],
2396
+ el: ending[:el],
2397
+ ec: ending[:ec]
2384
2398
  }
2385
2399
  end
2386
2400
 
@@ -2393,10 +2407,10 @@ class Prettier::Parser < Ripper
2393
2407
  {
2394
2408
  type: :while_mod,
2395
2409
  body: [predicate, statement],
2396
- start: statement[:start],
2397
- char_start: statement[:char_start],
2398
- end: predicate[:end],
2399
- char_end: predicate[:char_end]
2410
+ sl: statement[:sl],
2411
+ sc: statement[:sc],
2412
+ el: predicate[:el],
2413
+ ec: predicate[:ec]
2400
2414
  }
2401
2415
  end
2402
2416
 
@@ -2426,11 +2440,7 @@ class Prettier::Parser < Ripper
2426
2440
  # location information from the first piece.
2427
2441
  piece.merge(type: :word, body: [piece])
2428
2442
  else
2429
- word.merge!(
2430
- body: word[:body] << piece,
2431
- end: piece[:end],
2432
- char_end: piece[:char_end]
2433
- )
2443
+ word.merge!(body: word[:body] << piece, el: piece[:el], ec: piece[:ec])
2434
2444
  end
2435
2445
  end
2436
2446
 
@@ -2449,8 +2459,8 @@ class Prettier::Parser < Ripper
2449
2459
  def on_words_add(words, word_add)
2450
2460
  words.merge!(
2451
2461
  body: words[:body] << word_add,
2452
- end: word_add[:end],
2453
- char_end: word_add[:char_end]
2462
+ el: word_add[:el],
2463
+ ec: word_add[:ec]
2454
2464
  )
2455
2465
  end
2456
2466
 
@@ -2483,8 +2493,8 @@ class Prettier::Parser < Ripper
2483
2493
  def on_xstring_add(xstring, piece)
2484
2494
  xstring.merge!(
2485
2495
  body: xstring[:body] << piece,
2486
- end: piece[:end],
2487
- char_end: piece[:char_end]
2496
+ el: piece[:el],
2497
+ ec: piece[:ec]
2488
2498
  )
2489
2499
  end
2490
2500
 
@@ -2509,11 +2519,7 @@ class Prettier::Parser < Ripper
2509
2519
  heredoc.merge!(body: xstring[:body])
2510
2520
  else
2511
2521
  ending = find_scanner_event(:@tstring_end)
2512
- xstring.merge!(
2513
- type: :xstring_literal,
2514
- end: ending[:end],
2515
- char_end: ending[:char_end]
2516
- )
2522
+ xstring.merge!(type: :xstring_literal, el: ending[:el], ec: ending[:ec])
2517
2523
  end
2518
2524
  end
2519
2525
 
@@ -2524,8 +2530,8 @@ class Prettier::Parser < Ripper
2524
2530
  find_scanner_event(:@kw, 'yield').merge!(
2525
2531
  type: :yield,
2526
2532
  body: [args_add_block],
2527
- end: args_add_block[:end],
2528
- char_end: args_add_block[:char_end]
2533
+ el: args_add_block[:el],
2534
+ ec: args_add_block[:ec]
2529
2535
  )
2530
2536
  end
2531
2537