syntax_tree 2.3.0 → 2.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +20 -1
- data/.rubocop.yml +80 -0
- data/CHANGELOG.md +30 -1
- data/Gemfile +2 -0
- data/Gemfile.lock +22 -1
- data/README.md +126 -5
- data/Rakefile +27 -5
- data/config/rubocop.yml +64 -0
- data/lib/syntax_tree/cli.rb +63 -27
- data/lib/syntax_tree/formatter/single_quotes.rb +13 -0
- data/lib/syntax_tree/formatter.rb +6 -5
- 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 +499 -306
- data/lib/syntax_tree/parser.rb +447 -112
- data/lib/syntax_tree/plugin/single_quotes.rb +4 -0
- data/lib/syntax_tree/prettyprint.rb +28 -25
- 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 +10 -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
|
@@ -1557,30 +1671,44 @@ module SyntaxTree
|
|
1557
1671
|
# (nil | VarField) keyword_rest
|
1558
1672
|
# ) -> HshPtn
|
1559
1673
|
def on_hshptn(constant, keywords, keyword_rest)
|
1560
|
-
|
1561
|
-
|
1674
|
+
if keyword_rest
|
1675
|
+
# We're doing this to delete the token from the list so that it doesn't
|
1676
|
+
# confuse future patterns by thinking they have an extra ** on the end.
|
1677
|
+
find_token(Op, "**")
|
1678
|
+
elsif (token = find_token(Op, "**", consume: false))
|
1562
1679
|
tokens.delete(token)
|
1680
|
+
|
1681
|
+
# Create an artificial VarField if we find an extra ** on the end. This
|
1682
|
+
# means the formatting will be a little more consistent.
|
1563
1683
|
keyword_rest = VarField.new(value: nil, location: token.location)
|
1564
1684
|
end
|
1565
1685
|
|
1686
|
+
parts = [constant, *keywords&.flatten(1), keyword_rest].compact
|
1687
|
+
|
1688
|
+
# If there's no constant, there may be braces, so we're going to look for
|
1689
|
+
# those to get our bounds.
|
1690
|
+
unless constant
|
1691
|
+
lbrace = find_token(LBrace, consume: false)
|
1692
|
+
rbrace = find_token(RBrace, consume: false)
|
1693
|
+
|
1694
|
+
if lbrace && rbrace
|
1695
|
+
parts = [lbrace, *parts, rbrace]
|
1696
|
+
tokens.delete(lbrace)
|
1697
|
+
tokens.delete(rbrace)
|
1698
|
+
end
|
1699
|
+
end
|
1700
|
+
|
1566
1701
|
# Delete the optional then keyword
|
1567
|
-
if token = find_token(Kw, "then", consume: false)
|
1702
|
+
if (token = find_token(Kw, "then", consume: false))
|
1703
|
+
parts << token
|
1568
1704
|
tokens.delete(token)
|
1569
1705
|
end
|
1570
1706
|
|
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
1707
|
HshPtn.new(
|
1580
1708
|
constant: constant,
|
1581
1709
|
keywords: keywords || [],
|
1582
1710
|
keyword_rest: keyword_rest,
|
1583
|
-
location: location
|
1711
|
+
location: parts[0].location.to(parts[-1].location)
|
1584
1712
|
)
|
1585
1713
|
end
|
1586
1714
|
|
@@ -1589,7 +1717,13 @@ module SyntaxTree
|
|
1589
1717
|
def on_ident(value)
|
1590
1718
|
Ident.new(
|
1591
1719
|
value: value,
|
1592
|
-
location:
|
1720
|
+
location:
|
1721
|
+
Location.token(
|
1722
|
+
line: lineno,
|
1723
|
+
char: char_pos,
|
1724
|
+
column: current_column,
|
1725
|
+
size: value.size
|
1726
|
+
)
|
1593
1727
|
)
|
1594
1728
|
end
|
1595
1729
|
|
@@ -1654,7 +1788,13 @@ module SyntaxTree
|
|
1654
1788
|
def on_imaginary(value)
|
1655
1789
|
Imaginary.new(
|
1656
1790
|
value: value,
|
1657
|
-
location:
|
1791
|
+
location:
|
1792
|
+
Location.token(
|
1793
|
+
line: lineno,
|
1794
|
+
char: char_pos,
|
1795
|
+
column: current_column,
|
1796
|
+
size: value.size
|
1797
|
+
)
|
1658
1798
|
)
|
1659
1799
|
end
|
1660
1800
|
|
@@ -1673,7 +1813,7 @@ module SyntaxTree
|
|
1673
1813
|
ending = consequent || find_token(Kw, "end")
|
1674
1814
|
|
1675
1815
|
statements_start = pattern
|
1676
|
-
if token = find_token(Kw, "then", consume: false)
|
1816
|
+
if (token = find_token(Kw, "then", consume: false))
|
1677
1817
|
tokens.delete(token)
|
1678
1818
|
statements_start = token
|
1679
1819
|
end
|
@@ -1681,7 +1821,8 @@ module SyntaxTree
|
|
1681
1821
|
start_char = find_next_statement_start(statements_start.location.end_char)
|
1682
1822
|
statements.bind(
|
1683
1823
|
start_char,
|
1684
|
-
start_char -
|
1824
|
+
start_char -
|
1825
|
+
line_counts[statements_start.location.start_line - 1].start,
|
1685
1826
|
ending.location.start_char,
|
1686
1827
|
ending.location.start_column
|
1687
1828
|
)
|
@@ -1699,7 +1840,13 @@ module SyntaxTree
|
|
1699
1840
|
def on_int(value)
|
1700
1841
|
Int.new(
|
1701
1842
|
value: value,
|
1702
|
-
location:
|
1843
|
+
location:
|
1844
|
+
Location.token(
|
1845
|
+
line: lineno,
|
1846
|
+
char: char_pos,
|
1847
|
+
column: current_column,
|
1848
|
+
size: value.size
|
1849
|
+
)
|
1703
1850
|
)
|
1704
1851
|
end
|
1705
1852
|
|
@@ -1708,7 +1855,13 @@ module SyntaxTree
|
|
1708
1855
|
def on_ivar(value)
|
1709
1856
|
IVar.new(
|
1710
1857
|
value: value,
|
1711
|
-
location:
|
1858
|
+
location:
|
1859
|
+
Location.token(
|
1860
|
+
line: lineno,
|
1861
|
+
char: char_pos,
|
1862
|
+
column: current_column,
|
1863
|
+
size: value.size
|
1864
|
+
)
|
1712
1865
|
)
|
1713
1866
|
end
|
1714
1867
|
|
@@ -1718,7 +1871,13 @@ module SyntaxTree
|
|
1718
1871
|
node =
|
1719
1872
|
Kw.new(
|
1720
1873
|
value: value,
|
1721
|
-
location:
|
1874
|
+
location:
|
1875
|
+
Location.token(
|
1876
|
+
line: lineno,
|
1877
|
+
char: char_pos,
|
1878
|
+
column: current_column,
|
1879
|
+
size: value.size
|
1880
|
+
)
|
1722
1881
|
)
|
1723
1882
|
|
1724
1883
|
tokens << node
|
@@ -1739,7 +1898,13 @@ module SyntaxTree
|
|
1739
1898
|
def on_label(value)
|
1740
1899
|
Label.new(
|
1741
1900
|
value: value,
|
1742
|
-
location:
|
1901
|
+
location:
|
1902
|
+
Location.token(
|
1903
|
+
line: lineno,
|
1904
|
+
char: char_pos,
|
1905
|
+
column: current_column,
|
1906
|
+
size: value.size
|
1907
|
+
)
|
1743
1908
|
)
|
1744
1909
|
end
|
1745
1910
|
|
@@ -1749,7 +1914,13 @@ module SyntaxTree
|
|
1749
1914
|
node =
|
1750
1915
|
LabelEnd.new(
|
1751
1916
|
value: value,
|
1752
|
-
location:
|
1917
|
+
location:
|
1918
|
+
Location.token(
|
1919
|
+
line: lineno,
|
1920
|
+
char: char_pos,
|
1921
|
+
column: current_column,
|
1922
|
+
size: value.size
|
1923
|
+
)
|
1753
1924
|
)
|
1754
1925
|
|
1755
1926
|
tokens << node
|
@@ -1763,11 +1934,13 @@ module SyntaxTree
|
|
1763
1934
|
# ) -> Lambda
|
1764
1935
|
def on_lambda(params, statements)
|
1765
1936
|
beginning = find_token(TLambda)
|
1766
|
-
|
1767
|
-
|
1937
|
+
braces =
|
1938
|
+
tokens.any? do |token|
|
1768
1939
|
token.is_a?(TLamBeg) &&
|
1769
1940
|
token.location.start_char > beginning.location.start_char
|
1770
|
-
|
1941
|
+
end
|
1942
|
+
|
1943
|
+
if braces
|
1771
1944
|
opening = find_token(TLamBeg)
|
1772
1945
|
closing = find_token(RBrace)
|
1773
1946
|
else
|
@@ -1795,7 +1968,13 @@ module SyntaxTree
|
|
1795
1968
|
node =
|
1796
1969
|
LBrace.new(
|
1797
1970
|
value: value,
|
1798
|
-
location:
|
1971
|
+
location:
|
1972
|
+
Location.token(
|
1973
|
+
line: lineno,
|
1974
|
+
char: char_pos,
|
1975
|
+
column: current_column,
|
1976
|
+
size: value.size
|
1977
|
+
)
|
1799
1978
|
)
|
1800
1979
|
|
1801
1980
|
tokens << node
|
@@ -1808,7 +1987,13 @@ module SyntaxTree
|
|
1808
1987
|
node =
|
1809
1988
|
LBracket.new(
|
1810
1989
|
value: value,
|
1811
|
-
location:
|
1990
|
+
location:
|
1991
|
+
Location.token(
|
1992
|
+
line: lineno,
|
1993
|
+
char: char_pos,
|
1994
|
+
column: current_column,
|
1995
|
+
size: value.size
|
1996
|
+
)
|
1812
1997
|
)
|
1813
1998
|
|
1814
1999
|
tokens << node
|
@@ -1821,7 +2006,13 @@ module SyntaxTree
|
|
1821
2006
|
node =
|
1822
2007
|
LParen.new(
|
1823
2008
|
value: value,
|
1824
|
-
location:
|
2009
|
+
location:
|
2010
|
+
Location.token(
|
2011
|
+
line: lineno,
|
2012
|
+
char: char_pos,
|
2013
|
+
column: current_column,
|
2014
|
+
size: value.size
|
2015
|
+
)
|
1825
2016
|
)
|
1826
2017
|
|
1827
2018
|
tokens << node
|
@@ -1920,7 +2111,11 @@ module SyntaxTree
|
|
1920
2111
|
# :call-seq:
|
1921
2112
|
# on_mlhs_new: () -> MLHS
|
1922
2113
|
def on_mlhs_new
|
1923
|
-
MLHS.new(
|
2114
|
+
MLHS.new(
|
2115
|
+
parts: [],
|
2116
|
+
location:
|
2117
|
+
Location.fixed(line: lineno, char: char_pos, column: current_column)
|
2118
|
+
)
|
1924
2119
|
end
|
1925
2120
|
|
1926
2121
|
# :call-seq:
|
@@ -1965,18 +2160,18 @@ module SyntaxTree
|
|
1965
2160
|
# :call-seq:
|
1966
2161
|
# on_mrhs_new: () -> MRHS
|
1967
2162
|
def on_mrhs_new
|
1968
|
-
MRHS.new(
|
2163
|
+
MRHS.new(
|
2164
|
+
parts: [],
|
2165
|
+
location:
|
2166
|
+
Location.fixed(line: lineno, char: char_pos, column: current_column)
|
2167
|
+
)
|
1969
2168
|
end
|
1970
2169
|
|
1971
2170
|
# :call-seq:
|
1972
2171
|
# on_mrhs_add: (MRHS mrhs, untyped part) -> MRHS
|
1973
2172
|
def on_mrhs_add(mrhs, part)
|
1974
2173
|
location =
|
1975
|
-
|
1976
|
-
mrhs.location
|
1977
|
-
else
|
1978
|
-
mrhs.location.to(part.location)
|
1979
|
-
end
|
2174
|
+
(mrhs.parts.empty? ? mrhs.location : mrhs.location.to(part.location))
|
1980
2175
|
|
1981
2176
|
MRHS.new(parts: mrhs.parts << part, location: location)
|
1982
2177
|
end
|
@@ -2034,7 +2229,13 @@ module SyntaxTree
|
|
2034
2229
|
node =
|
2035
2230
|
Op.new(
|
2036
2231
|
value: value,
|
2037
|
-
location:
|
2232
|
+
location:
|
2233
|
+
Location.token(
|
2234
|
+
line: lineno,
|
2235
|
+
char: char_pos,
|
2236
|
+
column: current_column,
|
2237
|
+
size: value.size
|
2238
|
+
)
|
2038
2239
|
)
|
2039
2240
|
|
2040
2241
|
tokens << node
|
@@ -2043,7 +2244,13 @@ module SyntaxTree
|
|
2043
2244
|
|
2044
2245
|
# :call-seq:
|
2045
2246
|
# on_opassign: (
|
2046
|
-
# (
|
2247
|
+
# (
|
2248
|
+
# ARefField |
|
2249
|
+
# ConstPathField |
|
2250
|
+
# Field |
|
2251
|
+
# TopConstField |
|
2252
|
+
# VarField
|
2253
|
+
# ) target,
|
2047
2254
|
# Op operator,
|
2048
2255
|
# untyped value
|
2049
2256
|
# ) -> OpAssign
|
@@ -2118,14 +2325,15 @@ module SyntaxTree
|
|
2118
2325
|
lparen = find_token(LParen)
|
2119
2326
|
rparen = find_token(RParen)
|
2120
2327
|
|
2121
|
-
if contents
|
2328
|
+
if contents.is_a?(Params)
|
2122
2329
|
location = contents.location
|
2123
2330
|
start_char = find_next_statement_start(lparen.location.end_char)
|
2124
2331
|
location =
|
2125
2332
|
Location.new(
|
2126
2333
|
start_line: location.start_line,
|
2127
2334
|
start_char: start_char,
|
2128
|
-
start_column:
|
2335
|
+
start_column:
|
2336
|
+
start_char - line_counts[lparen.location.start_line - 1].start,
|
2129
2337
|
end_line: location.end_line,
|
2130
2338
|
end_char: rparen.location.start_char,
|
2131
2339
|
end_column: rparen.location.start_column
|
@@ -2166,7 +2374,13 @@ module SyntaxTree
|
|
2166
2374
|
def on_period(value)
|
2167
2375
|
Period.new(
|
2168
2376
|
value: value,
|
2169
|
-
location:
|
2377
|
+
location:
|
2378
|
+
Location.token(
|
2379
|
+
line: lineno,
|
2380
|
+
char: char_pos,
|
2381
|
+
column: current_column,
|
2382
|
+
size: value.size
|
2383
|
+
)
|
2170
2384
|
)
|
2171
2385
|
end
|
2172
2386
|
|
@@ -2298,7 +2512,13 @@ module SyntaxTree
|
|
2298
2512
|
node =
|
2299
2513
|
QSymbolsBeg.new(
|
2300
2514
|
value: value,
|
2301
|
-
location:
|
2515
|
+
location:
|
2516
|
+
Location.token(
|
2517
|
+
line: lineno,
|
2518
|
+
char: char_pos,
|
2519
|
+
column: current_column,
|
2520
|
+
size: value.size
|
2521
|
+
)
|
2302
2522
|
)
|
2303
2523
|
|
2304
2524
|
tokens << node
|
@@ -2333,7 +2553,13 @@ module SyntaxTree
|
|
2333
2553
|
node =
|
2334
2554
|
QWordsBeg.new(
|
2335
2555
|
value: value,
|
2336
|
-
location:
|
2556
|
+
location:
|
2557
|
+
Location.token(
|
2558
|
+
line: lineno,
|
2559
|
+
char: char_pos,
|
2560
|
+
column: current_column,
|
2561
|
+
size: value.size
|
2562
|
+
)
|
2337
2563
|
)
|
2338
2564
|
|
2339
2565
|
tokens << node
|
@@ -2345,7 +2571,11 @@ module SyntaxTree
|
|
2345
2571
|
def on_qwords_new
|
2346
2572
|
beginning = find_token(QWordsBeg)
|
2347
2573
|
|
2348
|
-
QWords.new(
|
2574
|
+
QWords.new(
|
2575
|
+
beginning: beginning,
|
2576
|
+
elements: [],
|
2577
|
+
location: beginning.location
|
2578
|
+
)
|
2349
2579
|
end
|
2350
2580
|
|
2351
2581
|
# :call-seq:
|
@@ -2353,7 +2583,13 @@ module SyntaxTree
|
|
2353
2583
|
def on_rational(value)
|
2354
2584
|
RationalLiteral.new(
|
2355
2585
|
value: value,
|
2356
|
-
location:
|
2586
|
+
location:
|
2587
|
+
Location.token(
|
2588
|
+
line: lineno,
|
2589
|
+
char: char_pos,
|
2590
|
+
column: current_column,
|
2591
|
+
size: value.size
|
2592
|
+
)
|
2357
2593
|
)
|
2358
2594
|
end
|
2359
2595
|
|
@@ -2363,7 +2599,13 @@ module SyntaxTree
|
|
2363
2599
|
node =
|
2364
2600
|
RBrace.new(
|
2365
2601
|
value: value,
|
2366
|
-
location:
|
2602
|
+
location:
|
2603
|
+
Location.token(
|
2604
|
+
line: lineno,
|
2605
|
+
char: char_pos,
|
2606
|
+
column: current_column,
|
2607
|
+
size: value.size
|
2608
|
+
)
|
2367
2609
|
)
|
2368
2610
|
|
2369
2611
|
tokens << node
|
@@ -2376,7 +2618,13 @@ module SyntaxTree
|
|
2376
2618
|
node =
|
2377
2619
|
RBracket.new(
|
2378
2620
|
value: value,
|
2379
|
-
location:
|
2621
|
+
location:
|
2622
|
+
Location.token(
|
2623
|
+
line: lineno,
|
2624
|
+
char: char_pos,
|
2625
|
+
column: current_column,
|
2626
|
+
size: value.size
|
2627
|
+
)
|
2380
2628
|
)
|
2381
2629
|
|
2382
2630
|
tokens << node
|
@@ -2410,7 +2658,13 @@ module SyntaxTree
|
|
2410
2658
|
node =
|
2411
2659
|
RegexpBeg.new(
|
2412
2660
|
value: value,
|
2413
|
-
location:
|
2661
|
+
location:
|
2662
|
+
Location.token(
|
2663
|
+
line: lineno,
|
2664
|
+
char: char_pos,
|
2665
|
+
column: current_column,
|
2666
|
+
size: value.size
|
2667
|
+
)
|
2414
2668
|
)
|
2415
2669
|
|
2416
2670
|
tokens << node
|
@@ -2422,7 +2676,13 @@ module SyntaxTree
|
|
2422
2676
|
def on_regexp_end(value)
|
2423
2677
|
RegexpEnd.new(
|
2424
2678
|
value: value,
|
2425
|
-
location:
|
2679
|
+
location:
|
2680
|
+
Location.token(
|
2681
|
+
line: lineno,
|
2682
|
+
char: char_pos,
|
2683
|
+
column: current_column,
|
2684
|
+
size: value.size
|
2685
|
+
)
|
2426
2686
|
)
|
2427
2687
|
end
|
2428
2688
|
|
@@ -2563,7 +2823,13 @@ module SyntaxTree
|
|
2563
2823
|
node =
|
2564
2824
|
RParen.new(
|
2565
2825
|
value: value,
|
2566
|
-
location:
|
2826
|
+
location:
|
2827
|
+
Location.token(
|
2828
|
+
line: lineno,
|
2829
|
+
char: char_pos,
|
2830
|
+
column: current_column,
|
2831
|
+
size: value.size
|
2832
|
+
)
|
2567
2833
|
)
|
2568
2834
|
|
2569
2835
|
tokens << node
|
@@ -2611,7 +2877,11 @@ module SyntaxTree
|
|
2611
2877
|
statements.location.to(statement.location)
|
2612
2878
|
end
|
2613
2879
|
|
2614
|
-
Statements.new(
|
2880
|
+
Statements.new(
|
2881
|
+
self,
|
2882
|
+
body: statements.body << statement,
|
2883
|
+
location: location
|
2884
|
+
)
|
2615
2885
|
end
|
2616
2886
|
|
2617
2887
|
# :call-seq:
|
@@ -2620,7 +2890,8 @@ module SyntaxTree
|
|
2620
2890
|
Statements.new(
|
2621
2891
|
self,
|
2622
2892
|
body: [],
|
2623
|
-
location:
|
2893
|
+
location:
|
2894
|
+
Location.fixed(line: lineno, char: char_pos, column: current_column)
|
2624
2895
|
)
|
2625
2896
|
end
|
2626
2897
|
|
@@ -2654,7 +2925,8 @@ module SyntaxTree
|
|
2654
2925
|
def on_string_content
|
2655
2926
|
StringContent.new(
|
2656
2927
|
parts: [],
|
2657
|
-
location:
|
2928
|
+
location:
|
2929
|
+
Location.fixed(line: lineno, char: char_pos, column: current_column)
|
2658
2930
|
)
|
2659
2931
|
end
|
2660
2932
|
|
@@ -2703,7 +2975,7 @@ module SyntaxTree
|
|
2703
2975
|
def on_string_literal(string)
|
2704
2976
|
heredoc = @heredocs[-1]
|
2705
2977
|
|
2706
|
-
if heredoc
|
2978
|
+
if heredoc&.ending
|
2707
2979
|
heredoc = @heredocs.pop
|
2708
2980
|
|
2709
2981
|
Heredoc.new(
|
@@ -2756,7 +3028,13 @@ module SyntaxTree
|
|
2756
3028
|
node =
|
2757
3029
|
SymBeg.new(
|
2758
3030
|
value: value,
|
2759
|
-
location:
|
3031
|
+
location:
|
3032
|
+
Location.token(
|
3033
|
+
line: lineno,
|
3034
|
+
char: char_pos,
|
3035
|
+
column: current_column,
|
3036
|
+
size: value.size
|
3037
|
+
)
|
2760
3038
|
)
|
2761
3039
|
|
2762
3040
|
tokens << node
|
@@ -2810,7 +3088,13 @@ module SyntaxTree
|
|
2810
3088
|
node =
|
2811
3089
|
SymbolsBeg.new(
|
2812
3090
|
value: value,
|
2813
|
-
location:
|
3091
|
+
location:
|
3092
|
+
Location.token(
|
3093
|
+
line: lineno,
|
3094
|
+
char: char_pos,
|
3095
|
+
column: current_column,
|
3096
|
+
size: value.size
|
3097
|
+
)
|
2814
3098
|
)
|
2815
3099
|
|
2816
3100
|
tokens << node
|
@@ -2835,7 +3119,13 @@ module SyntaxTree
|
|
2835
3119
|
node =
|
2836
3120
|
TLambda.new(
|
2837
3121
|
value: value,
|
2838
|
-
location:
|
3122
|
+
location:
|
3123
|
+
Location.token(
|
3124
|
+
line: lineno,
|
3125
|
+
char: char_pos,
|
3126
|
+
column: current_column,
|
3127
|
+
size: value.size
|
3128
|
+
)
|
2839
3129
|
)
|
2840
3130
|
|
2841
3131
|
tokens << node
|
@@ -2848,7 +3138,13 @@ module SyntaxTree
|
|
2848
3138
|
node =
|
2849
3139
|
TLamBeg.new(
|
2850
3140
|
value: value,
|
2851
|
-
location:
|
3141
|
+
location:
|
3142
|
+
Location.token(
|
3143
|
+
line: lineno,
|
3144
|
+
char: char_pos,
|
3145
|
+
column: current_column,
|
3146
|
+
size: value.size
|
3147
|
+
)
|
2852
3148
|
)
|
2853
3149
|
|
2854
3150
|
tokens << node
|
@@ -2883,7 +3179,13 @@ module SyntaxTree
|
|
2883
3179
|
node =
|
2884
3180
|
TStringBeg.new(
|
2885
3181
|
value: value,
|
2886
|
-
location:
|
3182
|
+
location:
|
3183
|
+
Location.token(
|
3184
|
+
line: lineno,
|
3185
|
+
char: char_pos,
|
3186
|
+
column: current_column,
|
3187
|
+
size: value.size
|
3188
|
+
)
|
2887
3189
|
)
|
2888
3190
|
|
2889
3191
|
tokens << node
|
@@ -2895,7 +3197,13 @@ module SyntaxTree
|
|
2895
3197
|
def on_tstring_content(value)
|
2896
3198
|
TStringContent.new(
|
2897
3199
|
value: value,
|
2898
|
-
location:
|
3200
|
+
location:
|
3201
|
+
Location.token(
|
3202
|
+
line: lineno,
|
3203
|
+
char: char_pos,
|
3204
|
+
column: current_column,
|
3205
|
+
size: value.size
|
3206
|
+
)
|
2899
3207
|
)
|
2900
3208
|
end
|
2901
3209
|
|
@@ -2905,7 +3213,13 @@ module SyntaxTree
|
|
2905
3213
|
node =
|
2906
3214
|
TStringEnd.new(
|
2907
3215
|
value: value,
|
2908
|
-
location:
|
3216
|
+
location:
|
3217
|
+
Location.token(
|
3218
|
+
line: lineno,
|
3219
|
+
char: char_pos,
|
3220
|
+
column: current_column,
|
3221
|
+
size: value.size
|
3222
|
+
)
|
2909
3223
|
)
|
2910
3224
|
|
2911
3225
|
tokens << node
|
@@ -3014,7 +3328,7 @@ module SyntaxTree
|
|
3014
3328
|
# some other block
|
3015
3329
|
keyword = find_token(Kw, "do", consume: false)
|
3016
3330
|
if keyword && keyword.location.start_char > predicate.location.end_char &&
|
3017
|
-
|
3331
|
+
keyword.location.end_char < ending.location.start_char
|
3018
3332
|
tokens.delete(keyword)
|
3019
3333
|
end
|
3020
3334
|
|
@@ -3081,7 +3395,10 @@ module SyntaxTree
|
|
3081
3395
|
|
3082
3396
|
if pin && pin.location.start_char == value.location.start_char - 1
|
3083
3397
|
tokens.delete(pin)
|
3084
|
-
PinnedVarRef.new(
|
3398
|
+
PinnedVarRef.new(
|
3399
|
+
value: value,
|
3400
|
+
location: pin.location.to(value.location)
|
3401
|
+
)
|
3085
3402
|
else
|
3086
3403
|
VarRef.new(value: value, location: value.location)
|
3087
3404
|
end
|
@@ -3096,7 +3413,10 @@ module SyntaxTree
|
|
3096
3413
|
# :call-seq:
|
3097
3414
|
# on_void_stmt: () -> VoidStmt
|
3098
3415
|
def on_void_stmt
|
3099
|
-
VoidStmt.new(
|
3416
|
+
VoidStmt.new(
|
3417
|
+
location:
|
3418
|
+
Location.fixed(line: lineno, char: char_pos, column: current_column)
|
3419
|
+
)
|
3100
3420
|
end
|
3101
3421
|
|
3102
3422
|
# :call-seq:
|
@@ -3110,7 +3430,7 @@ module SyntaxTree
|
|
3110
3430
|
ending = consequent || find_token(Kw, "end")
|
3111
3431
|
|
3112
3432
|
statements_start = arguments
|
3113
|
-
if token = find_token(Kw, "then", consume: false)
|
3433
|
+
if (token = find_token(Kw, "then", consume: false))
|
3114
3434
|
tokens.delete(token)
|
3115
3435
|
statements_start = token
|
3116
3436
|
end
|
@@ -3119,7 +3439,8 @@ module SyntaxTree
|
|
3119
3439
|
|
3120
3440
|
statements.bind(
|
3121
3441
|
start_char,
|
3122
|
-
start_char -
|
3442
|
+
start_char -
|
3443
|
+
line_counts[statements_start.location.start_line - 1].start,
|
3123
3444
|
ending.location.start_char,
|
3124
3445
|
ending.location.start_column
|
3125
3446
|
)
|
@@ -3142,7 +3463,7 @@ module SyntaxTree
|
|
3142
3463
|
# some other block
|
3143
3464
|
keyword = find_token(Kw, "do", consume: false)
|
3144
3465
|
if keyword && keyword.location.start_char > predicate.location.end_char &&
|
3145
|
-
|
3466
|
+
keyword.location.end_char < ending.location.start_char
|
3146
3467
|
tokens.delete(keyword)
|
3147
3468
|
end
|
3148
3469
|
|
@@ -3188,7 +3509,11 @@ module SyntaxTree
|
|
3188
3509
|
# :call-seq:
|
3189
3510
|
# on_word_new: () -> Word
|
3190
3511
|
def on_word_new
|
3191
|
-
Word.new(
|
3512
|
+
Word.new(
|
3513
|
+
parts: [],
|
3514
|
+
location:
|
3515
|
+
Location.fixed(line: lineno, char: char_pos, column: current_column)
|
3516
|
+
)
|
3192
3517
|
end
|
3193
3518
|
|
3194
3519
|
# :call-seq:
|
@@ -3207,7 +3532,13 @@ module SyntaxTree
|
|
3207
3532
|
node =
|
3208
3533
|
WordsBeg.new(
|
3209
3534
|
value: value,
|
3210
|
-
location:
|
3535
|
+
location:
|
3536
|
+
Location.token(
|
3537
|
+
line: lineno,
|
3538
|
+
char: char_pos,
|
3539
|
+
column: current_column,
|
3540
|
+
size: value.size
|
3541
|
+
)
|
3211
3542
|
)
|
3212
3543
|
|
3213
3544
|
tokens << node
|
@@ -3219,7 +3550,11 @@ module SyntaxTree
|
|
3219
3550
|
def on_words_new
|
3220
3551
|
beginning = find_token(WordsBeg)
|
3221
3552
|
|
3222
|
-
Words.new(
|
3553
|
+
Words.new(
|
3554
|
+
beginning: beginning,
|
3555
|
+
elements: [],
|
3556
|
+
location: beginning.location
|
3557
|
+
)
|
3223
3558
|
end
|
3224
3559
|
|
3225
3560
|
# def on_words_sep(value)
|