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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +57 -1
- data/CONTRIBUTING.md +2 -2
- data/README.md +16 -1
- data/lib/prettier.rb +2 -2
- data/package.json +2 -2
- data/rubocop.yml +26 -0
- data/src/{ruby.js → plugin.js} +2 -2
- data/src/prettier.js +1 -0
- data/src/{embed.js → ruby/embed.js} +6 -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/ruby/nodes/blocks.js +90 -0
- data/src/{nodes → ruby/nodes}/calls.js +18 -9
- 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/ruby/nodes/hooks.js +34 -0
- data/src/{nodes → ruby/nodes}/ints.js +0 -0
- data/src/{nodes → ruby/nodes}/lambdas.js +2 -2
- data/src/{nodes → ruby/nodes}/loops.js +10 -7
- data/src/{nodes → ruby/nodes}/massign.js +8 -1
- data/src/{nodes → ruby/nodes}/methods.js +32 -6
- data/src/{nodes → ruby/nodes}/operators.js +2 -2
- data/src/{nodes → ruby/nodes}/params.js +31 -16
- data/src/{nodes → ruby/nodes}/patterns.js +54 -15
- data/src/{nodes → ruby/nodes}/regexp.js +2 -2
- data/src/{nodes → ruby/nodes}/rescue.js +2 -2
- data/src/ruby/nodes/return.js +94 -0
- data/src/{nodes → ruby/nodes}/statements.js +6 -9
- data/src/{nodes → ruby/nodes}/strings.js +27 -36
- 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} +4 -3
- data/src/{parser.rb → ruby/parser.rb} +498 -492
- data/src/{printer.js → ruby/printer.js} +33 -1
- data/src/{toProc.js → ruby/toProc.js} +4 -8
- 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 +14 -0
- data/src/utils/noIndent.js +10 -0
- data/src/utils/skipAssignIndent.js +10 -0
- metadata +49 -41
- data/src/nodes/blocks.js +0 -85
- data/src/nodes/case.js +0 -61
- data/src/nodes/commands.js +0 -91
- data/src/nodes/hooks.js +0 -44
- data/src/nodes/return.js +0 -72
@@ -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];
|
@@ -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:
|
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.
|
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.
|
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
|
-
|
92
|
+
ec = char_pos + value.size
|
93
93
|
node = {
|
94
94
|
type: :"@#{event}",
|
95
95
|
body: value,
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
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
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
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
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
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
|
-
|
198
|
-
|
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
|
-
|
225
|
-
|
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[:
|
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
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
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
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
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
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
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
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
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
|
-
|
334
|
-
|
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
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
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[:
|
360
|
+
ending = (args && args[:el] > rparen[:el]) ? args : rparen
|
371
361
|
|
372
362
|
{
|
373
363
|
type: :arg_paren,
|
374
364
|
body: [args],
|
375
|
-
|
376
|
-
|
377
|
-
|
378
|
-
|
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
|
-
|
395
|
-
|
396
|
-
|
397
|
-
|
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[:
|
391
|
+
contents[:ec] = ending[:ec]
|
402
392
|
|
403
393
|
ending.merge!(
|
404
394
|
type: :array,
|
405
395
|
body: [contents],
|
406
|
-
|
407
|
-
|
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
|
-
|
421
|
-
|
422
|
-
|
423
|
-
|
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
|
-
|
435
|
-
|
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
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
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
|
-
|
460
|
-
|
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
|
-
|
473
|
-
|
474
|
-
|
475
|
-
|
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
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
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
|
-
|
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
|
-
|
511
|
-
|
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
|
-
|
522
|
-
|
523
|
-
|
524
|
-
|
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[:
|
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
|
-
|
544
|
-
|
545
|
-
|
546
|
-
|
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
|
-
|
557
|
-
|
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(
|
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
|
@@ -587,10 +574,10 @@ class Prettier::Parser < Ripper
|
|
587
574
|
BodyStmt.new(
|
588
575
|
type: :bodystmt,
|
589
576
|
body: [stmts, rescued, ensured, elsed],
|
590
|
-
|
591
|
-
|
592
|
-
|
593
|
-
|
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)[:
|
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
|
-
|
611
|
-
|
612
|
-
|
613
|
-
|
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
|
-
|
634
|
-
|
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
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
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
|
-
|
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
|
-
|
682
|
-
|
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)[:
|
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
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
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
|
-
|
738
|
-
|
739
|
-
|
740
|
-
|
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
|
-
|
755
|
-
|
756
|
-
|
757
|
-
|
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
|
-
|
772
|
-
|
773
|
-
|
774
|
-
|
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
|
-
|
789
|
-
|
790
|
-
|
791
|
-
|
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[:
|
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
|
-
|
840
|
-
|
841
|
-
|
842
|
-
|
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[:
|
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
|
-
|
883
|
-
|
884
|
-
|
885
|
-
|
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[:
|
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
|
-
|
903
|
-
|
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)[:
|
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
|
-
|
921
|
-
|
922
|
-
|
923
|
-
|
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
|
-
|
940
|
-
|
941
|
-
|
942
|
-
|
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
|
-
|
959
|
-
|
960
|
-
|
961
|
-
|
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
|
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
|
-
|
994
|
-
|
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
|
-
|
1005
|
-
|
1006
|
-
|
1007
|
-
|
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[:
|
1050
|
+
stmts.bind(beging[:ec], ending[:sc])
|
1033
1051
|
|
1034
1052
|
{
|
1035
1053
|
type: :else,
|
1036
1054
|
body: [stmts],
|
1037
|
-
|
1038
|
-
|
1039
|
-
|
1040
|
-
|
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[:
|
1070
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
1053
1071
|
|
1054
1072
|
{
|
1055
1073
|
type: :elsif,
|
1056
1074
|
body: [predicate, stmts, consequent],
|
1057
|
-
|
1058
|
-
|
1059
|
-
|
1060
|
-
|
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
|
-
|
1095
|
-
|
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
|
-
|
1123
|
-
|
1124
|
-
|
1125
|
-
|
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
|
-
|
1154
|
-
|
1155
|
-
|
1156
|
-
|
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[:
|
1194
|
+
stmts.bind(enumerable[:ec], ending[:sc])
|
1169
1195
|
|
1170
1196
|
{
|
1171
1197
|
type: :for,
|
1172
1198
|
body: [ident, enumerable, stmts],
|
1173
|
-
|
1174
|
-
|
1175
|
-
|
1176
|
-
|
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
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
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
|
-
|
1215
|
-
|
1216
|
-
|
1217
|
-
|
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,
|
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
|
-
|
1251
|
-
|
1252
|
-
|
1253
|
-
|
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[:
|
1287
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
1265
1288
|
|
1266
1289
|
{
|
1267
1290
|
type: :if,
|
1268
1291
|
body: [predicate, stmts, consequent],
|
1269
|
-
|
1270
|
-
|
1271
|
-
|
1272
|
-
|
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
|
-
|
1284
|
-
|
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
|
-
|
1298
|
-
|
1299
|
-
|
1300
|
-
|
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[:
|
1337
|
+
stmts.bind(beging[:ec], ending[:sc])
|
1311
1338
|
|
1312
1339
|
beging.merge!(
|
1313
1340
|
type: :in,
|
1314
1341
|
body: [pattern, stmts, consequent],
|
1315
|
-
|
1316
|
-
|
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
|
-
|
1330
|
-
|
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
|
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
|
-
|
1358
|
-
|
1359
|
-
|
1360
|
-
|
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[:
|
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
|
-
|
1390
|
-
|
1391
|
-
|
1392
|
-
|
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
|
-
|
1412
|
-
|
1413
|
-
|
1414
|
-
|
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
|
-
|
1426
|
-
|
1427
|
-
|
1428
|
-
|
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
|
-
|
1440
|
-
|
1441
|
-
|
1442
|
-
|
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
|
-
|
1471
|
-
|
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
|
-
|
1487
|
-
|
1488
|
-
|
1489
|
-
|
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[:
|
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
|
-
|
1509
|
-
|
1510
|
-
|
1511
|
-
|
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
|
-
|
1531
|
-
|
1532
|
-
|
1533
|
-
|
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
|
-
|
1546
|
-
|
1547
|
-
|
1548
|
-
|
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
|
-
|
1577
|
-
|
1578
|
-
|
1579
|
-
|
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
|
-
|
1603
|
-
|
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
|
-
|
1616
|
-
|
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
|
-
|
1631
|
-
|
1632
|
-
|
1633
|
-
|
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
|
-
{
|
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
|
-
|
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
|
-
|
1652
|
-
|
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
|
-
|
1689
|
-
|
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
|
-
|
1708
|
-
|
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
|
-
|
1734
|
-
|
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
|
-
|
1747
|
-
|
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(
|
1757
|
-
merge!(
|
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(
|
1764
|
-
stmts.bind_end(consequent[:
|
1777
|
+
consequent.bind_end(ec)
|
1778
|
+
stmts.bind_end(consequent[:sc])
|
1765
1779
|
else
|
1766
|
-
stmts.bind_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[:
|
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
|
-
|
1786
|
-
|
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
|
-
|
1801
|
-
|
1802
|
-
|
1803
|
-
|
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
|
-
|
1819
|
-
|
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
|
-
|
1837
|
-
|
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
|
-
|
1872
|
-
|
1873
|
-
|
1874
|
-
|
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(
|
1887
|
-
merge!(
|
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!(
|
1901
|
+
self[:body][0].merge!(sc: sc, ec: sc)
|
1891
1902
|
end
|
1892
1903
|
end
|
1893
1904
|
|
1894
|
-
def bind_end(
|
1895
|
-
merge!(
|
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(:
|
1911
|
+
merge!(statement.slice(:el, :ec))
|
1901
1912
|
else
|
1902
|
-
merge!(statement.slice(:
|
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
|
-
|
1918
|
-
|
1919
|
-
|
1920
|
-
|
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
|
-
|
1943
|
-
|
1944
|
-
|
1945
|
-
|
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
|
-
|
1959
|
-
|
1960
|
-
|
1961
|
-
|
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
|
-
|
1987
|
-
|
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[:
|
2006
|
+
stmts.bind(beging[:ec], ending[:sc])
|
2000
2007
|
|
2001
2008
|
{
|
2002
2009
|
type: :string_embexpr,
|
2003
2010
|
body: [stmts],
|
2004
|
-
|
2005
|
-
|
2006
|
-
|
2007
|
-
|
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
|
-
|
2027
|
-
|
2028
|
-
|
2029
|
-
|
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
|
-
|
2043
|
-
|
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,
|
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
|
-
|
2094
|
-
|
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
|
-
|
2124
|
-
|
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
|
-
|
2140
|
-
|
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[:
|
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
|
-
|
2160
|
-
|
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
|
-
|
2180
|
-
|
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
|
-
|
2196
|
-
|
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[:
|
2214
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
2209
2215
|
|
2210
2216
|
{
|
2211
2217
|
type: :unless,
|
2212
2218
|
body: [predicate, stmts, consequent],
|
2213
|
-
|
2214
|
-
|
2215
|
-
|
2216
|
-
|
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
|
-
|
2230
|
-
|
2231
|
-
|
2232
|
-
|
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
|
-
|
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
|
-
|
2249
|
-
|
2250
|
-
|
2251
|
-
|
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
|
-
|
2265
|
-
|
2266
|
-
|
2267
|
-
|
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[:
|
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
|
-
|
2285
|
-
|
2286
|
-
|
2287
|
-
|
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[:
|
2363
|
+
stmts.bind(predicate[:ec], ending[:sc])
|
2357
2364
|
|
2358
2365
|
{
|
2359
2366
|
type: :when,
|
2360
2367
|
body: [predicate, stmts, consequent],
|
2361
|
-
|
2362
|
-
|
2363
|
-
|
2364
|
-
|
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
|
-
|
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
|
-
|
2381
|
-
|
2382
|
-
|
2383
|
-
|
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
|
-
|
2397
|
-
|
2398
|
-
|
2399
|
-
|
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
|
-
|
2453
|
-
|
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
|
-
|
2487
|
-
|
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
|
-
|
2528
|
-
|
2533
|
+
el: args_add_block[:el],
|
2534
|
+
ec: args_add_block[:ec]
|
2529
2535
|
)
|
2530
2536
|
end
|
2531
2537
|
|