prettier 1.0.1 → 1.2.3
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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +65 -1
- data/CONTRIBUTING.md +2 -2
- data/README.md +6 -1
- data/lib/prettier.rb +2 -2
- data/node_modules/prettier/index.js +54 -54
- data/package.json +4 -2
- data/src/{ruby.js → plugin.js} +2 -2
- data/src/{embed.js → ruby/embed.js} +2 -2
- data/src/{nodes.js → ruby/nodes.js} +0 -0
- data/src/{nodes → ruby/nodes}/alias.js +1 -1
- data/src/{nodes → ruby/nodes}/aref.js +8 -1
- data/src/{nodes → ruby/nodes}/args.js +2 -2
- data/src/{nodes → ruby/nodes}/arrays.js +2 -3
- data/src/{nodes → ruby/nodes}/assign.js +12 -4
- data/src/{nodes → ruby/nodes}/blocks.js +3 -3
- data/src/{nodes → ruby/nodes}/calls.js +54 -11
- data/src/ruby/nodes/case.js +65 -0
- data/src/{nodes → ruby/nodes}/class.js +1 -1
- data/src/ruby/nodes/commands.js +126 -0
- data/src/{nodes → ruby/nodes}/conditionals.js +3 -3
- data/src/{nodes → ruby/nodes}/constants.js +2 -2
- data/src/{nodes → ruby/nodes}/flow.js +2 -2
- data/src/{nodes → ruby/nodes}/hashes.js +32 -10
- data/src/{nodes → ruby/nodes}/heredocs.js +2 -2
- data/src/{nodes → ruby/nodes}/hooks.js +2 -2
- data/src/{nodes → ruby/nodes}/ints.js +0 -0
- data/src/{nodes → ruby/nodes}/lambdas.js +2 -2
- data/src/ruby/nodes/loops.js +104 -0
- data/src/{nodes → ruby/nodes}/massign.js +8 -1
- data/src/{nodes → ruby/nodes}/methods.js +34 -6
- data/src/{nodes → ruby/nodes}/operators.js +2 -2
- data/src/{nodes → ruby/nodes}/params.js +9 -2
- data/src/{nodes → ruby/nodes}/patterns.js +45 -10
- data/src/ruby/nodes/regexp.js +56 -0
- data/src/{nodes → ruby/nodes}/rescue.js +2 -2
- data/src/ruby/nodes/return.js +98 -0
- data/src/{nodes → ruby/nodes}/statements.js +1 -1
- data/src/{nodes → ruby/nodes}/strings.js +1 -1
- data/src/{nodes → ruby/nodes}/super.js +2 -2
- data/src/{nodes → ruby/nodes}/undef.js +1 -1
- data/src/{parser.js → ruby/parser.js} +2 -2
- data/src/{parser.rb → ruby/parser.rb} +323 -317
- data/src/{printer.js → ruby/printer.js} +46 -1
- data/src/{toProc.js → ruby/toProc.js} +0 -0
- data/src/utils.js +10 -93
- data/src/utils/containsAssignment.js +11 -0
- data/src/utils/getTrailingComma.js +5 -0
- data/src/utils/hasAncestor.js +17 -0
- data/src/utils/literal.js +7 -0
- data/src/utils/makeCall.js +11 -0
- data/src/utils/noIndent.js +10 -0
- data/src/utils/skipAssignIndent.js +10 -0
- metadata +48 -41
- data/src/nodes/case.js +0 -61
- data/src/nodes/commands.js +0 -91
- data/src/nodes/loops.js +0 -101
- data/src/nodes/regexp.js +0 -49
- data/src/nodes/return.js +0 -72
@@ -6,7 +6,7 @@ const {
|
|
6
6
|
literalline,
|
7
7
|
softline,
|
8
8
|
join
|
9
|
-
} = require("
|
9
|
+
} = require("../../prettier");
|
10
10
|
|
11
11
|
// If there is some part of this string that matches an escape sequence or that
|
12
12
|
// contains the interpolation pattern ("#{"), then we are locked into whichever
|
@@ -1,5 +1,5 @@
|
|
1
|
-
const { align, concat, group, join, line } = require("
|
2
|
-
const { literal } = require("
|
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];
|
@@ -67,14 +67,14 @@ function hasPragma(text) {
|
|
67
67
|
// for returning the index of the character within the source string that is the
|
68
68
|
// beginning of the given node.
|
69
69
|
function locStart(node) {
|
70
|
-
return node.
|
70
|
+
return node.sc;
|
71
71
|
}
|
72
72
|
|
73
73
|
// This function is critical for comments and cursor support, and is responsible
|
74
74
|
// for returning the index of the character within the source string that is the
|
75
75
|
// ending of the given node.
|
76
76
|
function locEnd(node) {
|
77
|
-
return node.
|
77
|
+
return node.ec;
|
78
78
|
}
|
79
79
|
|
80
80
|
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
|
-
|
92
|
+
ec = char_pos + value.size
|
93
93
|
node = {
|
94
94
|
type: :"@#{event}",
|
95
95
|
body: value,
|
96
96
|
start: lineno,
|
97
97
|
end: lineno,
|
98
|
-
|
99
|
-
|
98
|
+
sc: char_pos,
|
99
|
+
ec: ec
|
100
100
|
}
|
101
101
|
|
102
102
|
scanner_events << node
|
@@ -120,8 +120,8 @@ class Prettier::Parser < Ripper
|
|
120
120
|
value: value[1..-1].chomp.force_encoding('UTF-8'),
|
121
121
|
start: lineno,
|
122
122
|
end: lineno,
|
123
|
-
|
124
|
-
|
123
|
+
sc: char_pos,
|
124
|
+
ec: char_pos + value.length - 1
|
125
125
|
}
|
126
126
|
end
|
127
127
|
|
@@ -140,8 +140,8 @@ class Prettier::Parser < Ripper
|
|
140
140
|
body: nil,
|
141
141
|
start: lineno,
|
142
142
|
end: lineno,
|
143
|
-
|
144
|
-
|
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
194
|
end: ending[:end],
|
198
|
-
|
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
218
|
end: ending[:end],
|
225
|
-
|
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[:
|
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
237
|
start: beging[:start],
|
244
|
-
|
238
|
+
sc: beging[:sc],
|
245
239
|
end: ending[:end],
|
246
|
-
|
240
|
+
ec: ending[:ec]
|
247
241
|
}
|
248
242
|
end
|
249
243
|
|
@@ -269,9 +263,9 @@ class Prettier::Parser < Ripper
|
|
269
263
|
type: :aref,
|
270
264
|
body: [collection, index],
|
271
265
|
start: collection[:start],
|
272
|
-
|
266
|
+
sc: collection[:sc],
|
273
267
|
end: ending[:end],
|
274
|
-
|
268
|
+
ec: ending[:ec]
|
275
269
|
}
|
276
270
|
end
|
277
271
|
|
@@ -285,9 +279,9 @@ class Prettier::Parser < Ripper
|
|
285
279
|
type: :aref_field,
|
286
280
|
body: [collection, index],
|
287
281
|
start: collection[:start],
|
288
|
-
|
282
|
+
sc: collection[:sc],
|
289
283
|
end: ending[:end],
|
290
|
-
|
284
|
+
ec: ending[:ec]
|
291
285
|
}
|
292
286
|
end
|
293
287
|
|
@@ -299,9 +293,9 @@ class Prettier::Parser < Ripper
|
|
299
293
|
type: :args,
|
300
294
|
body: [],
|
301
295
|
start: lineno,
|
302
|
-
|
296
|
+
sc: char_pos,
|
303
297
|
end: lineno,
|
304
|
-
|
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, end: arg[:end], ec: arg[:ec])
|
321
311
|
end
|
322
312
|
end
|
323
313
|
|
@@ -331,7 +321,7 @@ class Prettier::Parser < Ripper
|
|
331
321
|
type: :args_add_block,
|
332
322
|
body: [args, block],
|
333
323
|
end: ending[:end],
|
334
|
-
|
324
|
+
ec: ending[:ec]
|
335
325
|
)
|
336
326
|
end
|
337
327
|
|
@@ -346,9 +336,9 @@ class Prettier::Parser < Ripper
|
|
346
336
|
type: :args_add_star,
|
347
337
|
body: [args, part],
|
348
338
|
start: beging[:start],
|
349
|
-
|
339
|
+
sc: beging[:sc],
|
350
340
|
end: ending[:end],
|
351
|
-
|
341
|
+
ec: ending[:ec]
|
352
342
|
}
|
353
343
|
end
|
354
344
|
|
@@ -373,9 +363,9 @@ class Prettier::Parser < Ripper
|
|
373
363
|
type: :arg_paren,
|
374
364
|
body: [args],
|
375
365
|
start: beging[:start],
|
376
|
-
|
366
|
+
sc: beging[:sc],
|
377
367
|
end: ending[:end],
|
378
|
-
|
368
|
+
ec: ending[:ec]
|
379
369
|
}
|
380
370
|
end
|
381
371
|
|
@@ -392,19 +382,19 @@ class Prettier::Parser < Ripper
|
|
392
382
|
type: :array,
|
393
383
|
body: [contents],
|
394
384
|
start: beging[:start],
|
395
|
-
|
385
|
+
sc: beging[:sc],
|
396
386
|
end: ending[:end],
|
397
|
-
|
387
|
+
ec: ending[:ec]
|
398
388
|
}
|
399
389
|
else
|
400
390
|
ending = find_scanner_event(:@tstring_end)
|
401
|
-
contents[:
|
391
|
+
contents[:ec] = ending[:ec]
|
402
392
|
|
403
393
|
ending.merge!(
|
404
394
|
type: :array,
|
405
395
|
body: [contents],
|
406
396
|
start: contents[:start],
|
407
|
-
|
397
|
+
sc: contents[:sc]
|
408
398
|
)
|
409
399
|
end
|
410
400
|
end
|
@@ -418,9 +408,9 @@ class Prettier::Parser < Ripper
|
|
418
408
|
type: :aryptn,
|
419
409
|
body: [const, preargs, splatarg, postargs],
|
420
410
|
start: pieces[0][:start],
|
421
|
-
|
411
|
+
sc: pieces[0][:sc],
|
422
412
|
end: pieces[-1][:end],
|
423
|
-
|
413
|
+
ec: pieces[-1][:ec]
|
424
414
|
}
|
425
415
|
end
|
426
416
|
|
@@ -432,7 +422,7 @@ class Prettier::Parser < Ripper
|
|
432
422
|
type: :assign,
|
433
423
|
body: [left, right],
|
434
424
|
end: right[:end],
|
435
|
-
|
425
|
+
ec: right[:ec]
|
436
426
|
)
|
437
427
|
end
|
438
428
|
|
@@ -444,9 +434,9 @@ class Prettier::Parser < Ripper
|
|
444
434
|
type: :assoc_new,
|
445
435
|
body: [key, value],
|
446
436
|
start: key[:start],
|
447
|
-
|
437
|
+
sc: key[:sc],
|
448
438
|
end: value[:end],
|
449
|
-
|
439
|
+
ec: value[:ec]
|
450
440
|
}
|
451
441
|
end
|
452
442
|
|
@@ -457,7 +447,7 @@ class Prettier::Parser < Ripper
|
|
457
447
|
type: :assoc_splat,
|
458
448
|
body: [contents],
|
459
449
|
end: contents[:end],
|
460
|
-
|
450
|
+
ec: contents[:ec]
|
461
451
|
)
|
462
452
|
end
|
463
453
|
|
@@ -470,9 +460,9 @@ class Prettier::Parser < Ripper
|
|
470
460
|
type: :assoclist_from_args,
|
471
461
|
body: assocs,
|
472
462
|
start: assocs[0][:start],
|
473
|
-
|
463
|
+
sc: assocs[0][:sc],
|
474
464
|
end: assocs[-1][:end],
|
475
|
-
|
465
|
+
ec: assocs[-1][:ec]
|
476
466
|
}
|
477
467
|
end
|
478
468
|
|
@@ -485,9 +475,9 @@ class Prettier::Parser < Ripper
|
|
485
475
|
type: :bare_assoc_hash,
|
486
476
|
body: assoc_news,
|
487
477
|
start: assoc_news[0][:start],
|
488
|
-
|
478
|
+
sc: assoc_news[0][:sc],
|
489
479
|
end: assoc_news[-1][:end],
|
490
|
-
|
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
|
-
|
488
|
+
ec =
|
499
489
|
if bodystmt[:body][1..-1].any?
|
500
|
-
bodystmt[:
|
490
|
+
bodystmt[:ec]
|
501
491
|
else
|
502
|
-
find_scanner_event(:@kw, 'end')[:
|
492
|
+
find_scanner_event(:@kw, 'end')[:ec]
|
503
493
|
end
|
504
494
|
|
505
|
-
bodystmt.bind(beging[:
|
495
|
+
bodystmt.bind(beging[:ec], ec)
|
506
496
|
|
507
497
|
beging.merge!(
|
508
498
|
type: :begin,
|
509
499
|
body: [bodystmt],
|
510
500
|
end: bodystmt[:end],
|
511
|
-
|
501
|
+
ec: bodystmt[:ec]
|
512
502
|
)
|
513
503
|
end
|
514
504
|
|
@@ -519,9 +509,9 @@ class Prettier::Parser < Ripper
|
|
519
509
|
type: :binary,
|
520
510
|
body: [left, oper, right],
|
521
511
|
start: left[:start],
|
522
|
-
|
512
|
+
sc: left[:sc],
|
523
513
|
end: right[:end],
|
524
|
-
|
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[:
|
524
|
+
event[:sc] < params[:sc]
|
535
525
|
end
|
536
526
|
|
537
527
|
beging = scanner_events[index]
|
@@ -541,9 +531,9 @@ class Prettier::Parser < Ripper
|
|
541
531
|
type: :block_var,
|
542
532
|
body: [params, locals],
|
543
533
|
start: beging[:start],
|
544
|
-
|
534
|
+
sc: beging[:sc],
|
545
535
|
end: ending[:end],
|
546
|
-
|
536
|
+
ec: ending[:ec]
|
547
537
|
}
|
548
538
|
end
|
549
539
|
|
@@ -554,7 +544,7 @@ class Prettier::Parser < Ripper
|
|
554
544
|
type: :blockarg,
|
555
545
|
body: [ident],
|
556
546
|
end: ident[:end],
|
557
|
-
|
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(
|
566
|
-
merge!(
|
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[:
|
566
|
+
self[:body][1].bind_end(consequent ? consequent[:sc] : ec)
|
580
567
|
end
|
581
568
|
end
|
582
569
|
end
|
@@ -588,9 +575,9 @@ class Prettier::Parser < Ripper
|
|
588
575
|
type: :bodystmt,
|
589
576
|
body: [stmts, rescued, ensured, elsed],
|
590
577
|
start: lineno,
|
591
|
-
|
578
|
+
sc: char_pos,
|
592
579
|
end: lineno,
|
593
|
-
|
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)[:
|
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
597
|
start: beging[:start],
|
611
|
-
|
598
|
+
sc: beging[:sc],
|
612
599
|
end: ending[:end],
|
613
|
-
|
600
|
+
ec: ending[:ec]
|
614
601
|
}
|
615
602
|
end
|
616
603
|
|
@@ -631,7 +618,7 @@ class Prettier::Parser < Ripper
|
|
631
618
|
type: :break,
|
632
619
|
body: [args_add_block],
|
633
620
|
end: args_add_block[:end],
|
634
|
-
|
621
|
+
ec: args_add_block[:ec]
|
635
622
|
)
|
636
623
|
end
|
637
624
|
|
@@ -665,9 +652,9 @@ class Prettier::Parser < Ripper
|
|
665
652
|
type: :call,
|
666
653
|
body: [receiver, oper, sending],
|
667
654
|
start: receiver[:start],
|
668
|
-
|
655
|
+
sc: receiver[:sc],
|
669
656
|
end: ending[:end],
|
670
|
-
|
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
|
-
|
679
|
-
|
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
675
|
end: consequent[:end],
|
682
|
-
|
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)[:
|
717
|
-
ending[:
|
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
717
|
start: beging[:start],
|
724
|
-
|
718
|
+
sc: beging[:sc],
|
725
719
|
end: ending[:end],
|
726
|
-
|
720
|
+
ec: ending[:ec]
|
727
721
|
}
|
728
722
|
end
|
729
723
|
|
@@ -735,9 +729,9 @@ class Prettier::Parser < Ripper
|
|
735
729
|
type: :command,
|
736
730
|
body: [ident, args],
|
737
731
|
start: ident[:start],
|
738
|
-
|
732
|
+
sc: ident[:sc],
|
739
733
|
end: args[:end],
|
740
|
-
|
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
753
|
start: receiver[:start],
|
755
|
-
|
754
|
+
sc: receiver[:sc],
|
756
755
|
end: ending[:end],
|
757
|
-
|
756
|
+
ec: ending[:ec]
|
758
757
|
}
|
759
758
|
end
|
760
759
|
|
@@ -769,9 +768,9 @@ class Prettier::Parser < Ripper
|
|
769
768
|
type: :const_path_field,
|
770
769
|
body: [left, const],
|
771
770
|
start: left[:start],
|
772
|
-
|
771
|
+
sc: left[:sc],
|
773
772
|
end: const[:end],
|
774
|
-
|
773
|
+
ec: const[:ec]
|
775
774
|
}
|
776
775
|
end
|
777
776
|
|
@@ -786,9 +785,9 @@ class Prettier::Parser < Ripper
|
|
786
785
|
type: :const_path_ref,
|
787
786
|
body: [left, const],
|
788
787
|
start: left[:start],
|
789
|
-
|
788
|
+
sc: left[:sc],
|
790
789
|
end: const[:end],
|
791
|
-
|
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
|
+
start: beging[:start],
|
841
|
+
sc: beging[:sc],
|
842
|
+
end: bodystmt[:end],
|
843
|
+
ec: bodystmt[:ec]
|
844
|
+
}
|
845
|
+
)
|
846
|
+
end
|
847
|
+
|
823
848
|
if params[:type] == :params && !params[:body].any?
|
824
|
-
location = ident[:
|
825
|
-
params.merge!(
|
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
860
|
start: beging[:start],
|
840
|
-
|
861
|
+
sc: beging[:sc],
|
841
862
|
end: ending[:end],
|
842
|
-
|
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[:
|
868
|
-
params.merge!(
|
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
900
|
start: beging[:start],
|
883
|
-
|
901
|
+
sc: beging[:sc],
|
884
902
|
end: ending[:end],
|
885
|
-
|
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[:
|
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
920
|
end: ending[:end],
|
903
|
-
|
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)[:
|
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
938
|
start: beging[:start],
|
921
|
-
|
939
|
+
sc: beging[:sc],
|
922
940
|
end: ending[:end],
|
923
|
-
|
941
|
+
ec: ending[:ec]
|
924
942
|
}
|
925
943
|
end
|
926
944
|
|
@@ -937,9 +955,9 @@ class Prettier::Parser < Ripper
|
|
937
955
|
type: :dot2,
|
938
956
|
body: [left, right],
|
939
957
|
start: beging[:start],
|
940
|
-
|
958
|
+
sc: beging[:sc],
|
941
959
|
end: ending[:end],
|
942
|
-
|
960
|
+
ec: ending[:ec]
|
943
961
|
}
|
944
962
|
end
|
945
963
|
|
@@ -956,9 +974,9 @@ class Prettier::Parser < Ripper
|
|
956
974
|
type: :dot3,
|
957
975
|
body: [left, right],
|
958
976
|
start: beging[:start],
|
959
|
-
|
977
|
+
sc: beging[:sc],
|
960
978
|
end: ending[:end],
|
961
|
-
|
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
|
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)
|
@@ -991,7 +1009,7 @@ class Prettier::Parser < Ripper
|
|
991
1009
|
quote: beging[:body][1],
|
992
1010
|
body: string[:body],
|
993
1011
|
end: ending[:end],
|
994
|
-
|
1012
|
+
ec: ending[:ec]
|
995
1013
|
)
|
996
1014
|
else
|
997
1015
|
# A dynamic symbol as a hash key
|
@@ -1002,9 +1020,9 @@ class Prettier::Parser < Ripper
|
|
1002
1020
|
type: :dyna_symbol,
|
1003
1021
|
quote: ending[:body][0],
|
1004
1022
|
start: beging[:start],
|
1005
|
-
|
1023
|
+
sc: beging[:sc],
|
1006
1024
|
end: ending[:end],
|
1007
|
-
|
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[:
|
1050
|
+
stmts.bind(beging[:ec], ending[:sc])
|
1033
1051
|
|
1034
1052
|
{
|
1035
1053
|
type: :else,
|
1036
1054
|
body: [stmts],
|
1037
1055
|
start: beging[:start],
|
1038
|
-
|
1056
|
+
sc: beging[:sc],
|
1039
1057
|
end: ending[:end],
|
1040
|
-
|
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[:
|
1070
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
1053
1071
|
|
1054
1072
|
{
|
1055
1073
|
type: :elsif,
|
1056
1074
|
body: [predicate, stmts, consequent],
|
1057
1075
|
start: beging[:start],
|
1058
|
-
|
1076
|
+
sc: beging[:sc],
|
1059
1077
|
end: ending[:end],
|
1060
|
-
|
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, start: 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
|
@@ -1092,7 +1105,7 @@ class Prettier::Parser < Ripper
|
|
1092
1105
|
@embdoc.merge!(
|
1093
1106
|
value: @embdoc[:value] << value.chomp,
|
1094
1107
|
end: lineno,
|
1095
|
-
|
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
1132
|
start: beging[:start],
|
1123
|
-
|
1133
|
+
sc: beging[:sc],
|
1124
1134
|
end: ending[:end],
|
1125
|
-
|
1135
|
+
ec: ending[:ec]
|
1126
1136
|
}
|
1127
1137
|
end
|
1128
1138
|
|
@@ -1151,9 +1161,25 @@ class Prettier::Parser < Ripper
|
|
1151
1161
|
type: :field,
|
1152
1162
|
body: [left, oper, right],
|
1153
1163
|
start: left[:start],
|
1154
|
-
|
1164
|
+
sc: left[:sc],
|
1155
1165
|
end: right[:end],
|
1156
|
-
|
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
|
+
start: beging[:start],
|
1180
|
+
sc: beging[:sc],
|
1181
|
+
end: ending[:end],
|
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[:
|
1194
|
+
stmts.bind(enumerable[:ec], ending[:sc])
|
1169
1195
|
|
1170
1196
|
{
|
1171
1197
|
type: :for,
|
1172
1198
|
body: [ident, enumerable, stmts],
|
1173
1199
|
start: beging[:start],
|
1174
|
-
|
1200
|
+
sc: beging[:sc],
|
1175
1201
|
end: ending[:end],
|
1176
|
-
|
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
1222
|
start: beging[:start],
|
1200
|
-
|
1223
|
+
sc: beging[:sc],
|
1201
1224
|
end: ending[:end],
|
1202
|
-
|
1225
|
+
ec: ending[:ec]
|
1203
1226
|
}
|
1204
1227
|
end
|
1205
1228
|
|
@@ -1213,8 +1236,8 @@ class Prettier::Parser < Ripper
|
|
1213
1236
|
location = {
|
1214
1237
|
start: lineno,
|
1215
1238
|
end: lineno,
|
1216
|
-
|
1217
|
-
|
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,
|
1262
|
+
@heredocs[-1].merge!(ending: ending.chomp, end: lineno, ec: char_pos)
|
1240
1263
|
end
|
1241
1264
|
|
1242
1265
|
# hshptn is a parser event that represents matching against a hash pattern
|
@@ -1248,9 +1271,9 @@ class Prettier::Parser < Ripper
|
|
1248
1271
|
type: :hshptn,
|
1249
1272
|
body: [const, kw, kwrest],
|
1250
1273
|
start: pieces[0][:start],
|
1251
|
-
|
1274
|
+
sc: pieces[0][:sc],
|
1252
1275
|
end: pieces[-1][:end],
|
1253
|
-
|
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[:
|
1287
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
1265
1288
|
|
1266
1289
|
{
|
1267
1290
|
type: :if,
|
1268
1291
|
body: [predicate, stmts, consequent],
|
1269
1292
|
start: beging[:start],
|
1270
|
-
|
1293
|
+
sc: beging[:sc],
|
1271
1294
|
end: ending[:end],
|
1272
|
-
|
1295
|
+
ec: ending[:ec]
|
1273
1296
|
}
|
1274
1297
|
end
|
1275
1298
|
|
@@ -1281,7 +1304,7 @@ class Prettier::Parser < Ripper
|
|
1281
1304
|
type: :ifop,
|
1282
1305
|
body: [predicate, truthy, falsy],
|
1283
1306
|
end: falsy[:end],
|
1284
|
-
|
1307
|
+
ec: falsy[:ec]
|
1285
1308
|
)
|
1286
1309
|
end
|
1287
1310
|
|
@@ -1295,25 +1318,29 @@ class Prettier::Parser < Ripper
|
|
1295
1318
|
type: :if_mod,
|
1296
1319
|
body: [predicate, statement],
|
1297
1320
|
start: statement[:start],
|
1298
|
-
|
1321
|
+
sc: statement[:sc],
|
1299
1322
|
end: predicate[:end],
|
1300
|
-
|
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[:
|
1337
|
+
stmts.bind(beging[:ec], ending[:sc])
|
1311
1338
|
|
1312
1339
|
beging.merge!(
|
1313
1340
|
type: :in,
|
1314
1341
|
body: [pattern, stmts, consequent],
|
1315
1342
|
end: ending[:end],
|
1316
|
-
|
1343
|
+
ec: ending[:ec]
|
1317
1344
|
)
|
1318
1345
|
end
|
1319
1346
|
|
@@ -1327,7 +1354,7 @@ class Prettier::Parser < Ripper
|
|
1327
1354
|
type: :kwrest_param,
|
1328
1355
|
body: [ident],
|
1329
1356
|
end: ident[:end],
|
1330
|
-
|
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
|
1345
|
-
opening =
|
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[:
|
1379
|
+
stmts.bind(opening[:ec], closing[:sc])
|
1353
1380
|
|
1354
1381
|
{
|
1355
1382
|
type: :lambda,
|
1356
1383
|
body: [params, stmts],
|
1357
1384
|
start: beging[:start],
|
1358
|
-
|
1385
|
+
sc: beging[:sc],
|
1359
1386
|
end: closing[:end],
|
1360
|
-
|
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[:
|
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
1414
|
start: left[:start],
|
1390
|
-
|
1415
|
+
sc: left[:sc],
|
1391
1416
|
end: right[:end],
|
1392
|
-
|
1417
|
+
ec: right[:ec]
|
1393
1418
|
}
|
1394
1419
|
end
|
1395
1420
|
|
@@ -1409,9 +1434,9 @@ class Prettier::Parser < Ripper
|
|
1409
1434
|
type: :method_add_arg,
|
1410
1435
|
body: [fcall, arg_paren],
|
1411
1436
|
start: fcall[:start],
|
1412
|
-
|
1437
|
+
sc: fcall[:sc],
|
1413
1438
|
end: arg_paren[:end],
|
1414
|
-
|
1439
|
+
ec: arg_paren[:ec]
|
1415
1440
|
}
|
1416
1441
|
end
|
1417
1442
|
|
@@ -1423,9 +1448,9 @@ class Prettier::Parser < Ripper
|
|
1423
1448
|
type: :method_add_block,
|
1424
1449
|
body: [method_add_arg, block],
|
1425
1450
|
start: method_add_arg[:start],
|
1426
|
-
|
1451
|
+
sc: method_add_arg[:sc],
|
1427
1452
|
end: block[:end],
|
1428
|
-
|
1453
|
+
ec: block[:ec]
|
1429
1454
|
}
|
1430
1455
|
end
|
1431
1456
|
|
@@ -1437,9 +1462,9 @@ class Prettier::Parser < Ripper
|
|
1437
1462
|
type: :mlhs,
|
1438
1463
|
body: [],
|
1439
1464
|
start: lineno,
|
1440
|
-
|
1465
|
+
sc: char_pos,
|
1441
1466
|
end: lineno,
|
1442
|
-
|
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, end: part[:end], ec: part[:ec])
|
1458
1479
|
end
|
1459
1480
|
end
|
1460
1481
|
|
@@ -1468,7 +1489,7 @@ class Prettier::Parser < Ripper
|
|
1468
1489
|
type: :mlhs_add_post,
|
1469
1490
|
body: [mlhs_add_star, mlhs],
|
1470
1491
|
end: mlhs[:end],
|
1471
|
-
|
1492
|
+
ec: mlhs[:ec]
|
1472
1493
|
)
|
1473
1494
|
end
|
1474
1495
|
|
@@ -1484,9 +1505,9 @@ class Prettier::Parser < Ripper
|
|
1484
1505
|
type: :mlhs_add_star,
|
1485
1506
|
body: [mlhs, part],
|
1486
1507
|
start: beging[:start],
|
1487
|
-
|
1508
|
+
sc: beging[:sc],
|
1488
1509
|
end: ending[:end],
|
1489
|
-
|
1510
|
+
ec: ending[:ec]
|
1490
1511
|
}
|
1491
1512
|
end
|
1492
1513
|
|
@@ -1498,7 +1519,7 @@ class Prettier::Parser < Ripper
|
|
1498
1519
|
beging = find_scanner_event(:@lparen)
|
1499
1520
|
ending = find_scanner_event(:@rparen)
|
1500
1521
|
|
1501
|
-
if source[beging[:
|
1522
|
+
if source[beging[:ec]...ending[:sc]].strip.end_with?(',')
|
1502
1523
|
contents[:comma] = true
|
1503
1524
|
end
|
1504
1525
|
|
@@ -1506,9 +1527,9 @@ class Prettier::Parser < Ripper
|
|
1506
1527
|
type: :mlhs_paren,
|
1507
1528
|
body: [contents],
|
1508
1529
|
start: beging[:start],
|
1509
|
-
|
1530
|
+
sc: beging[:sc],
|
1510
1531
|
end: ending[:end],
|
1511
|
-
|
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
1548
|
start: beging[:start],
|
1531
|
-
|
1549
|
+
sc: beging[:sc],
|
1532
1550
|
end: ending[:end],
|
1533
|
-
|
1551
|
+
ec: ending[:ec]
|
1534
1552
|
}
|
1535
1553
|
end
|
1536
1554
|
|
@@ -1543,9 +1561,9 @@ class Prettier::Parser < Ripper
|
|
1543
1561
|
type: :mrhs,
|
1544
1562
|
body: [],
|
1545
1563
|
start: lineno,
|
1546
|
-
|
1564
|
+
sc: char_pos,
|
1547
1565
|
end: lineno,
|
1548
|
-
|
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, end: part[:end], ec: part[:ec])
|
1563
1577
|
end
|
1564
1578
|
end
|
1565
1579
|
|
@@ -1574,9 +1588,9 @@ class Prettier::Parser < Ripper
|
|
1574
1588
|
type: :mrhs_add_star,
|
1575
1589
|
body: [mrhs, part],
|
1576
1590
|
start: beging[:start],
|
1577
|
-
|
1591
|
+
sc: beging[:sc],
|
1578
1592
|
end: ending[:end],
|
1579
|
-
|
1593
|
+
ec: ending[:ec]
|
1580
1594
|
}
|
1581
1595
|
end
|
1582
1596
|
|
@@ -1600,7 +1614,7 @@ class Prettier::Parser < Ripper
|
|
1600
1614
|
type: :next,
|
1601
1615
|
body: [args_add_block],
|
1602
1616
|
end: args_add_block[:end],
|
1603
|
-
|
1617
|
+
ec: args_add_block[:ec]
|
1604
1618
|
)
|
1605
1619
|
end
|
1606
1620
|
|
@@ -1613,7 +1627,7 @@ class Prettier::Parser < Ripper
|
|
1613
1627
|
type: :opassign,
|
1614
1628
|
body: [left, oper, right],
|
1615
1629
|
end: right[:end],
|
1616
|
-
|
1630
|
+
ec: right[:ec]
|
1617
1631
|
)
|
1618
1632
|
end
|
1619
1633
|
|
@@ -1628,12 +1642,12 @@ class Prettier::Parser < Ripper
|
|
1628
1642
|
if flattened.any?
|
1629
1643
|
{
|
1630
1644
|
start: flattened[0][:start],
|
1631
|
-
|
1645
|
+
sc: flattened[0][:sc],
|
1632
1646
|
end: flattened[-1][:end],
|
1633
|
-
|
1647
|
+
ec: flattened[-1][:ec]
|
1634
1648
|
}
|
1635
1649
|
else
|
1636
|
-
{ start: lineno,
|
1650
|
+
{ start: lineno, sc: char_pos, end: lineno, ec: char_pos }
|
1637
1651
|
end
|
1638
1652
|
|
1639
1653
|
location.merge!(type: :params, body: types)
|
@@ -1649,7 +1663,7 @@ class Prettier::Parser < Ripper
|
|
1649
1663
|
type: :paren,
|
1650
1664
|
body: [contents],
|
1651
1665
|
end: ending[:end],
|
1652
|
-
|
1666
|
+
ec: ending[:ec]
|
1653
1667
|
)
|
1654
1668
|
end
|
1655
1669
|
|
@@ -1658,12 +1672,7 @@ class Prettier::Parser < Ripper
|
|
1658
1672
|
# source string. We'll also attach on the __END__ content if there was
|
1659
1673
|
# some found at the end of the source string.
|
1660
1674
|
def on_program(stmts)
|
1661
|
-
range = {
|
1662
|
-
start: 1,
|
1663
|
-
end: lines.length,
|
1664
|
-
char_start: 0,
|
1665
|
-
char_end: source.length
|
1666
|
-
}
|
1675
|
+
range = { start: 1, end: lines.length, sc: 0, ec: source.length }
|
1667
1676
|
|
1668
1677
|
stmts[:body] << @__end__ if @__end__
|
1669
1678
|
stmts.bind(0, source.length)
|
@@ -1686,7 +1695,7 @@ class Prettier::Parser < Ripper
|
|
1686
1695
|
qsymbols.merge!(
|
1687
1696
|
body: qsymbols[:body] << tstring_content,
|
1688
1697
|
end: tstring_content[:end],
|
1689
|
-
|
1698
|
+
ec: tstring_content[:ec]
|
1690
1699
|
)
|
1691
1700
|
end
|
1692
1701
|
|
@@ -1705,7 +1714,7 @@ class Prettier::Parser < Ripper
|
|
1705
1714
|
qwords.merge!(
|
1706
1715
|
body: qwords[:body] << tstring_content,
|
1707
1716
|
end: tstring_content[:end],
|
1708
|
-
|
1717
|
+
ec: tstring_content[:ec]
|
1709
1718
|
)
|
1710
1719
|
end
|
1711
1720
|
|
@@ -1719,7 +1728,8 @@ class Prettier::Parser < Ripper
|
|
1719
1728
|
# expression literal, like /foo/. It can be followed by any number of
|
1720
1729
|
# regexp_add events, which we'll append onto an array body.
|
1721
1730
|
def on_regexp_new
|
1722
|
-
find_scanner_event(:@regexp_beg)
|
1731
|
+
beging = find_scanner_event(:@regexp_beg)
|
1732
|
+
beging.merge!(type: :regexp, body: [], beging: beging[:body])
|
1723
1733
|
end
|
1724
1734
|
|
1725
1735
|
# regexp_add is a parser event that represents a piece of a regular
|
@@ -1730,7 +1740,7 @@ class Prettier::Parser < Ripper
|
|
1730
1740
|
regexp.merge!(
|
1731
1741
|
body: regexp[:body] << piece,
|
1732
1742
|
end: regexp[:end],
|
1733
|
-
|
1743
|
+
ec: regexp[:ec]
|
1734
1744
|
)
|
1735
1745
|
end
|
1736
1746
|
|
@@ -1743,7 +1753,7 @@ class Prettier::Parser < Ripper
|
|
1743
1753
|
type: :regexp_literal,
|
1744
1754
|
ending: ending[:body],
|
1745
1755
|
end: ending[:end],
|
1746
|
-
|
1756
|
+
ec: ending[:ec]
|
1747
1757
|
)
|
1748
1758
|
end
|
1749
1759
|
|
@@ -1752,17 +1762,17 @@ class Prettier::Parser < Ripper
|
|
1752
1762
|
# determine its ending. Therefore it relies on its parent bodystmt node to
|
1753
1763
|
# report its ending to it.
|
1754
1764
|
class Rescue < SimpleDelegator
|
1755
|
-
def bind_end(
|
1756
|
-
merge!(
|
1765
|
+
def bind_end(ec)
|
1766
|
+
merge!(ec: ec)
|
1757
1767
|
|
1758
1768
|
stmts = self[:body][2]
|
1759
1769
|
consequent = self[:body][3]
|
1760
1770
|
|
1761
1771
|
if consequent
|
1762
|
-
consequent.bind_end(
|
1763
|
-
stmts.bind_end(consequent[:
|
1772
|
+
consequent.bind_end(ec)
|
1773
|
+
stmts.bind_end(consequent[:sc])
|
1764
1774
|
else
|
1765
|
-
stmts.bind_end(
|
1775
|
+
stmts.bind_end(ec)
|
1766
1776
|
end
|
1767
1777
|
end
|
1768
1778
|
end
|
@@ -1775,14 +1785,14 @@ class Prettier::Parser < Ripper
|
|
1775
1785
|
last_exception = exceptions.is_a?(Array) ? exceptions[-1] : exceptions
|
1776
1786
|
last_node = variable || last_exception || beging
|
1777
1787
|
|
1778
|
-
stmts.bind(find_next_statement_start(last_node[:
|
1788
|
+
stmts.bind(find_next_statement_start(last_node[:ec]), char_pos)
|
1779
1789
|
|
1780
1790
|
Rescue.new(
|
1781
1791
|
beging.merge!(
|
1782
1792
|
type: :rescue,
|
1783
1793
|
body: [exceptions, variable, stmts, consequent],
|
1784
1794
|
end: lineno,
|
1785
|
-
|
1795
|
+
ec: char_pos
|
1786
1796
|
)
|
1787
1797
|
)
|
1788
1798
|
end
|
@@ -1797,9 +1807,9 @@ class Prettier::Parser < Ripper
|
|
1797
1807
|
type: :rescue_mod,
|
1798
1808
|
body: [statement, rescued],
|
1799
1809
|
start: statement[:start],
|
1800
|
-
|
1810
|
+
sc: statement[:sc],
|
1801
1811
|
end: rescued[:end],
|
1802
|
-
|
1812
|
+
ec: rescued[:ec]
|
1803
1813
|
}
|
1804
1814
|
end
|
1805
1815
|
|
@@ -1815,7 +1825,7 @@ class Prettier::Parser < Ripper
|
|
1815
1825
|
type: :rest_param,
|
1816
1826
|
body: [ident],
|
1817
1827
|
end: ident[:end],
|
1818
|
-
|
1828
|
+
ec: ident[:ec]
|
1819
1829
|
)
|
1820
1830
|
end
|
1821
1831
|
|
@@ -1833,7 +1843,7 @@ class Prettier::Parser < Ripper
|
|
1833
1843
|
type: :return,
|
1834
1844
|
body: [args_add_block],
|
1835
1845
|
end: args_add_block[:end],
|
1836
|
-
|
1846
|
+
ec: args_add_block[:ec]
|
1837
1847
|
)
|
1838
1848
|
end
|
1839
1849
|
|
@@ -1859,18 +1869,15 @@ class Prettier::Parser < Ripper
|
|
1859
1869
|
beging = find_scanner_event(:@kw, 'class')
|
1860
1870
|
ending = find_scanner_event(:@kw, 'end')
|
1861
1871
|
|
1862
|
-
bodystmt.bind(
|
1863
|
-
find_next_statement_start(target[:char_end]),
|
1864
|
-
ending[:char_start]
|
1865
|
-
)
|
1872
|
+
bodystmt.bind(find_next_statement_start(target[:ec]), ending[:sc])
|
1866
1873
|
|
1867
1874
|
{
|
1868
1875
|
type: :sclass,
|
1869
1876
|
body: [target, bodystmt],
|
1870
1877
|
start: beging[:start],
|
1871
|
-
|
1878
|
+
sc: beging[:sc],
|
1872
1879
|
end: ending[:end],
|
1873
|
-
|
1880
|
+
ec: ending[:ec]
|
1874
1881
|
}
|
1875
1882
|
end
|
1876
1883
|
|
@@ -1882,23 +1889,23 @@ class Prettier::Parser < Ripper
|
|
1882
1889
|
# propagate that onto void_stmt nodes inside the stmts in order to make sure
|
1883
1890
|
# all comments get printed appropriately.
|
1884
1891
|
class Stmts < SimpleDelegator
|
1885
|
-
def bind(
|
1886
|
-
merge!(
|
1892
|
+
def bind(sc, ec)
|
1893
|
+
merge!(sc: sc, ec: ec)
|
1887
1894
|
|
1888
1895
|
if self[:body][0][:type] == :void_stmt
|
1889
|
-
self[:body][0].merge!(
|
1896
|
+
self[:body][0].merge!(sc: sc, ec: sc)
|
1890
1897
|
end
|
1891
1898
|
end
|
1892
1899
|
|
1893
|
-
def bind_end(
|
1894
|
-
merge!(
|
1900
|
+
def bind_end(ec)
|
1901
|
+
merge!(ec: ec)
|
1895
1902
|
end
|
1896
1903
|
|
1897
1904
|
def <<(statement)
|
1898
1905
|
if self[:body].any?
|
1899
|
-
merge!(statement.slice(:end, :
|
1906
|
+
merge!(statement.slice(:end, :ec))
|
1900
1907
|
else
|
1901
|
-
merge!(statement.slice(:start, :end, :
|
1908
|
+
merge!(statement.slice(:start, :end, :sc, :ec))
|
1902
1909
|
end
|
1903
1910
|
|
1904
1911
|
self[:body] << statement
|
@@ -1915,8 +1922,8 @@ class Prettier::Parser < Ripper
|
|
1915
1922
|
body: [],
|
1916
1923
|
start: lineno,
|
1917
1924
|
end: lineno,
|
1918
|
-
|
1919
|
-
|
1925
|
+
sc: char_pos,
|
1926
|
+
ec: char_pos
|
1920
1927
|
)
|
1921
1928
|
end
|
1922
1929
|
|
@@ -1939,9 +1946,9 @@ class Prettier::Parser < Ripper
|
|
1939
1946
|
type: :string_concat,
|
1940
1947
|
body: [left, right],
|
1941
1948
|
start: left[:start],
|
1942
|
-
|
1949
|
+
sc: left[:sc],
|
1943
1950
|
end: right[:end],
|
1944
|
-
|
1951
|
+
ec: right[:ec]
|
1945
1952
|
}
|
1946
1953
|
end
|
1947
1954
|
|
@@ -1956,8 +1963,8 @@ class Prettier::Parser < Ripper
|
|
1956
1963
|
body: [],
|
1957
1964
|
start: lineno,
|
1958
1965
|
end: lineno,
|
1959
|
-
|
1960
|
-
|
1966
|
+
sc: char_pos,
|
1967
|
+
ec: char_pos
|
1961
1968
|
}
|
1962
1969
|
end
|
1963
1970
|
|
@@ -1969,7 +1976,7 @@ class Prettier::Parser < Ripper
|
|
1969
1976
|
string.merge!(
|
1970
1977
|
body: string[:body] << piece,
|
1971
1978
|
end: piece[:end],
|
1972
|
-
|
1979
|
+
ec: piece[:ec]
|
1973
1980
|
)
|
1974
1981
|
end
|
1975
1982
|
|
@@ -1983,7 +1990,7 @@ class Prettier::Parser < Ripper
|
|
1983
1990
|
type: :string_dvar,
|
1984
1991
|
body: [var_ref],
|
1985
1992
|
end: var_ref[:end],
|
1986
|
-
|
1993
|
+
ec: var_ref[:ec]
|
1987
1994
|
)
|
1988
1995
|
end
|
1989
1996
|
|
@@ -1995,15 +2002,15 @@ class Prettier::Parser < Ripper
|
|
1995
2002
|
beging = find_scanner_event(:@embexpr_beg)
|
1996
2003
|
ending = find_scanner_event(:@embexpr_end)
|
1997
2004
|
|
1998
|
-
stmts.bind(beging[:
|
2005
|
+
stmts.bind(beging[:ec], ending[:sc])
|
1999
2006
|
|
2000
2007
|
{
|
2001
2008
|
type: :string_embexpr,
|
2002
2009
|
body: [stmts],
|
2003
2010
|
start: beging[:start],
|
2004
|
-
|
2011
|
+
sc: beging[:sc],
|
2005
2012
|
end: ending[:end],
|
2006
|
-
|
2013
|
+
ec: ending[:ec]
|
2007
2014
|
}
|
2008
2015
|
end
|
2009
2016
|
|
@@ -2023,9 +2030,9 @@ class Prettier::Parser < Ripper
|
|
2023
2030
|
body: string[:body],
|
2024
2031
|
quote: beging[:body],
|
2025
2032
|
start: beging[:start],
|
2026
|
-
|
2033
|
+
sc: beging[:sc],
|
2027
2034
|
end: ending[:end],
|
2028
|
-
|
2035
|
+
ec: ending[:ec]
|
2029
2036
|
}
|
2030
2037
|
end
|
2031
2038
|
end
|
@@ -2039,7 +2046,7 @@ class Prettier::Parser < Ripper
|
|
2039
2046
|
type: :super,
|
2040
2047
|
body: [contents],
|
2041
2048
|
end: contents[:end],
|
2042
|
-
|
2049
|
+
ec: contents[:ec]
|
2043
2050
|
)
|
2044
2051
|
end
|
2045
2052
|
|
@@ -2070,7 +2077,7 @@ class Prettier::Parser < Ripper
|
|
2070
2077
|
contents.merge(type: :symbol_literal, body: [contents])
|
2071
2078
|
else
|
2072
2079
|
beging = find_scanner_event(:@symbeg)
|
2073
|
-
contents.merge!(type: :symbol_literal,
|
2080
|
+
contents.merge!(type: :symbol_literal, sc: beging[:sc])
|
2074
2081
|
end
|
2075
2082
|
end
|
2076
2083
|
|
@@ -2090,7 +2097,7 @@ class Prettier::Parser < Ripper
|
|
2090
2097
|
symbols.merge!(
|
2091
2098
|
body: symbols[:body] << word_add,
|
2092
2099
|
end: word_add[:end],
|
2093
|
-
|
2100
|
+
ec: word_add[:ec]
|
2094
2101
|
)
|
2095
2102
|
end
|
2096
2103
|
|
@@ -2101,8 +2108,7 @@ class Prettier::Parser < Ripper
|
|
2101
2108
|
def find_colon2_before(const)
|
2102
2109
|
index =
|
2103
2110
|
scanner_events.rindex do |event|
|
2104
|
-
event[:type] == :@op && event[:body] == '::' &&
|
2105
|
-
event[:char_start] < const[:char_start]
|
2111
|
+
event[:type] == :@op && event[:body] == '::' && event[:sc] < const[:sc]
|
2106
2112
|
end
|
2107
2113
|
|
2108
2114
|
scanner_events[index]
|
@@ -2120,7 +2126,7 @@ class Prettier::Parser < Ripper
|
|
2120
2126
|
type: :top_const_field,
|
2121
2127
|
body: [const],
|
2122
2128
|
start: beging[:start],
|
2123
|
-
|
2129
|
+
sc: beging[:sc]
|
2124
2130
|
)
|
2125
2131
|
end
|
2126
2132
|
|
@@ -2136,7 +2142,7 @@ class Prettier::Parser < Ripper
|
|
2136
2142
|
type: :top_const_ref,
|
2137
2143
|
body: [const],
|
2138
2144
|
start: beging[:start],
|
2139
|
-
|
2145
|
+
sc: beging[:sc]
|
2140
2146
|
)
|
2141
2147
|
end
|
2142
2148
|
|
@@ -2148,7 +2154,7 @@ class Prettier::Parser < Ripper
|
|
2148
2154
|
if oper == :not
|
2149
2155
|
node = find_scanner_event(:@kw, 'not')
|
2150
2156
|
|
2151
|
-
paren = source[node[:
|
2157
|
+
paren = source[node[:ec]...value[:sc]].include?('(')
|
2152
2158
|
ending = paren ? find_scanner_event(:@rparen) : value
|
2153
2159
|
|
2154
2160
|
node.merge!(
|
@@ -2156,7 +2162,7 @@ class Prettier::Parser < Ripper
|
|
2156
2162
|
oper: oper,
|
2157
2163
|
body: [value],
|
2158
2164
|
end: ending[:end],
|
2159
|
-
|
2165
|
+
ec: ending[:ec],
|
2160
2166
|
paren: paren
|
2161
2167
|
)
|
2162
2168
|
else
|
@@ -2176,7 +2182,7 @@ class Prettier::Parser < Ripper
|
|
2176
2182
|
oper: oper[0],
|
2177
2183
|
body: [value],
|
2178
2184
|
end: value[:end],
|
2179
|
-
|
2185
|
+
ec: value[:ec]
|
2180
2186
|
)
|
2181
2187
|
end
|
2182
2188
|
end
|
@@ -2192,7 +2198,7 @@ class Prettier::Parser < Ripper
|
|
2192
2198
|
type: :undef,
|
2193
2199
|
body: symbol_literals,
|
2194
2200
|
end: last[:end],
|
2195
|
-
|
2201
|
+
ec: last[:ec]
|
2196
2202
|
)
|
2197
2203
|
end
|
2198
2204
|
|
@@ -2204,15 +2210,15 @@ class Prettier::Parser < Ripper
|
|
2204
2210
|
beging = find_scanner_event(:@kw, 'unless')
|
2205
2211
|
ending = consequent || find_scanner_event(:@kw, 'end')
|
2206
2212
|
|
2207
|
-
stmts.bind(predicate[:
|
2213
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
2208
2214
|
|
2209
2215
|
{
|
2210
2216
|
type: :unless,
|
2211
2217
|
body: [predicate, stmts, consequent],
|
2212
2218
|
start: beging[:start],
|
2213
|
-
|
2219
|
+
sc: beging[:sc],
|
2214
2220
|
end: ending[:end],
|
2215
|
-
|
2221
|
+
ec: ending[:ec]
|
2216
2222
|
}
|
2217
2223
|
end
|
2218
2224
|
|
@@ -2226,9 +2232,9 @@ class Prettier::Parser < Ripper
|
|
2226
2232
|
type: :unless_mod,
|
2227
2233
|
body: [predicate, statement],
|
2228
2234
|
start: statement[:start],
|
2229
|
-
|
2235
|
+
sc: statement[:sc],
|
2230
2236
|
end: predicate[:end],
|
2231
|
-
|
2237
|
+
ec: predicate[:ec]
|
2232
2238
|
}
|
2233
2239
|
end
|
2234
2240
|
|
@@ -2239,15 +2245,22 @@ class Prettier::Parser < Ripper
|
|
2239
2245
|
beging = find_scanner_event(:@kw, 'until')
|
2240
2246
|
ending = find_scanner_event(:@kw, 'end')
|
2241
2247
|
|
2242
|
-
|
2248
|
+
# Consume the do keyword if it exists so that it doesn't get confused for
|
2249
|
+
# some other block
|
2250
|
+
do_event = find_scanner_event(:@kw, 'do', consume: false)
|
2251
|
+
if do_event && do_event[:sc] > predicate[:ec] && do_event[:ec] < ending[:sc]
|
2252
|
+
scanner_events.delete(do_event)
|
2253
|
+
end
|
2254
|
+
|
2255
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
2243
2256
|
|
2244
2257
|
{
|
2245
2258
|
type: :until,
|
2246
2259
|
body: [predicate, stmts],
|
2247
2260
|
start: beging[:start],
|
2248
|
-
|
2261
|
+
sc: beging[:sc],
|
2249
2262
|
end: ending[:end],
|
2250
|
-
|
2263
|
+
ec: ending[:ec]
|
2251
2264
|
}
|
2252
2265
|
end
|
2253
2266
|
|
@@ -2261,9 +2274,9 @@ class Prettier::Parser < Ripper
|
|
2261
2274
|
type: :until_mod,
|
2262
2275
|
body: [predicate, statement],
|
2263
2276
|
start: statement[:start],
|
2264
|
-
|
2277
|
+
sc: statement[:sc],
|
2265
2278
|
end: predicate[:end],
|
2266
|
-
|
2279
|
+
ec: predicate[:ec]
|
2267
2280
|
}
|
2268
2281
|
end
|
2269
2282
|
|
@@ -2274,16 +2287,16 @@ class Prettier::Parser < Ripper
|
|
2274
2287
|
def on_var_alias(left, right)
|
2275
2288
|
beging = find_scanner_event(:@kw, 'alias')
|
2276
2289
|
|
2277
|
-
paren = source[beging[:
|
2290
|
+
paren = source[beging[:ec]...left[:sc]].include?('(')
|
2278
2291
|
ending = paren ? find_scanner_event(:@rparen) : right
|
2279
2292
|
|
2280
2293
|
{
|
2281
2294
|
type: :var_alias,
|
2282
2295
|
body: [left, right],
|
2283
2296
|
start: beging[:start],
|
2284
|
-
|
2297
|
+
sc: beging[:sc],
|
2285
2298
|
end: ending[:end],
|
2286
|
-
|
2299
|
+
ec: ending[:ec]
|
2287
2300
|
}
|
2288
2301
|
end
|
2289
2302
|
|
@@ -2305,7 +2318,7 @@ class Prettier::Parser < Ripper
|
|
2305
2318
|
else
|
2306
2319
|
# You can hit this pattern if you're assigning to a splat using pattern
|
2307
2320
|
# matching syntax in Ruby 2.7+
|
2308
|
-
{ type: :var_field, body:
|
2321
|
+
{ type: :var_field, body: nil }
|
2309
2322
|
end
|
2310
2323
|
end
|
2311
2324
|
|
@@ -2335,13 +2348,7 @@ class Prettier::Parser < Ripper
|
|
2335
2348
|
# block of code. It often will have comments attached to it, so it requires
|
2336
2349
|
# some special handling.
|
2337
2350
|
def on_void_stmt
|
2338
|
-
{
|
2339
|
-
type: :void_stmt,
|
2340
|
-
start: lineno,
|
2341
|
-
end: lineno,
|
2342
|
-
char_start: char_pos,
|
2343
|
-
char_end: char_pos
|
2344
|
-
}
|
2351
|
+
{ type: :void_stmt, start: lineno, end: lineno, sc: char_pos, ec: char_pos }
|
2345
2352
|
end
|
2346
2353
|
|
2347
2354
|
# when is a parser event that represents another clause in a case chain.
|
@@ -2352,15 +2359,15 @@ class Prettier::Parser < Ripper
|
|
2352
2359
|
beging = find_scanner_event(:@kw, 'when')
|
2353
2360
|
ending = consequent || find_scanner_event(:@kw, 'end')
|
2354
2361
|
|
2355
|
-
stmts.bind(predicate[:
|
2362
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
2356
2363
|
|
2357
2364
|
{
|
2358
2365
|
type: :when,
|
2359
2366
|
body: [predicate, stmts, consequent],
|
2360
2367
|
start: beging[:start],
|
2361
|
-
|
2368
|
+
sc: beging[:sc],
|
2362
2369
|
end: ending[:end],
|
2363
|
-
|
2370
|
+
ec: ending[:ec]
|
2364
2371
|
}
|
2365
2372
|
end
|
2366
2373
|
|
@@ -2371,15 +2378,22 @@ class Prettier::Parser < Ripper
|
|
2371
2378
|
beging = find_scanner_event(:@kw, 'while')
|
2372
2379
|
ending = find_scanner_event(:@kw, 'end')
|
2373
2380
|
|
2374
|
-
|
2381
|
+
# Consume the do keyword if it exists so that it doesn't get confused for
|
2382
|
+
# some other block
|
2383
|
+
do_event = find_scanner_event(:@kw, 'do', consume: false)
|
2384
|
+
if do_event && do_event[:sc] > predicate[:ec] && do_event[:ec] < ending[:sc]
|
2385
|
+
scanner_events.delete(do_event)
|
2386
|
+
end
|
2387
|
+
|
2388
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
2375
2389
|
|
2376
2390
|
{
|
2377
2391
|
type: :while,
|
2378
2392
|
body: [predicate, stmts],
|
2379
2393
|
start: beging[:start],
|
2380
|
-
|
2394
|
+
sc: beging[:sc],
|
2381
2395
|
end: ending[:end],
|
2382
|
-
|
2396
|
+
ec: ending[:ec]
|
2383
2397
|
}
|
2384
2398
|
end
|
2385
2399
|
|
@@ -2393,9 +2407,9 @@ class Prettier::Parser < Ripper
|
|
2393
2407
|
type: :while_mod,
|
2394
2408
|
body: [predicate, statement],
|
2395
2409
|
start: statement[:start],
|
2396
|
-
|
2410
|
+
sc: statement[:sc],
|
2397
2411
|
end: predicate[:end],
|
2398
|
-
|
2412
|
+
ec: predicate[:ec]
|
2399
2413
|
}
|
2400
2414
|
end
|
2401
2415
|
|
@@ -2425,11 +2439,7 @@ class Prettier::Parser < Ripper
|
|
2425
2439
|
# location information from the first piece.
|
2426
2440
|
piece.merge(type: :word, body: [piece])
|
2427
2441
|
else
|
2428
|
-
word.merge!(
|
2429
|
-
body: word[:body] << piece,
|
2430
|
-
end: piece[:end],
|
2431
|
-
char_end: piece[:char_end]
|
2432
|
-
)
|
2442
|
+
word.merge!(body: word[:body] << piece, end: piece[:end], ec: piece[:ec])
|
2433
2443
|
end
|
2434
2444
|
end
|
2435
2445
|
|
@@ -2449,7 +2459,7 @@ class Prettier::Parser < Ripper
|
|
2449
2459
|
words.merge!(
|
2450
2460
|
body: words[:body] << word_add,
|
2451
2461
|
end: word_add[:end],
|
2452
|
-
|
2462
|
+
ec: word_add[:ec]
|
2453
2463
|
)
|
2454
2464
|
end
|
2455
2465
|
|
@@ -2483,7 +2493,7 @@ class Prettier::Parser < Ripper
|
|
2483
2493
|
xstring.merge!(
|
2484
2494
|
body: xstring[:body] << piece,
|
2485
2495
|
end: piece[:end],
|
2486
|
-
|
2496
|
+
ec: piece[:ec]
|
2487
2497
|
)
|
2488
2498
|
end
|
2489
2499
|
|
@@ -2508,11 +2518,7 @@ class Prettier::Parser < Ripper
|
|
2508
2518
|
heredoc.merge!(body: xstring[:body])
|
2509
2519
|
else
|
2510
2520
|
ending = find_scanner_event(:@tstring_end)
|
2511
|
-
xstring.merge!(
|
2512
|
-
type: :xstring_literal,
|
2513
|
-
end: ending[:end],
|
2514
|
-
char_end: ending[:char_end]
|
2515
|
-
)
|
2521
|
+
xstring.merge!(type: :xstring_literal, end: ending[:end], ec: ending[:ec])
|
2516
2522
|
end
|
2517
2523
|
end
|
2518
2524
|
|
@@ -2524,7 +2530,7 @@ class Prettier::Parser < Ripper
|
|
2524
2530
|
type: :yield,
|
2525
2531
|
body: [args_add_block],
|
2526
2532
|
end: args_add_block[:end],
|
2527
|
-
|
2533
|
+
ec: args_add_block[:ec]
|
2528
2534
|
)
|
2529
2535
|
end
|
2530
2536
|
|