syntax_tree 2.2.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +20 -1
- data/.rubocop.yml +80 -0
- data/CHANGELOG.md +47 -1
- data/Gemfile +2 -0
- data/Gemfile.lock +26 -1
- data/README.md +113 -0
- data/Rakefile +27 -5
- data/config/rubocop.yml +64 -0
- data/lib/syntax_tree/cli.rb +63 -27
- data/lib/syntax_tree/formatter.rb +14 -6
- data/lib/syntax_tree/language_server/inlay_hints.rb +87 -38
- data/lib/syntax_tree/language_server.rb +50 -14
- data/lib/syntax_tree/node.rb +1042 -326
- data/lib/syntax_tree/parser.rb +444 -111
- data/lib/syntax_tree/prettyprint.rb +53 -38
- data/lib/syntax_tree/version.rb +1 -1
- data/lib/syntax_tree/visitor/field_visitor.rb +1115 -0
- data/lib/syntax_tree/visitor/json_visitor.rb +25 -1305
- data/lib/syntax_tree/visitor/match_visitor.rb +122 -0
- data/lib/syntax_tree/visitor/pretty_print_visitor.rb +35 -1163
- data/lib/syntax_tree/visitor.rb +6 -1
- data/lib/syntax_tree.rb +19 -1
- data/syntax_tree.gemspec +21 -19
- metadata +8 -4
data/lib/syntax_tree/parser.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module SyntaxTree
|
4
|
+
# Parser is a subclass of the Ripper library that subscribes to the stream of
|
5
|
+
# tokens and nodes coming from the parser and builds up a syntax tree.
|
4
6
|
class Parser < Ripper
|
5
7
|
# A special parser error so that we can get nice syntax displays on the
|
6
8
|
# error message when prettier prints out the results.
|
@@ -40,9 +42,11 @@ module SyntaxTree
|
|
40
42
|
@start = start
|
41
43
|
@indices = []
|
42
44
|
|
43
|
-
line
|
44
|
-
|
45
|
-
|
45
|
+
line
|
46
|
+
.each_char
|
47
|
+
.with_index(start) do |char, index|
|
48
|
+
char.bytesize.times { @indices << index }
|
49
|
+
end
|
46
50
|
end
|
47
51
|
|
48
52
|
# Technically it's possible for the column index to be a negative value if
|
@@ -130,10 +134,10 @@ module SyntaxTree
|
|
130
134
|
last_index = 0
|
131
135
|
|
132
136
|
@source.lines.each do |line|
|
133
|
-
if line.size == line.bytesize
|
134
|
-
|
137
|
+
@line_counts << if line.size == line.bytesize
|
138
|
+
SingleByteString.new(last_index)
|
135
139
|
else
|
136
|
-
|
140
|
+
MultiByteString.new(last_index, line)
|
137
141
|
end
|
138
142
|
|
139
143
|
last_index += line.size
|
@@ -239,7 +243,7 @@ module SyntaxTree
|
|
239
243
|
# By finding the next non-space character, we can make sure that the bounds
|
240
244
|
# of the statement list are correct.
|
241
245
|
def find_next_statement_start(position)
|
242
|
-
remaining = source[position
|
246
|
+
remaining = source[position..]
|
243
247
|
|
244
248
|
if remaining.sub(/\A +/, "")[0] == "#"
|
245
249
|
return position + remaining.index("\n")
|
@@ -264,7 +268,7 @@ module SyntaxTree
|
|
264
268
|
start_char,
|
265
269
|
start_char - line_counts[lbrace.location.start_line - 1].start,
|
266
270
|
rbrace.location.start_char,
|
267
|
-
rbrace.location.start_column
|
271
|
+
rbrace.location.start_column
|
268
272
|
)
|
269
273
|
|
270
274
|
keyword = find_token(Kw, "BEGIN")
|
@@ -281,7 +285,13 @@ module SyntaxTree
|
|
281
285
|
def on_CHAR(value)
|
282
286
|
CHAR.new(
|
283
287
|
value: value,
|
284
|
-
location:
|
288
|
+
location:
|
289
|
+
Location.token(
|
290
|
+
line: lineno,
|
291
|
+
char: char_pos,
|
292
|
+
column: current_column,
|
293
|
+
size: value.size
|
294
|
+
)
|
285
295
|
)
|
286
296
|
end
|
287
297
|
|
@@ -313,8 +323,14 @@ module SyntaxTree
|
|
313
323
|
def on___end__(value)
|
314
324
|
@__end__ =
|
315
325
|
EndContent.new(
|
316
|
-
value: source[(char_pos + value.length)
|
317
|
-
location:
|
326
|
+
value: source[(char_pos + value.length)..],
|
327
|
+
location:
|
328
|
+
Location.token(
|
329
|
+
line: lineno,
|
330
|
+
char: char_pos,
|
331
|
+
column: current_column,
|
332
|
+
size: value.size
|
333
|
+
)
|
318
334
|
)
|
319
335
|
end
|
320
336
|
|
@@ -423,7 +439,8 @@ module SyntaxTree
|
|
423
439
|
# If there are any arguments and the operator we found from the list is
|
424
440
|
# not after them, then we're going to return the arguments as-is because
|
425
441
|
# we're looking at an & that occurs before the arguments are done.
|
426
|
-
if arguments.parts.any? &&
|
442
|
+
if arguments.parts.any? &&
|
443
|
+
operator.location.start_char < arguments.location.end_char
|
427
444
|
return arguments
|
428
445
|
end
|
429
446
|
|
@@ -478,7 +495,11 @@ module SyntaxTree
|
|
478
495
|
# :call-seq:
|
479
496
|
# on_args_new: () -> Args
|
480
497
|
def on_args_new
|
481
|
-
Args.new(
|
498
|
+
Args.new(
|
499
|
+
parts: [],
|
500
|
+
location:
|
501
|
+
Location.fixed(line: lineno, column: current_column, char: char_pos)
|
502
|
+
)
|
482
503
|
end
|
483
504
|
|
484
505
|
# :call-seq:
|
@@ -529,7 +550,7 @@ module SyntaxTree
|
|
529
550
|
|
530
551
|
# If there's the optional then keyword, then we'll delete that and use it
|
531
552
|
# as the end bounds of the location.
|
532
|
-
if token = find_token(Kw, "then", consume: false)
|
553
|
+
if (token = find_token(Kw, "then", consume: false))
|
533
554
|
tokens.delete(token)
|
534
555
|
location = location.to(token.location)
|
535
556
|
end
|
@@ -538,10 +559,10 @@ module SyntaxTree
|
|
538
559
|
# here because it currently doesn't have anything to use for its precise
|
539
560
|
# location. If we hit a comma, then we've gone too far.
|
540
561
|
if rest.is_a?(VarField) && rest.value.nil?
|
541
|
-
tokens.rindex do |
|
542
|
-
case
|
562
|
+
tokens.rindex do |rtoken|
|
563
|
+
case rtoken
|
543
564
|
in Op[value: "*"]
|
544
|
-
rest = VarField.new(value: nil, location:
|
565
|
+
rest = VarField.new(value: nil, location: rtoken.location)
|
545
566
|
break
|
546
567
|
in Comma
|
547
568
|
break
|
@@ -561,7 +582,13 @@ module SyntaxTree
|
|
561
582
|
|
562
583
|
# :call-seq:
|
563
584
|
# on_assign: (
|
564
|
-
# (
|
585
|
+
# (
|
586
|
+
# ARefField |
|
587
|
+
# ConstPathField |
|
588
|
+
# Field |
|
589
|
+
# TopConstField |
|
590
|
+
# VarField
|
591
|
+
# ) target,
|
565
592
|
# untyped value
|
566
593
|
# ) -> Assign
|
567
594
|
def on_assign(target, value)
|
@@ -586,7 +613,10 @@ module SyntaxTree
|
|
586
613
|
def on_assoc_splat(value)
|
587
614
|
operator = find_token(Op, "**")
|
588
615
|
|
589
|
-
AssocSplat.new(
|
616
|
+
AssocSplat.new(
|
617
|
+
value: value,
|
618
|
+
location: operator.location.to(value.location)
|
619
|
+
)
|
590
620
|
end
|
591
621
|
|
592
622
|
# def on_assoclist_from_args(assocs)
|
@@ -598,7 +628,13 @@ module SyntaxTree
|
|
598
628
|
def on_backref(value)
|
599
629
|
Backref.new(
|
600
630
|
value: value,
|
601
|
-
location:
|
631
|
+
location:
|
632
|
+
Location.token(
|
633
|
+
line: lineno,
|
634
|
+
char: char_pos,
|
635
|
+
column: current_column,
|
636
|
+
size: value.size
|
637
|
+
)
|
602
638
|
)
|
603
639
|
end
|
604
640
|
|
@@ -608,7 +644,13 @@ module SyntaxTree
|
|
608
644
|
node =
|
609
645
|
Backtick.new(
|
610
646
|
value: value,
|
611
|
-
location:
|
647
|
+
location:
|
648
|
+
Location.token(
|
649
|
+
line: lineno,
|
650
|
+
char: char_pos,
|
651
|
+
column: current_column,
|
652
|
+
size: value.size
|
653
|
+
)
|
612
654
|
)
|
613
655
|
|
614
656
|
tokens << node
|
@@ -616,7 +658,9 @@ module SyntaxTree
|
|
616
658
|
end
|
617
659
|
|
618
660
|
# :call-seq:
|
619
|
-
# on_bare_assoc_hash: (
|
661
|
+
# on_bare_assoc_hash: (
|
662
|
+
# Array[AssocNew | AssocSplat] assocs
|
663
|
+
# ) -> BareAssocHash
|
620
664
|
def on_bare_assoc_hash(assocs)
|
621
665
|
BareAssocHash.new(
|
622
666
|
assocs: assocs,
|
@@ -641,7 +685,7 @@ module SyntaxTree
|
|
641
685
|
keyword = find_token(Kw, "begin")
|
642
686
|
end_location =
|
643
687
|
if bodystmt.rescue_clause || bodystmt.ensure_clause ||
|
644
|
-
|
688
|
+
bodystmt.else_clause
|
645
689
|
bodystmt.location
|
646
690
|
else
|
647
691
|
find_token(Kw, "end").location
|
@@ -660,7 +704,11 @@ module SyntaxTree
|
|
660
704
|
end
|
661
705
|
|
662
706
|
# :call-seq:
|
663
|
-
# on_binary: (
|
707
|
+
# on_binary: (
|
708
|
+
# untyped left,
|
709
|
+
# (Op | Symbol) operator,
|
710
|
+
# untyped right
|
711
|
+
# ) -> Binary
|
664
712
|
def on_binary(left, operator, right)
|
665
713
|
if operator.is_a?(Symbol)
|
666
714
|
# Here, we're going to search backward for the token that's between the
|
@@ -737,7 +785,8 @@ module SyntaxTree
|
|
737
785
|
else_keyword: else_clause && find_token(Kw, "else"),
|
738
786
|
else_clause: else_clause,
|
739
787
|
ensure_clause: ensure_clause,
|
740
|
-
location:
|
788
|
+
location:
|
789
|
+
Location.fixed(line: lineno, char: char_pos, column: current_column)
|
741
790
|
)
|
742
791
|
end
|
743
792
|
|
@@ -764,7 +813,10 @@ module SyntaxTree
|
|
764
813
|
start_line: lbrace.location.start_line,
|
765
814
|
start_char: lbrace.location.start_char,
|
766
815
|
start_column: lbrace.location.start_column,
|
767
|
-
end_line: [
|
816
|
+
end_line: [
|
817
|
+
rbrace.location.end_line,
|
818
|
+
statements.location.end_line
|
819
|
+
].max,
|
768
820
|
end_char: rbrace.location.end_char,
|
769
821
|
end_column: rbrace.location.end_column
|
770
822
|
)
|
@@ -816,7 +868,7 @@ module SyntaxTree
|
|
816
868
|
# :call-seq:
|
817
869
|
# on_case: (untyped value, untyped consequent) -> Case | RAssign
|
818
870
|
def on_case(value, consequent)
|
819
|
-
if keyword = find_token(Kw, "case", consume: false)
|
871
|
+
if (keyword = find_token(Kw, "case", consume: false))
|
820
872
|
tokens.delete(keyword)
|
821
873
|
|
822
874
|
Case.new(
|
@@ -870,7 +922,13 @@ module SyntaxTree
|
|
870
922
|
node =
|
871
923
|
Comma.new(
|
872
924
|
value: value,
|
873
|
-
location:
|
925
|
+
location:
|
926
|
+
Location.token(
|
927
|
+
line: lineno,
|
928
|
+
char: char_pos,
|
929
|
+
column: current_column,
|
930
|
+
size: value.size
|
931
|
+
)
|
874
932
|
)
|
875
933
|
|
876
934
|
tokens << node
|
@@ -915,7 +973,12 @@ module SyntaxTree
|
|
915
973
|
value: value.chomp,
|
916
974
|
inline: value.strip != lines[line - 1].strip,
|
917
975
|
location:
|
918
|
-
Location.token(
|
976
|
+
Location.token(
|
977
|
+
line: line,
|
978
|
+
char: char_pos,
|
979
|
+
column: current_column,
|
980
|
+
size: value.size - 1
|
981
|
+
)
|
919
982
|
)
|
920
983
|
|
921
984
|
@comments << comment
|
@@ -927,7 +990,13 @@ module SyntaxTree
|
|
927
990
|
def on_const(value)
|
928
991
|
Const.new(
|
929
992
|
value: value,
|
930
|
-
location:
|
993
|
+
location:
|
994
|
+
Location.token(
|
995
|
+
line: lineno,
|
996
|
+
char: char_pos,
|
997
|
+
column: current_column,
|
998
|
+
size: value.size
|
999
|
+
)
|
931
1000
|
)
|
932
1001
|
end
|
933
1002
|
|
@@ -962,7 +1031,13 @@ module SyntaxTree
|
|
962
1031
|
def on_cvar(value)
|
963
1032
|
CVar.new(
|
964
1033
|
value: value,
|
965
|
-
location:
|
1034
|
+
location:
|
1035
|
+
Location.token(
|
1036
|
+
line: lineno,
|
1037
|
+
char: char_pos,
|
1038
|
+
column: current_column,
|
1039
|
+
size: value.size
|
1040
|
+
)
|
966
1041
|
)
|
967
1042
|
end
|
968
1043
|
|
@@ -1047,7 +1122,10 @@ module SyntaxTree
|
|
1047
1122
|
ending = find_token(RParen)
|
1048
1123
|
end
|
1049
1124
|
|
1050
|
-
Defined.new(
|
1125
|
+
Defined.new(
|
1126
|
+
value: value,
|
1127
|
+
location: beginning.location.to(ending.location)
|
1128
|
+
)
|
1051
1129
|
end
|
1052
1130
|
|
1053
1131
|
# :call-seq:
|
@@ -1268,7 +1346,8 @@ module SyntaxTree
|
|
1268
1346
|
@embdoc =
|
1269
1347
|
EmbDoc.new(
|
1270
1348
|
value: value,
|
1271
|
-
location:
|
1349
|
+
location:
|
1350
|
+
Location.fixed(line: lineno, column: current_column, char: char_pos)
|
1272
1351
|
)
|
1273
1352
|
end
|
1274
1353
|
|
@@ -1302,7 +1381,13 @@ module SyntaxTree
|
|
1302
1381
|
node =
|
1303
1382
|
EmbExprBeg.new(
|
1304
1383
|
value: value,
|
1305
|
-
location:
|
1384
|
+
location:
|
1385
|
+
Location.token(
|
1386
|
+
line: lineno,
|
1387
|
+
char: char_pos,
|
1388
|
+
column: current_column,
|
1389
|
+
size: value.size
|
1390
|
+
)
|
1306
1391
|
)
|
1307
1392
|
|
1308
1393
|
tokens << node
|
@@ -1315,7 +1400,13 @@ module SyntaxTree
|
|
1315
1400
|
node =
|
1316
1401
|
EmbExprEnd.new(
|
1317
1402
|
value: value,
|
1318
|
-
location:
|
1403
|
+
location:
|
1404
|
+
Location.token(
|
1405
|
+
line: lineno,
|
1406
|
+
char: char_pos,
|
1407
|
+
column: current_column,
|
1408
|
+
size: value.size
|
1409
|
+
)
|
1319
1410
|
)
|
1320
1411
|
|
1321
1412
|
tokens << node
|
@@ -1328,7 +1419,13 @@ module SyntaxTree
|
|
1328
1419
|
node =
|
1329
1420
|
EmbVar.new(
|
1330
1421
|
value: value,
|
1331
|
-
location:
|
1422
|
+
location:
|
1423
|
+
Location.token(
|
1424
|
+
line: lineno,
|
1425
|
+
char: char_pos,
|
1426
|
+
column: current_column,
|
1427
|
+
size: value.size
|
1428
|
+
)
|
1332
1429
|
)
|
1333
1430
|
|
1334
1431
|
tokens << node
|
@@ -1395,7 +1492,13 @@ module SyntaxTree
|
|
1395
1492
|
def on_float(value)
|
1396
1493
|
FloatLiteral.new(
|
1397
1494
|
value: value,
|
1398
|
-
location:
|
1495
|
+
location:
|
1496
|
+
Location.token(
|
1497
|
+
line: lineno,
|
1498
|
+
char: char_pos,
|
1499
|
+
column: current_column,
|
1500
|
+
size: value.size
|
1501
|
+
)
|
1399
1502
|
)
|
1400
1503
|
end
|
1401
1504
|
|
@@ -1413,8 +1516,7 @@ module SyntaxTree
|
|
1413
1516
|
# the location of the node.
|
1414
1517
|
opening =
|
1415
1518
|
find_token(LBracket, consume: false) ||
|
1416
|
-
|
1417
|
-
left
|
1519
|
+
find_token(LParen, consume: false) || left
|
1418
1520
|
|
1419
1521
|
# The closing is based on the opening, which is either the matched
|
1420
1522
|
# punctuation or the right splat.
|
@@ -1453,8 +1555,9 @@ module SyntaxTree
|
|
1453
1555
|
# Consume the do keyword if it exists so that it doesn't get confused for
|
1454
1556
|
# some other block
|
1455
1557
|
keyword = find_token(Kw, "do", consume: false)
|
1456
|
-
if keyword &&
|
1457
|
-
|
1558
|
+
if keyword &&
|
1559
|
+
keyword.location.start_char > collection.location.end_char &&
|
1560
|
+
keyword.location.end_char < ending.location.start_char
|
1458
1561
|
tokens.delete(keyword)
|
1459
1562
|
end
|
1460
1563
|
|
@@ -1483,7 +1586,13 @@ module SyntaxTree
|
|
1483
1586
|
def on_gvar(value)
|
1484
1587
|
GVar.new(
|
1485
1588
|
value: value,
|
1486
|
-
location:
|
1589
|
+
location:
|
1590
|
+
Location.token(
|
1591
|
+
line: lineno,
|
1592
|
+
char: char_pos,
|
1593
|
+
column: current_column,
|
1594
|
+
size: value.size
|
1595
|
+
)
|
1487
1596
|
)
|
1488
1597
|
end
|
1489
1598
|
|
@@ -1504,7 +1613,12 @@ module SyntaxTree
|
|
1504
1613
|
# on_heredoc_beg: (String value) -> HeredocBeg
|
1505
1614
|
def on_heredoc_beg(value)
|
1506
1615
|
location =
|
1507
|
-
Location.token(
|
1616
|
+
Location.token(
|
1617
|
+
line: lineno,
|
1618
|
+
char: char_pos,
|
1619
|
+
column: current_column,
|
1620
|
+
size: value.size + 1
|
1621
|
+
)
|
1508
1622
|
|
1509
1623
|
# Here we're going to artificially create an extra node type so that if
|
1510
1624
|
# there are comments after the declaration of a heredoc, they get printed.
|
@@ -1545,7 +1659,7 @@ module SyntaxTree
|
|
1545
1659
|
start_column: heredoc.location.start_column,
|
1546
1660
|
end_line: lineno,
|
1547
1661
|
end_char: char_pos,
|
1548
|
-
end_column: current_column
|
1662
|
+
end_column: current_column
|
1549
1663
|
)
|
1550
1664
|
)
|
1551
1665
|
end
|
@@ -1563,24 +1677,32 @@ module SyntaxTree
|
|
1563
1677
|
keyword_rest = VarField.new(value: nil, location: token.location)
|
1564
1678
|
end
|
1565
1679
|
|
1680
|
+
parts = [constant, *keywords&.flatten(1), keyword_rest].compact
|
1681
|
+
|
1682
|
+
# If there's no constant, there may be braces, so we're going to look for
|
1683
|
+
# those to get our bounds.
|
1684
|
+
unless constant
|
1685
|
+
lbrace = find_token(LBrace, consume: false)
|
1686
|
+
rbrace = find_token(RBrace, consume: false)
|
1687
|
+
|
1688
|
+
if lbrace && rbrace
|
1689
|
+
parts = [lbrace, *parts, rbrace]
|
1690
|
+
tokens.delete(lbrace)
|
1691
|
+
tokens.delete(rbrace)
|
1692
|
+
end
|
1693
|
+
end
|
1694
|
+
|
1566
1695
|
# Delete the optional then keyword
|
1567
|
-
if token = find_token(Kw, "then", consume: false)
|
1696
|
+
if (token = find_token(Kw, "then", consume: false))
|
1697
|
+
parts << token
|
1568
1698
|
tokens.delete(token)
|
1569
1699
|
end
|
1570
1700
|
|
1571
|
-
parts = [constant, *keywords&.flatten(1), keyword_rest].compact
|
1572
|
-
location =
|
1573
|
-
if parts.any?
|
1574
|
-
parts[0].location.to(parts[-1].location)
|
1575
|
-
else
|
1576
|
-
find_token(LBrace).location.to(find_token(RBrace).location)
|
1577
|
-
end
|
1578
|
-
|
1579
1701
|
HshPtn.new(
|
1580
1702
|
constant: constant,
|
1581
1703
|
keywords: keywords || [],
|
1582
1704
|
keyword_rest: keyword_rest,
|
1583
|
-
location: location
|
1705
|
+
location: parts[0].location.to(parts[-1].location)
|
1584
1706
|
)
|
1585
1707
|
end
|
1586
1708
|
|
@@ -1589,7 +1711,13 @@ module SyntaxTree
|
|
1589
1711
|
def on_ident(value)
|
1590
1712
|
Ident.new(
|
1591
1713
|
value: value,
|
1592
|
-
location:
|
1714
|
+
location:
|
1715
|
+
Location.token(
|
1716
|
+
line: lineno,
|
1717
|
+
char: char_pos,
|
1718
|
+
column: current_column,
|
1719
|
+
size: value.size
|
1720
|
+
)
|
1593
1721
|
)
|
1594
1722
|
end
|
1595
1723
|
|
@@ -1654,7 +1782,13 @@ module SyntaxTree
|
|
1654
1782
|
def on_imaginary(value)
|
1655
1783
|
Imaginary.new(
|
1656
1784
|
value: value,
|
1657
|
-
location:
|
1785
|
+
location:
|
1786
|
+
Location.token(
|
1787
|
+
line: lineno,
|
1788
|
+
char: char_pos,
|
1789
|
+
column: current_column,
|
1790
|
+
size: value.size
|
1791
|
+
)
|
1658
1792
|
)
|
1659
1793
|
end
|
1660
1794
|
|
@@ -1673,7 +1807,7 @@ module SyntaxTree
|
|
1673
1807
|
ending = consequent || find_token(Kw, "end")
|
1674
1808
|
|
1675
1809
|
statements_start = pattern
|
1676
|
-
if token = find_token(Kw, "then", consume: false)
|
1810
|
+
if (token = find_token(Kw, "then", consume: false))
|
1677
1811
|
tokens.delete(token)
|
1678
1812
|
statements_start = token
|
1679
1813
|
end
|
@@ -1681,7 +1815,8 @@ module SyntaxTree
|
|
1681
1815
|
start_char = find_next_statement_start(statements_start.location.end_char)
|
1682
1816
|
statements.bind(
|
1683
1817
|
start_char,
|
1684
|
-
start_char -
|
1818
|
+
start_char -
|
1819
|
+
line_counts[statements_start.location.start_line - 1].start,
|
1685
1820
|
ending.location.start_char,
|
1686
1821
|
ending.location.start_column
|
1687
1822
|
)
|
@@ -1699,7 +1834,13 @@ module SyntaxTree
|
|
1699
1834
|
def on_int(value)
|
1700
1835
|
Int.new(
|
1701
1836
|
value: value,
|
1702
|
-
location:
|
1837
|
+
location:
|
1838
|
+
Location.token(
|
1839
|
+
line: lineno,
|
1840
|
+
char: char_pos,
|
1841
|
+
column: current_column,
|
1842
|
+
size: value.size
|
1843
|
+
)
|
1703
1844
|
)
|
1704
1845
|
end
|
1705
1846
|
|
@@ -1708,7 +1849,13 @@ module SyntaxTree
|
|
1708
1849
|
def on_ivar(value)
|
1709
1850
|
IVar.new(
|
1710
1851
|
value: value,
|
1711
|
-
location:
|
1852
|
+
location:
|
1853
|
+
Location.token(
|
1854
|
+
line: lineno,
|
1855
|
+
char: char_pos,
|
1856
|
+
column: current_column,
|
1857
|
+
size: value.size
|
1858
|
+
)
|
1712
1859
|
)
|
1713
1860
|
end
|
1714
1861
|
|
@@ -1718,7 +1865,13 @@ module SyntaxTree
|
|
1718
1865
|
node =
|
1719
1866
|
Kw.new(
|
1720
1867
|
value: value,
|
1721
|
-
location:
|
1868
|
+
location:
|
1869
|
+
Location.token(
|
1870
|
+
line: lineno,
|
1871
|
+
char: char_pos,
|
1872
|
+
column: current_column,
|
1873
|
+
size: value.size
|
1874
|
+
)
|
1722
1875
|
)
|
1723
1876
|
|
1724
1877
|
tokens << node
|
@@ -1739,7 +1892,13 @@ module SyntaxTree
|
|
1739
1892
|
def on_label(value)
|
1740
1893
|
Label.new(
|
1741
1894
|
value: value,
|
1742
|
-
location:
|
1895
|
+
location:
|
1896
|
+
Location.token(
|
1897
|
+
line: lineno,
|
1898
|
+
char: char_pos,
|
1899
|
+
column: current_column,
|
1900
|
+
size: value.size
|
1901
|
+
)
|
1743
1902
|
)
|
1744
1903
|
end
|
1745
1904
|
|
@@ -1749,7 +1908,13 @@ module SyntaxTree
|
|
1749
1908
|
node =
|
1750
1909
|
LabelEnd.new(
|
1751
1910
|
value: value,
|
1752
|
-
location:
|
1911
|
+
location:
|
1912
|
+
Location.token(
|
1913
|
+
line: lineno,
|
1914
|
+
char: char_pos,
|
1915
|
+
column: current_column,
|
1916
|
+
size: value.size
|
1917
|
+
)
|
1753
1918
|
)
|
1754
1919
|
|
1755
1920
|
tokens << node
|
@@ -1763,11 +1928,13 @@ module SyntaxTree
|
|
1763
1928
|
# ) -> Lambda
|
1764
1929
|
def on_lambda(params, statements)
|
1765
1930
|
beginning = find_token(TLambda)
|
1766
|
-
|
1767
|
-
|
1931
|
+
braces =
|
1932
|
+
tokens.any? do |token|
|
1768
1933
|
token.is_a?(TLamBeg) &&
|
1769
1934
|
token.location.start_char > beginning.location.start_char
|
1770
|
-
|
1935
|
+
end
|
1936
|
+
|
1937
|
+
if braces
|
1771
1938
|
opening = find_token(TLamBeg)
|
1772
1939
|
closing = find_token(RBrace)
|
1773
1940
|
else
|
@@ -1795,7 +1962,13 @@ module SyntaxTree
|
|
1795
1962
|
node =
|
1796
1963
|
LBrace.new(
|
1797
1964
|
value: value,
|
1798
|
-
location:
|
1965
|
+
location:
|
1966
|
+
Location.token(
|
1967
|
+
line: lineno,
|
1968
|
+
char: char_pos,
|
1969
|
+
column: current_column,
|
1970
|
+
size: value.size
|
1971
|
+
)
|
1799
1972
|
)
|
1800
1973
|
|
1801
1974
|
tokens << node
|
@@ -1808,7 +1981,13 @@ module SyntaxTree
|
|
1808
1981
|
node =
|
1809
1982
|
LBracket.new(
|
1810
1983
|
value: value,
|
1811
|
-
location:
|
1984
|
+
location:
|
1985
|
+
Location.token(
|
1986
|
+
line: lineno,
|
1987
|
+
char: char_pos,
|
1988
|
+
column: current_column,
|
1989
|
+
size: value.size
|
1990
|
+
)
|
1812
1991
|
)
|
1813
1992
|
|
1814
1993
|
tokens << node
|
@@ -1821,7 +2000,13 @@ module SyntaxTree
|
|
1821
2000
|
node =
|
1822
2001
|
LParen.new(
|
1823
2002
|
value: value,
|
1824
|
-
location:
|
2003
|
+
location:
|
2004
|
+
Location.token(
|
2005
|
+
line: lineno,
|
2006
|
+
char: char_pos,
|
2007
|
+
column: current_column,
|
2008
|
+
size: value.size
|
2009
|
+
)
|
1825
2010
|
)
|
1826
2011
|
|
1827
2012
|
tokens << node
|
@@ -1920,7 +2105,11 @@ module SyntaxTree
|
|
1920
2105
|
# :call-seq:
|
1921
2106
|
# on_mlhs_new: () -> MLHS
|
1922
2107
|
def on_mlhs_new
|
1923
|
-
MLHS.new(
|
2108
|
+
MLHS.new(
|
2109
|
+
parts: [],
|
2110
|
+
location:
|
2111
|
+
Location.fixed(line: lineno, char: char_pos, column: current_column)
|
2112
|
+
)
|
1924
2113
|
end
|
1925
2114
|
|
1926
2115
|
# :call-seq:
|
@@ -1965,18 +2154,18 @@ module SyntaxTree
|
|
1965
2154
|
# :call-seq:
|
1966
2155
|
# on_mrhs_new: () -> MRHS
|
1967
2156
|
def on_mrhs_new
|
1968
|
-
MRHS.new(
|
2157
|
+
MRHS.new(
|
2158
|
+
parts: [],
|
2159
|
+
location:
|
2160
|
+
Location.fixed(line: lineno, char: char_pos, column: current_column)
|
2161
|
+
)
|
1969
2162
|
end
|
1970
2163
|
|
1971
2164
|
# :call-seq:
|
1972
2165
|
# on_mrhs_add: (MRHS mrhs, untyped part) -> MRHS
|
1973
2166
|
def on_mrhs_add(mrhs, part)
|
1974
2167
|
location =
|
1975
|
-
|
1976
|
-
mrhs.location
|
1977
|
-
else
|
1978
|
-
mrhs.location.to(part.location)
|
1979
|
-
end
|
2168
|
+
(mrhs.parts.empty? ? mrhs.location : mrhs.location.to(part.location))
|
1980
2169
|
|
1981
2170
|
MRHS.new(parts: mrhs.parts << part, location: location)
|
1982
2171
|
end
|
@@ -2034,7 +2223,13 @@ module SyntaxTree
|
|
2034
2223
|
node =
|
2035
2224
|
Op.new(
|
2036
2225
|
value: value,
|
2037
|
-
location:
|
2226
|
+
location:
|
2227
|
+
Location.token(
|
2228
|
+
line: lineno,
|
2229
|
+
char: char_pos,
|
2230
|
+
column: current_column,
|
2231
|
+
size: value.size
|
2232
|
+
)
|
2038
2233
|
)
|
2039
2234
|
|
2040
2235
|
tokens << node
|
@@ -2043,7 +2238,13 @@ module SyntaxTree
|
|
2043
2238
|
|
2044
2239
|
# :call-seq:
|
2045
2240
|
# on_opassign: (
|
2046
|
-
# (
|
2241
|
+
# (
|
2242
|
+
# ARefField |
|
2243
|
+
# ConstPathField |
|
2244
|
+
# Field |
|
2245
|
+
# TopConstField |
|
2246
|
+
# VarField
|
2247
|
+
# ) target,
|
2047
2248
|
# Op operator,
|
2048
2249
|
# untyped value
|
2049
2250
|
# ) -> OpAssign
|
@@ -2079,12 +2280,16 @@ module SyntaxTree
|
|
2079
2280
|
keyword_rest,
|
2080
2281
|
block
|
2081
2282
|
)
|
2283
|
+
# This is to make it so that required keyword arguments
|
2284
|
+
# have a `nil` for the value instead of a `false`.
|
2285
|
+
keywords&.map! { |(key, value)| [key, value || nil] }
|
2286
|
+
|
2082
2287
|
parts = [
|
2083
2288
|
*requireds,
|
2084
2289
|
*optionals&.flatten(1),
|
2085
2290
|
rest,
|
2086
2291
|
*posts,
|
2087
|
-
*keywords&.
|
2292
|
+
*keywords&.flatten(1),
|
2088
2293
|
(keyword_rest if keyword_rest != :nil),
|
2089
2294
|
(block if block != :&)
|
2090
2295
|
].compact
|
@@ -2114,14 +2319,15 @@ module SyntaxTree
|
|
2114
2319
|
lparen = find_token(LParen)
|
2115
2320
|
rparen = find_token(RParen)
|
2116
2321
|
|
2117
|
-
if contents
|
2322
|
+
if contents.is_a?(Params)
|
2118
2323
|
location = contents.location
|
2119
2324
|
start_char = find_next_statement_start(lparen.location.end_char)
|
2120
2325
|
location =
|
2121
2326
|
Location.new(
|
2122
2327
|
start_line: location.start_line,
|
2123
2328
|
start_char: start_char,
|
2124
|
-
start_column:
|
2329
|
+
start_column:
|
2330
|
+
start_char - line_counts[lparen.location.start_line - 1].start,
|
2125
2331
|
end_line: location.end_line,
|
2126
2332
|
end_char: rparen.location.start_char,
|
2127
2333
|
end_column: rparen.location.start_column
|
@@ -2162,7 +2368,13 @@ module SyntaxTree
|
|
2162
2368
|
def on_period(value)
|
2163
2369
|
Period.new(
|
2164
2370
|
value: value,
|
2165
|
-
location:
|
2371
|
+
location:
|
2372
|
+
Location.token(
|
2373
|
+
line: lineno,
|
2374
|
+
char: char_pos,
|
2375
|
+
column: current_column,
|
2376
|
+
size: value.size
|
2377
|
+
)
|
2166
2378
|
)
|
2167
2379
|
end
|
2168
2380
|
|
@@ -2294,7 +2506,13 @@ module SyntaxTree
|
|
2294
2506
|
node =
|
2295
2507
|
QSymbolsBeg.new(
|
2296
2508
|
value: value,
|
2297
|
-
location:
|
2509
|
+
location:
|
2510
|
+
Location.token(
|
2511
|
+
line: lineno,
|
2512
|
+
char: char_pos,
|
2513
|
+
column: current_column,
|
2514
|
+
size: value.size
|
2515
|
+
)
|
2298
2516
|
)
|
2299
2517
|
|
2300
2518
|
tokens << node
|
@@ -2329,7 +2547,13 @@ module SyntaxTree
|
|
2329
2547
|
node =
|
2330
2548
|
QWordsBeg.new(
|
2331
2549
|
value: value,
|
2332
|
-
location:
|
2550
|
+
location:
|
2551
|
+
Location.token(
|
2552
|
+
line: lineno,
|
2553
|
+
char: char_pos,
|
2554
|
+
column: current_column,
|
2555
|
+
size: value.size
|
2556
|
+
)
|
2333
2557
|
)
|
2334
2558
|
|
2335
2559
|
tokens << node
|
@@ -2341,7 +2565,11 @@ module SyntaxTree
|
|
2341
2565
|
def on_qwords_new
|
2342
2566
|
beginning = find_token(QWordsBeg)
|
2343
2567
|
|
2344
|
-
QWords.new(
|
2568
|
+
QWords.new(
|
2569
|
+
beginning: beginning,
|
2570
|
+
elements: [],
|
2571
|
+
location: beginning.location
|
2572
|
+
)
|
2345
2573
|
end
|
2346
2574
|
|
2347
2575
|
# :call-seq:
|
@@ -2349,7 +2577,13 @@ module SyntaxTree
|
|
2349
2577
|
def on_rational(value)
|
2350
2578
|
RationalLiteral.new(
|
2351
2579
|
value: value,
|
2352
|
-
location:
|
2580
|
+
location:
|
2581
|
+
Location.token(
|
2582
|
+
line: lineno,
|
2583
|
+
char: char_pos,
|
2584
|
+
column: current_column,
|
2585
|
+
size: value.size
|
2586
|
+
)
|
2353
2587
|
)
|
2354
2588
|
end
|
2355
2589
|
|
@@ -2359,7 +2593,13 @@ module SyntaxTree
|
|
2359
2593
|
node =
|
2360
2594
|
RBrace.new(
|
2361
2595
|
value: value,
|
2362
|
-
location:
|
2596
|
+
location:
|
2597
|
+
Location.token(
|
2598
|
+
line: lineno,
|
2599
|
+
char: char_pos,
|
2600
|
+
column: current_column,
|
2601
|
+
size: value.size
|
2602
|
+
)
|
2363
2603
|
)
|
2364
2604
|
|
2365
2605
|
tokens << node
|
@@ -2372,7 +2612,13 @@ module SyntaxTree
|
|
2372
2612
|
node =
|
2373
2613
|
RBracket.new(
|
2374
2614
|
value: value,
|
2375
|
-
location:
|
2615
|
+
location:
|
2616
|
+
Location.token(
|
2617
|
+
line: lineno,
|
2618
|
+
char: char_pos,
|
2619
|
+
column: current_column,
|
2620
|
+
size: value.size
|
2621
|
+
)
|
2376
2622
|
)
|
2377
2623
|
|
2378
2624
|
tokens << node
|
@@ -2406,7 +2652,13 @@ module SyntaxTree
|
|
2406
2652
|
node =
|
2407
2653
|
RegexpBeg.new(
|
2408
2654
|
value: value,
|
2409
|
-
location:
|
2655
|
+
location:
|
2656
|
+
Location.token(
|
2657
|
+
line: lineno,
|
2658
|
+
char: char_pos,
|
2659
|
+
column: current_column,
|
2660
|
+
size: value.size
|
2661
|
+
)
|
2410
2662
|
)
|
2411
2663
|
|
2412
2664
|
tokens << node
|
@@ -2418,7 +2670,13 @@ module SyntaxTree
|
|
2418
2670
|
def on_regexp_end(value)
|
2419
2671
|
RegexpEnd.new(
|
2420
2672
|
value: value,
|
2421
|
-
location:
|
2673
|
+
location:
|
2674
|
+
Location.token(
|
2675
|
+
line: lineno,
|
2676
|
+
char: char_pos,
|
2677
|
+
column: current_column,
|
2678
|
+
size: value.size
|
2679
|
+
)
|
2422
2680
|
)
|
2423
2681
|
end
|
2424
2682
|
|
@@ -2559,7 +2817,13 @@ module SyntaxTree
|
|
2559
2817
|
node =
|
2560
2818
|
RParen.new(
|
2561
2819
|
value: value,
|
2562
|
-
location:
|
2820
|
+
location:
|
2821
|
+
Location.token(
|
2822
|
+
line: lineno,
|
2823
|
+
char: char_pos,
|
2824
|
+
column: current_column,
|
2825
|
+
size: value.size
|
2826
|
+
)
|
2563
2827
|
)
|
2564
2828
|
|
2565
2829
|
tokens << node
|
@@ -2607,7 +2871,11 @@ module SyntaxTree
|
|
2607
2871
|
statements.location.to(statement.location)
|
2608
2872
|
end
|
2609
2873
|
|
2610
|
-
Statements.new(
|
2874
|
+
Statements.new(
|
2875
|
+
self,
|
2876
|
+
body: statements.body << statement,
|
2877
|
+
location: location
|
2878
|
+
)
|
2611
2879
|
end
|
2612
2880
|
|
2613
2881
|
# :call-seq:
|
@@ -2616,7 +2884,8 @@ module SyntaxTree
|
|
2616
2884
|
Statements.new(
|
2617
2885
|
self,
|
2618
2886
|
body: [],
|
2619
|
-
location:
|
2887
|
+
location:
|
2888
|
+
Location.fixed(line: lineno, char: char_pos, column: current_column)
|
2620
2889
|
)
|
2621
2890
|
end
|
2622
2891
|
|
@@ -2650,7 +2919,8 @@ module SyntaxTree
|
|
2650
2919
|
def on_string_content
|
2651
2920
|
StringContent.new(
|
2652
2921
|
parts: [],
|
2653
|
-
location:
|
2922
|
+
location:
|
2923
|
+
Location.fixed(line: lineno, char: char_pos, column: current_column)
|
2654
2924
|
)
|
2655
2925
|
end
|
2656
2926
|
|
@@ -2699,7 +2969,7 @@ module SyntaxTree
|
|
2699
2969
|
def on_string_literal(string)
|
2700
2970
|
heredoc = @heredocs[-1]
|
2701
2971
|
|
2702
|
-
if heredoc
|
2972
|
+
if heredoc&.ending
|
2703
2973
|
heredoc = @heredocs.pop
|
2704
2974
|
|
2705
2975
|
Heredoc.new(
|
@@ -2752,7 +3022,13 @@ module SyntaxTree
|
|
2752
3022
|
node =
|
2753
3023
|
SymBeg.new(
|
2754
3024
|
value: value,
|
2755
|
-
location:
|
3025
|
+
location:
|
3026
|
+
Location.token(
|
3027
|
+
line: lineno,
|
3028
|
+
char: char_pos,
|
3029
|
+
column: current_column,
|
3030
|
+
size: value.size
|
3031
|
+
)
|
2756
3032
|
)
|
2757
3033
|
|
2758
3034
|
tokens << node
|
@@ -2806,7 +3082,13 @@ module SyntaxTree
|
|
2806
3082
|
node =
|
2807
3083
|
SymbolsBeg.new(
|
2808
3084
|
value: value,
|
2809
|
-
location:
|
3085
|
+
location:
|
3086
|
+
Location.token(
|
3087
|
+
line: lineno,
|
3088
|
+
char: char_pos,
|
3089
|
+
column: current_column,
|
3090
|
+
size: value.size
|
3091
|
+
)
|
2810
3092
|
)
|
2811
3093
|
|
2812
3094
|
tokens << node
|
@@ -2831,7 +3113,13 @@ module SyntaxTree
|
|
2831
3113
|
node =
|
2832
3114
|
TLambda.new(
|
2833
3115
|
value: value,
|
2834
|
-
location:
|
3116
|
+
location:
|
3117
|
+
Location.token(
|
3118
|
+
line: lineno,
|
3119
|
+
char: char_pos,
|
3120
|
+
column: current_column,
|
3121
|
+
size: value.size
|
3122
|
+
)
|
2835
3123
|
)
|
2836
3124
|
|
2837
3125
|
tokens << node
|
@@ -2844,7 +3132,13 @@ module SyntaxTree
|
|
2844
3132
|
node =
|
2845
3133
|
TLamBeg.new(
|
2846
3134
|
value: value,
|
2847
|
-
location:
|
3135
|
+
location:
|
3136
|
+
Location.token(
|
3137
|
+
line: lineno,
|
3138
|
+
char: char_pos,
|
3139
|
+
column: current_column,
|
3140
|
+
size: value.size
|
3141
|
+
)
|
2848
3142
|
)
|
2849
3143
|
|
2850
3144
|
tokens << node
|
@@ -2879,7 +3173,13 @@ module SyntaxTree
|
|
2879
3173
|
node =
|
2880
3174
|
TStringBeg.new(
|
2881
3175
|
value: value,
|
2882
|
-
location:
|
3176
|
+
location:
|
3177
|
+
Location.token(
|
3178
|
+
line: lineno,
|
3179
|
+
char: char_pos,
|
3180
|
+
column: current_column,
|
3181
|
+
size: value.size
|
3182
|
+
)
|
2883
3183
|
)
|
2884
3184
|
|
2885
3185
|
tokens << node
|
@@ -2891,7 +3191,13 @@ module SyntaxTree
|
|
2891
3191
|
def on_tstring_content(value)
|
2892
3192
|
TStringContent.new(
|
2893
3193
|
value: value,
|
2894
|
-
location:
|
3194
|
+
location:
|
3195
|
+
Location.token(
|
3196
|
+
line: lineno,
|
3197
|
+
char: char_pos,
|
3198
|
+
column: current_column,
|
3199
|
+
size: value.size
|
3200
|
+
)
|
2895
3201
|
)
|
2896
3202
|
end
|
2897
3203
|
|
@@ -2901,7 +3207,13 @@ module SyntaxTree
|
|
2901
3207
|
node =
|
2902
3208
|
TStringEnd.new(
|
2903
3209
|
value: value,
|
2904
|
-
location:
|
3210
|
+
location:
|
3211
|
+
Location.token(
|
3212
|
+
line: lineno,
|
3213
|
+
char: char_pos,
|
3214
|
+
column: current_column,
|
3215
|
+
size: value.size
|
3216
|
+
)
|
2905
3217
|
)
|
2906
3218
|
|
2907
3219
|
tokens << node
|
@@ -3010,7 +3322,7 @@ module SyntaxTree
|
|
3010
3322
|
# some other block
|
3011
3323
|
keyword = find_token(Kw, "do", consume: false)
|
3012
3324
|
if keyword && keyword.location.start_char > predicate.location.end_char &&
|
3013
|
-
|
3325
|
+
keyword.location.end_char < ending.location.start_char
|
3014
3326
|
tokens.delete(keyword)
|
3015
3327
|
end
|
3016
3328
|
|
@@ -3077,7 +3389,10 @@ module SyntaxTree
|
|
3077
3389
|
|
3078
3390
|
if pin && pin.location.start_char == value.location.start_char - 1
|
3079
3391
|
tokens.delete(pin)
|
3080
|
-
PinnedVarRef.new(
|
3392
|
+
PinnedVarRef.new(
|
3393
|
+
value: value,
|
3394
|
+
location: pin.location.to(value.location)
|
3395
|
+
)
|
3081
3396
|
else
|
3082
3397
|
VarRef.new(value: value, location: value.location)
|
3083
3398
|
end
|
@@ -3092,7 +3407,10 @@ module SyntaxTree
|
|
3092
3407
|
# :call-seq:
|
3093
3408
|
# on_void_stmt: () -> VoidStmt
|
3094
3409
|
def on_void_stmt
|
3095
|
-
VoidStmt.new(
|
3410
|
+
VoidStmt.new(
|
3411
|
+
location:
|
3412
|
+
Location.fixed(line: lineno, char: char_pos, column: current_column)
|
3413
|
+
)
|
3096
3414
|
end
|
3097
3415
|
|
3098
3416
|
# :call-seq:
|
@@ -3106,7 +3424,7 @@ module SyntaxTree
|
|
3106
3424
|
ending = consequent || find_token(Kw, "end")
|
3107
3425
|
|
3108
3426
|
statements_start = arguments
|
3109
|
-
if token = find_token(Kw, "then", consume: false)
|
3427
|
+
if (token = find_token(Kw, "then", consume: false))
|
3110
3428
|
tokens.delete(token)
|
3111
3429
|
statements_start = token
|
3112
3430
|
end
|
@@ -3115,7 +3433,8 @@ module SyntaxTree
|
|
3115
3433
|
|
3116
3434
|
statements.bind(
|
3117
3435
|
start_char,
|
3118
|
-
start_char -
|
3436
|
+
start_char -
|
3437
|
+
line_counts[statements_start.location.start_line - 1].start,
|
3119
3438
|
ending.location.start_char,
|
3120
3439
|
ending.location.start_column
|
3121
3440
|
)
|
@@ -3138,7 +3457,7 @@ module SyntaxTree
|
|
3138
3457
|
# some other block
|
3139
3458
|
keyword = find_token(Kw, "do", consume: false)
|
3140
3459
|
if keyword && keyword.location.start_char > predicate.location.end_char &&
|
3141
|
-
|
3460
|
+
keyword.location.end_char < ending.location.start_char
|
3142
3461
|
tokens.delete(keyword)
|
3143
3462
|
end
|
3144
3463
|
|
@@ -3184,7 +3503,11 @@ module SyntaxTree
|
|
3184
3503
|
# :call-seq:
|
3185
3504
|
# on_word_new: () -> Word
|
3186
3505
|
def on_word_new
|
3187
|
-
Word.new(
|
3506
|
+
Word.new(
|
3507
|
+
parts: [],
|
3508
|
+
location:
|
3509
|
+
Location.fixed(line: lineno, char: char_pos, column: current_column)
|
3510
|
+
)
|
3188
3511
|
end
|
3189
3512
|
|
3190
3513
|
# :call-seq:
|
@@ -3203,7 +3526,13 @@ module SyntaxTree
|
|
3203
3526
|
node =
|
3204
3527
|
WordsBeg.new(
|
3205
3528
|
value: value,
|
3206
|
-
location:
|
3529
|
+
location:
|
3530
|
+
Location.token(
|
3531
|
+
line: lineno,
|
3532
|
+
char: char_pos,
|
3533
|
+
column: current_column,
|
3534
|
+
size: value.size
|
3535
|
+
)
|
3207
3536
|
)
|
3208
3537
|
|
3209
3538
|
tokens << node
|
@@ -3215,7 +3544,11 @@ module SyntaxTree
|
|
3215
3544
|
def on_words_new
|
3216
3545
|
beginning = find_token(WordsBeg)
|
3217
3546
|
|
3218
|
-
Words.new(
|
3547
|
+
Words.new(
|
3548
|
+
beginning: beginning,
|
3549
|
+
elements: [],
|
3550
|
+
location: beginning.location
|
3551
|
+
)
|
3219
3552
|
end
|
3220
3553
|
|
3221
3554
|
# def on_words_sep(value)
|