syntax_tree 2.3.0 → 2.4.1
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 +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)
|