syntax_tree 2.3.1 → 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 +19 -1
- data/Gemfile +2 -0
- data/Gemfile.lock +22 -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 +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 +494 -305
- data/lib/syntax_tree/parser.rb +439 -110
- 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 +7 -3
data/lib/syntax_tree/node.rb
CHANGED
@@ -3,9 +3,21 @@
|
|
3
3
|
module SyntaxTree
|
4
4
|
# Represents the location of a node in the tree from the source code.
|
5
5
|
class Location
|
6
|
-
attr_reader :start_line,
|
6
|
+
attr_reader :start_line,
|
7
|
+
:start_char,
|
8
|
+
:start_column,
|
9
|
+
:end_line,
|
10
|
+
:end_char,
|
11
|
+
:end_column
|
7
12
|
|
8
|
-
def initialize(
|
13
|
+
def initialize(
|
14
|
+
start_line:,
|
15
|
+
start_char:,
|
16
|
+
start_column:,
|
17
|
+
end_line:,
|
18
|
+
end_char:,
|
19
|
+
end_column:
|
20
|
+
)
|
9
21
|
@start_line = start_line
|
10
22
|
@start_char = start_char
|
11
23
|
@start_column = start_column
|
@@ -39,7 +51,7 @@ module SyntaxTree
|
|
39
51
|
[start_line, start_char, start_column, end_line, end_char, end_column]
|
40
52
|
end
|
41
53
|
|
42
|
-
def deconstruct_keys(
|
54
|
+
def deconstruct_keys(_keys)
|
43
55
|
{
|
44
56
|
start_line: start_line,
|
45
57
|
start_char: start_char,
|
@@ -62,7 +74,14 @@ module SyntaxTree
|
|
62
74
|
end
|
63
75
|
|
64
76
|
def self.fixed(line:, char:, column:)
|
65
|
-
new(
|
77
|
+
new(
|
78
|
+
start_line: line,
|
79
|
+
start_char: char,
|
80
|
+
start_column: column,
|
81
|
+
end_line: line,
|
82
|
+
end_char: char,
|
83
|
+
end_column: column
|
84
|
+
)
|
66
85
|
end
|
67
86
|
end
|
68
87
|
|
@@ -102,6 +121,10 @@ module SyntaxTree
|
|
102
121
|
visitor = Visitor::JSONVisitor.new
|
103
122
|
visitor.visit(self).to_json(*opts)
|
104
123
|
end
|
124
|
+
|
125
|
+
def construct_keys
|
126
|
+
PP.format(+"") { |q| Visitor::MatchVisitor.new(q).visit(self) }
|
127
|
+
end
|
105
128
|
end
|
106
129
|
|
107
130
|
# BEGINBlock represents the use of the +BEGIN+ keyword, which hooks into the
|
@@ -140,7 +163,7 @@ module SyntaxTree
|
|
140
163
|
|
141
164
|
alias deconstruct child_nodes
|
142
165
|
|
143
|
-
def deconstruct_keys(
|
166
|
+
def deconstruct_keys(_keys)
|
144
167
|
{
|
145
168
|
lbrace: lbrace,
|
146
169
|
statements: statements,
|
@@ -192,7 +215,7 @@ module SyntaxTree
|
|
192
215
|
|
193
216
|
alias deconstruct child_nodes
|
194
217
|
|
195
|
-
def deconstruct_keys(
|
218
|
+
def deconstruct_keys(_keys)
|
196
219
|
{ value: value, location: location, comments: comments }
|
197
220
|
end
|
198
221
|
|
@@ -243,7 +266,7 @@ module SyntaxTree
|
|
243
266
|
|
244
267
|
alias deconstruct child_nodes
|
245
268
|
|
246
|
-
def deconstruct_keys(
|
269
|
+
def deconstruct_keys(_keys)
|
247
270
|
{
|
248
271
|
lbrace: lbrace,
|
249
272
|
statements: statements,
|
@@ -298,7 +321,7 @@ module SyntaxTree
|
|
298
321
|
|
299
322
|
alias deconstruct child_nodes
|
300
323
|
|
301
|
-
def deconstruct_keys(
|
324
|
+
def deconstruct_keys(_keys)
|
302
325
|
{ value: value, location: location, comments: comments }
|
303
326
|
end
|
304
327
|
|
@@ -323,6 +346,8 @@ module SyntaxTree
|
|
323
346
|
# symbols (note that this includes dynamic symbols like
|
324
347
|
# :"left-#{middle}-right").
|
325
348
|
class Alias < Node
|
349
|
+
# Formats an argument to the alias keyword. For symbol literals it uses the
|
350
|
+
# value of the symbol directly to look like bare words.
|
326
351
|
class AliasArgumentFormatter
|
327
352
|
# [DynaSymbol | SymbolLiteral] the argument being passed to alias
|
328
353
|
attr_reader :argument
|
@@ -374,7 +399,7 @@ module SyntaxTree
|
|
374
399
|
|
375
400
|
alias deconstruct child_nodes
|
376
401
|
|
377
|
-
def deconstruct_keys(
|
402
|
+
def deconstruct_keys(_keys)
|
378
403
|
{ left: left, right: right, location: location, comments: comments }
|
379
404
|
end
|
380
405
|
|
@@ -435,7 +460,7 @@ module SyntaxTree
|
|
435
460
|
|
436
461
|
alias deconstruct child_nodes
|
437
462
|
|
438
|
-
def deconstruct_keys(
|
463
|
+
def deconstruct_keys(_keys)
|
439
464
|
{
|
440
465
|
collection: collection,
|
441
466
|
index: index,
|
@@ -496,7 +521,7 @@ module SyntaxTree
|
|
496
521
|
|
497
522
|
alias deconstruct child_nodes
|
498
523
|
|
499
|
-
def deconstruct_keys(
|
524
|
+
def deconstruct_keys(_keys)
|
500
525
|
{
|
501
526
|
collection: collection,
|
502
527
|
index: index,
|
@@ -558,7 +583,7 @@ module SyntaxTree
|
|
558
583
|
|
559
584
|
alias deconstruct child_nodes
|
560
585
|
|
561
|
-
def deconstruct_keys(
|
586
|
+
def deconstruct_keys(_keys)
|
562
587
|
{ arguments: arguments, location: location, comments: comments }
|
563
588
|
end
|
564
589
|
|
@@ -606,7 +631,7 @@ module SyntaxTree
|
|
606
631
|
|
607
632
|
alias deconstruct child_nodes
|
608
633
|
|
609
|
-
def deconstruct_keys(
|
634
|
+
def deconstruct_keys(_keys)
|
610
635
|
{ parts: parts, location: location, comments: comments }
|
611
636
|
end
|
612
637
|
|
@@ -642,7 +667,7 @@ module SyntaxTree
|
|
642
667
|
|
643
668
|
alias deconstruct child_nodes
|
644
669
|
|
645
|
-
def deconstruct_keys(
|
670
|
+
def deconstruct_keys(_keys)
|
646
671
|
{ value: value, location: location, comments: comments }
|
647
672
|
end
|
648
673
|
|
@@ -679,7 +704,7 @@ module SyntaxTree
|
|
679
704
|
|
680
705
|
alias deconstruct child_nodes
|
681
706
|
|
682
|
-
def deconstruct_keys(
|
707
|
+
def deconstruct_keys(_keys)
|
683
708
|
{ value: value, location: location, comments: comments }
|
684
709
|
end
|
685
710
|
|
@@ -729,7 +754,7 @@ module SyntaxTree
|
|
729
754
|
|
730
755
|
alias deconstruct child_nodes
|
731
756
|
|
732
|
-
def deconstruct_keys(
|
757
|
+
def deconstruct_keys(_keys)
|
733
758
|
{ value: value, location: location, comments: comments }
|
734
759
|
end
|
735
760
|
|
@@ -745,6 +770,7 @@ module SyntaxTree
|
|
745
770
|
# [one, two, three]
|
746
771
|
#
|
747
772
|
class ArrayLiteral < Node
|
773
|
+
# Formats an array of multiple simple string literals into the %w syntax.
|
748
774
|
class QWordsFormatter
|
749
775
|
# [Args] the contents of the array
|
750
776
|
attr_reader :contents
|
@@ -761,7 +787,7 @@ module SyntaxTree
|
|
761
787
|
if part.is_a?(StringLiteral)
|
762
788
|
q.format(part.parts.first)
|
763
789
|
else
|
764
|
-
q.text(part.value[1
|
790
|
+
q.text(part.value[1..])
|
765
791
|
end
|
766
792
|
end
|
767
793
|
end
|
@@ -770,6 +796,7 @@ module SyntaxTree
|
|
770
796
|
end
|
771
797
|
end
|
772
798
|
|
799
|
+
# Formats an array of multiple simple symbol literals into the %i syntax.
|
773
800
|
class QSymbolsFormatter
|
774
801
|
# [Args] the contents of the array
|
775
802
|
attr_reader :contents
|
@@ -791,6 +818,28 @@ module SyntaxTree
|
|
791
818
|
end
|
792
819
|
end
|
793
820
|
|
821
|
+
# Formats an array that contains only a list of variable references. To make
|
822
|
+
# things simpler, if there are a bunch, we format them all using the "fill"
|
823
|
+
# algorithm as opposed to breaking them into a ton of lines. For example,
|
824
|
+
#
|
825
|
+
# [foo, bar, baz]
|
826
|
+
#
|
827
|
+
# instead of becoming:
|
828
|
+
#
|
829
|
+
# [
|
830
|
+
# foo,
|
831
|
+
# bar,
|
832
|
+
# baz
|
833
|
+
# ]
|
834
|
+
#
|
835
|
+
# would instead become:
|
836
|
+
#
|
837
|
+
# [
|
838
|
+
# foo, bar,
|
839
|
+
# baz
|
840
|
+
# ]
|
841
|
+
#
|
842
|
+
# provided the line length was hit between `bar` and `baz`.
|
794
843
|
class VarRefsFormatter
|
795
844
|
# [Args] the contents of the array
|
796
845
|
attr_reader :contents
|
@@ -816,6 +865,9 @@ module SyntaxTree
|
|
816
865
|
end
|
817
866
|
end
|
818
867
|
|
868
|
+
# This is a special formatter used if the array literal contains no values
|
869
|
+
# but _does_ contain comments. In this case we do some special formatting to
|
870
|
+
# make sure the comments gets indented properly.
|
819
871
|
class EmptyWithCommentsFormatter
|
820
872
|
# [LBracket] the opening bracket
|
821
873
|
attr_reader :lbracket
|
@@ -865,7 +917,7 @@ module SyntaxTree
|
|
865
917
|
|
866
918
|
alias deconstruct child_nodes
|
867
919
|
|
868
|
-
def deconstruct_keys(
|
920
|
+
def deconstruct_keys(_keys)
|
869
921
|
{
|
870
922
|
lbracket: lbracket,
|
871
923
|
contents: contents,
|
@@ -951,7 +1003,8 @@ module SyntaxTree
|
|
951
1003
|
# If we have an empty array that contains only comments, then we're going
|
952
1004
|
# to do some special printing to ensure they get indented correctly.
|
953
1005
|
def empty_with_comments?
|
954
|
-
contents.nil? && lbracket.comments.any? &&
|
1006
|
+
contents.nil? && lbracket.comments.any? &&
|
1007
|
+
lbracket.comments.none?(&:inline?)
|
955
1008
|
end
|
956
1009
|
end
|
957
1010
|
|
@@ -973,6 +1026,7 @@ module SyntaxTree
|
|
973
1026
|
# and an optional array of positional matches that occur after the splat.
|
974
1027
|
# All of the in clauses above would create an AryPtn node.
|
975
1028
|
class AryPtn < Node
|
1029
|
+
# Formats the optional splat of an array pattern.
|
976
1030
|
class RestFormatter
|
977
1031
|
# [VarField] the identifier that represents the remaining positionals
|
978
1032
|
attr_reader :value
|
@@ -1035,7 +1089,7 @@ module SyntaxTree
|
|
1035
1089
|
|
1036
1090
|
alias deconstruct child_nodes
|
1037
1091
|
|
1038
|
-
def deconstruct_keys(
|
1092
|
+
def deconstruct_keys(_keys)
|
1039
1093
|
{
|
1040
1094
|
constant: constant,
|
1041
1095
|
requireds: requireds,
|
@@ -1067,6 +1121,8 @@ module SyntaxTree
|
|
1067
1121
|
q.text("[")
|
1068
1122
|
q.seplist(parts) { |part| q.format(part) }
|
1069
1123
|
q.text("]")
|
1124
|
+
elsif parts.empty?
|
1125
|
+
q.text("[]")
|
1070
1126
|
else
|
1071
1127
|
q.group { q.seplist(parts) { |part| q.format(part) } }
|
1072
1128
|
end
|
@@ -1077,7 +1133,8 @@ module SyntaxTree
|
|
1077
1133
|
module AssignFormatting
|
1078
1134
|
def self.skip_indent?(value)
|
1079
1135
|
case value
|
1080
|
-
in ArrayLiteral | HashLiteral | Heredoc | Lambda | QSymbols | QWords |
|
1136
|
+
in ArrayLiteral | HashLiteral | Heredoc | Lambda | QSymbols | QWords |
|
1137
|
+
Symbols | Words
|
1081
1138
|
true
|
1082
1139
|
in Call[receiver:]
|
1083
1140
|
skip_indent?(receiver)
|
@@ -1123,7 +1180,7 @@ module SyntaxTree
|
|
1123
1180
|
|
1124
1181
|
alias deconstruct child_nodes
|
1125
1182
|
|
1126
|
-
def deconstruct_keys(
|
1183
|
+
def deconstruct_keys(_keys)
|
1127
1184
|
{ target: target, value: value, location: location, comments: comments }
|
1128
1185
|
end
|
1129
1186
|
|
@@ -1185,12 +1242,12 @@ module SyntaxTree
|
|
1185
1242
|
|
1186
1243
|
alias deconstruct child_nodes
|
1187
1244
|
|
1188
|
-
def deconstruct_keys(
|
1245
|
+
def deconstruct_keys(_keys)
|
1189
1246
|
{ key: key, value: value, location: location, comments: comments }
|
1190
1247
|
end
|
1191
1248
|
|
1192
1249
|
def format(q)
|
1193
|
-
if value
|
1250
|
+
if value.is_a?(HashLiteral)
|
1194
1251
|
format_contents(q)
|
1195
1252
|
else
|
1196
1253
|
q.group { format_contents(q) }
|
@@ -1243,7 +1300,7 @@ module SyntaxTree
|
|
1243
1300
|
|
1244
1301
|
alias deconstruct child_nodes
|
1245
1302
|
|
1246
|
-
def deconstruct_keys(
|
1303
|
+
def deconstruct_keys(_keys)
|
1247
1304
|
{ value: value, location: location, comments: comments }
|
1248
1305
|
end
|
1249
1306
|
|
@@ -1281,7 +1338,7 @@ module SyntaxTree
|
|
1281
1338
|
|
1282
1339
|
alias deconstruct child_nodes
|
1283
1340
|
|
1284
|
-
def deconstruct_keys(
|
1341
|
+
def deconstruct_keys(_keys)
|
1285
1342
|
{ value: value, location: location, comments: comments }
|
1286
1343
|
end
|
1287
1344
|
|
@@ -1316,7 +1373,7 @@ module SyntaxTree
|
|
1316
1373
|
|
1317
1374
|
alias deconstruct child_nodes
|
1318
1375
|
|
1319
|
-
def deconstruct_keys(
|
1376
|
+
def deconstruct_keys(_keys)
|
1320
1377
|
{ value: value, location: location, comments: comments }
|
1321
1378
|
end
|
1322
1379
|
|
@@ -1329,21 +1386,28 @@ module SyntaxTree
|
|
1329
1386
|
# hash or bare hash. It first determines if every key in the hash can use
|
1330
1387
|
# labels. If it can, it uses labels. Otherwise it uses hash rockets.
|
1331
1388
|
module HashKeyFormatter
|
1389
|
+
# Formats the keys of a hash literal using labels.
|
1332
1390
|
class Labels
|
1391
|
+
LABEL = /^[@$_A-Za-z]([_A-Za-z0-9]*)?([!_=?A-Za-z0-9])?$/
|
1392
|
+
|
1333
1393
|
def format_key(q, key)
|
1334
1394
|
case key
|
1335
|
-
|
1395
|
+
in Label
|
1336
1396
|
q.format(key)
|
1337
|
-
|
1397
|
+
in SymbolLiteral
|
1338
1398
|
q.format(key.value)
|
1339
1399
|
q.text(":")
|
1340
|
-
|
1400
|
+
in DynaSymbol[parts: [TStringContent[value: LABEL] => part]]
|
1401
|
+
q.format(part)
|
1402
|
+
q.text(":")
|
1403
|
+
in DynaSymbol
|
1341
1404
|
q.format(key)
|
1342
1405
|
q.text(":")
|
1343
1406
|
end
|
1344
1407
|
end
|
1345
1408
|
end
|
1346
1409
|
|
1410
|
+
# Formats the keys of a hash literal using hash rockets.
|
1347
1411
|
class Rockets
|
1348
1412
|
def format_key(q, key)
|
1349
1413
|
case key
|
@@ -1417,7 +1481,7 @@ module SyntaxTree
|
|
1417
1481
|
|
1418
1482
|
alias deconstruct child_nodes
|
1419
1483
|
|
1420
|
-
def deconstruct_keys(
|
1484
|
+
def deconstruct_keys(_keys)
|
1421
1485
|
{ assocs: assocs, location: location, comments: comments }
|
1422
1486
|
end
|
1423
1487
|
|
@@ -1459,7 +1523,7 @@ module SyntaxTree
|
|
1459
1523
|
|
1460
1524
|
alias deconstruct child_nodes
|
1461
1525
|
|
1462
|
-
def deconstruct_keys(
|
1526
|
+
def deconstruct_keys(_keys)
|
1463
1527
|
{ bodystmt: bodystmt, location: location, comments: comments }
|
1464
1528
|
end
|
1465
1529
|
|
@@ -1507,7 +1571,7 @@ module SyntaxTree
|
|
1507
1571
|
|
1508
1572
|
alias deconstruct child_nodes
|
1509
1573
|
|
1510
|
-
def deconstruct_keys(
|
1574
|
+
def deconstruct_keys(_keys)
|
1511
1575
|
{ statement: statement, location: location, comments: comments }
|
1512
1576
|
end
|
1513
1577
|
|
@@ -1567,7 +1631,7 @@ module SyntaxTree
|
|
1567
1631
|
|
1568
1632
|
alias deconstruct child_nodes
|
1569
1633
|
|
1570
|
-
def deconstruct_keys(
|
1634
|
+
def deconstruct_keys(_keys)
|
1571
1635
|
{
|
1572
1636
|
left: left,
|
1573
1637
|
operator: operator,
|
@@ -1682,7 +1746,7 @@ module SyntaxTree
|
|
1682
1746
|
|
1683
1747
|
alias deconstruct child_nodes
|
1684
1748
|
|
1685
|
-
def deconstruct_keys(
|
1749
|
+
def deconstruct_keys(_keys)
|
1686
1750
|
{ params: params, locals: locals, location: location, comments: comments }
|
1687
1751
|
end
|
1688
1752
|
|
@@ -1726,7 +1790,7 @@ module SyntaxTree
|
|
1726
1790
|
|
1727
1791
|
alias deconstruct child_nodes
|
1728
1792
|
|
1729
|
-
def deconstruct_keys(
|
1793
|
+
def deconstruct_keys(_keys)
|
1730
1794
|
{ name: name, location: location, comments: comments }
|
1731
1795
|
end
|
1732
1796
|
|
@@ -1822,7 +1886,7 @@ module SyntaxTree
|
|
1822
1886
|
|
1823
1887
|
alias deconstruct child_nodes
|
1824
1888
|
|
1825
|
-
def deconstruct_keys(
|
1889
|
+
def deconstruct_keys(_keys)
|
1826
1890
|
{
|
1827
1891
|
statements: statements,
|
1828
1892
|
rescue_clause: rescue_clause,
|
@@ -1868,6 +1932,7 @@ module SyntaxTree
|
|
1868
1932
|
|
1869
1933
|
# Responsible for formatting either a BraceBlock or a DoBlock.
|
1870
1934
|
class BlockFormatter
|
1935
|
+
# Formats the opening brace or keyword of a block.
|
1871
1936
|
class BlockOpenFormatter
|
1872
1937
|
# [String] the actual output that should be printed
|
1873
1938
|
attr_reader :text
|
@@ -1933,9 +1998,9 @@ module SyntaxTree
|
|
1933
1998
|
end
|
1934
1999
|
|
1935
2000
|
q.group do
|
1936
|
-
q
|
1937
|
-
|
1938
|
-
|
2001
|
+
q
|
2002
|
+
.if_break { format_break(q, break_opening, break_closing) }
|
2003
|
+
.if_flat { format_flat(q, flat_opening, flat_closing) }
|
1939
2004
|
end
|
1940
2005
|
end
|
1941
2006
|
|
@@ -2060,7 +2125,7 @@ module SyntaxTree
|
|
2060
2125
|
|
2061
2126
|
alias deconstruct child_nodes
|
2062
2127
|
|
2063
|
-
def deconstruct_keys(
|
2128
|
+
def deconstruct_keys(_keys)
|
2064
2129
|
{
|
2065
2130
|
lbrace: lbrace,
|
2066
2131
|
block_var: block_var,
|
@@ -2099,7 +2164,11 @@ module SyntaxTree
|
|
2099
2164
|
#
|
2100
2165
|
# break
|
2101
2166
|
#
|
2102
|
-
in [Paren[
|
2167
|
+
in [Paren[
|
2168
|
+
contents: {
|
2169
|
+
body: [ArrayLiteral[contents: { parts: [_, _, *] }] => array]
|
2170
|
+
}
|
2171
|
+
]]
|
2103
2172
|
# Here we have a single argument that is a set of parentheses wrapping
|
2104
2173
|
# an array literal that has at least 2 elements. We're going to print
|
2105
2174
|
# the contents of the array directly. This would be like if we had:
|
@@ -2255,7 +2324,7 @@ module SyntaxTree
|
|
2255
2324
|
|
2256
2325
|
alias deconstruct child_nodes
|
2257
2326
|
|
2258
|
-
def deconstruct_keys(
|
2327
|
+
def deconstruct_keys(_keys)
|
2259
2328
|
{ arguments: arguments, location: location, comments: comments }
|
2260
2329
|
end
|
2261
2330
|
|
@@ -2287,6 +2356,20 @@ module SyntaxTree
|
|
2287
2356
|
end
|
2288
2357
|
end
|
2289
2358
|
|
2359
|
+
# This is probably the most complicated formatter in this file. It's
|
2360
|
+
# responsible for formatting chains of method calls, with or without arguments
|
2361
|
+
# or blocks. In general, we want to go from something like
|
2362
|
+
#
|
2363
|
+
# foo.bar.baz
|
2364
|
+
#
|
2365
|
+
# to
|
2366
|
+
#
|
2367
|
+
# foo
|
2368
|
+
# .bar
|
2369
|
+
# .baz
|
2370
|
+
#
|
2371
|
+
# Of course there are a lot of caveats to that, including trailing operators
|
2372
|
+
# when necessary, where comments are places, how blocks are aligned, etc.
|
2290
2373
|
class CallChainFormatter
|
2291
2374
|
# [Call | MethodAddBlock] the top of the call chain
|
2292
2375
|
attr_reader :node
|
@@ -2301,7 +2384,7 @@ module SyntaxTree
|
|
2301
2384
|
|
2302
2385
|
# First, walk down the chain until we get to the point where we're not
|
2303
2386
|
# longer at a chainable node.
|
2304
|
-
|
2387
|
+
loop do
|
2305
2388
|
case children.last
|
2306
2389
|
in Call[receiver: Call]
|
2307
2390
|
children << children.last.receiver
|
@@ -2321,7 +2404,7 @@ module SyntaxTree
|
|
2321
2404
|
# block. For more details, see
|
2322
2405
|
# https://github.com/prettier/plugin-ruby/issues/863.
|
2323
2406
|
parents = q.parents.take(4)
|
2324
|
-
if parent = parents[2]
|
2407
|
+
if (parent = parents[2])
|
2325
2408
|
# If we're at a do_block, then we want to go one more level up. This is
|
2326
2409
|
# because do blocks have BodyStmt nodes instead of just Statements
|
2327
2410
|
# nodes.
|
@@ -2335,7 +2418,11 @@ module SyntaxTree
|
|
2335
2418
|
end
|
2336
2419
|
|
2337
2420
|
if children.length >= threshold
|
2338
|
-
q.group
|
2421
|
+
q.group do
|
2422
|
+
q
|
2423
|
+
.if_break { format_chain(q, children) }
|
2424
|
+
.if_flat { node.format_contents(q) }
|
2425
|
+
end
|
2339
2426
|
else
|
2340
2427
|
node.format_contents(q)
|
2341
2428
|
end
|
@@ -2346,9 +2433,9 @@ module SyntaxTree
|
|
2346
2433
|
# chain of calls without arguments except for the last one. This is common
|
2347
2434
|
# enough in Ruby source code that it's worth the extra complexity here.
|
2348
2435
|
empty_except_last =
|
2349
|
-
children
|
2350
|
-
|
2351
|
-
|
2436
|
+
children
|
2437
|
+
.drop(1)
|
2438
|
+
.all? { |child| child.is_a?(Call) && child.arguments.nil? }
|
2352
2439
|
|
2353
2440
|
# Here, we're going to add all of the children onto the stack of the
|
2354
2441
|
# formatter so it's as if we had descending normally into them. This is
|
@@ -2368,9 +2455,12 @@ module SyntaxTree
|
|
2368
2455
|
# and a trailing operator.
|
2369
2456
|
skip_operator = false
|
2370
2457
|
|
2371
|
-
while child = children.pop
|
2458
|
+
while (child = children.pop)
|
2372
2459
|
case child
|
2373
|
-
in Call[
|
2460
|
+
in Call[
|
2461
|
+
receiver: Call[message: { value: "where" }],
|
2462
|
+
message: { value: "not" }
|
2463
|
+
]
|
2374
2464
|
# This is very specialized behavior wherein we group
|
2375
2465
|
# .where.not calls together because it looks better. For more
|
2376
2466
|
# information, see
|
@@ -2432,16 +2522,25 @@ module SyntaxTree
|
|
2432
2522
|
# want to indent the first call. So we'll pop off the first children and
|
2433
2523
|
# format it separately here.
|
2434
2524
|
def attach_directly?(node)
|
2435
|
-
[ArrayLiteral, HashLiteral, Heredoc, If, Unless, XStringLiteral]
|
2436
|
-
|
2525
|
+
[ArrayLiteral, HashLiteral, Heredoc, If, Unless, XStringLiteral].include?(
|
2526
|
+
node.receiver.class
|
2527
|
+
)
|
2437
2528
|
end
|
2438
2529
|
|
2439
|
-
def format_child(
|
2530
|
+
def format_child(
|
2531
|
+
q,
|
2532
|
+
child,
|
2533
|
+
skip_comments: false,
|
2534
|
+
skip_operator: false,
|
2535
|
+
skip_attached: false
|
2536
|
+
)
|
2440
2537
|
# First, format the actual contents of the child.
|
2441
2538
|
case child
|
2442
2539
|
in Call
|
2443
2540
|
q.group do
|
2444
|
-
|
2541
|
+
unless skip_operator
|
2542
|
+
q.format(CallOperatorFormatter.new(child.operator))
|
2543
|
+
end
|
2445
2544
|
q.format(child.message) if child.message != :call
|
2446
2545
|
child.format_arguments(q) unless skip_attached
|
2447
2546
|
end
|
@@ -2513,7 +2612,7 @@ module SyntaxTree
|
|
2513
2612
|
|
2514
2613
|
alias deconstruct child_nodes
|
2515
2614
|
|
2516
|
-
def deconstruct_keys(
|
2615
|
+
def deconstruct_keys(_keys)
|
2517
2616
|
{
|
2518
2617
|
receiver: receiver,
|
2519
2618
|
operator: operator,
|
@@ -2528,8 +2627,13 @@ module SyntaxTree
|
|
2528
2627
|
# If we're at the top of a call chain, then we're going to do some
|
2529
2628
|
# specialized printing in case we can print it nicely. We _only_ do this
|
2530
2629
|
# at the top of the chain to avoid weird recursion issues.
|
2531
|
-
if !CallChainFormatter.chained?(q.parent) &&
|
2532
|
-
|
2630
|
+
if !CallChainFormatter.chained?(q.parent) &&
|
2631
|
+
CallChainFormatter.chained?(receiver)
|
2632
|
+
q.group do
|
2633
|
+
q
|
2634
|
+
.if_break { CallChainFormatter.new(self).format(q) }
|
2635
|
+
.if_flat { format_contents(q) }
|
2636
|
+
end
|
2533
2637
|
else
|
2534
2638
|
format_contents(q)
|
2535
2639
|
end
|
@@ -2618,7 +2722,7 @@ module SyntaxTree
|
|
2618
2722
|
|
2619
2723
|
alias deconstruct child_nodes
|
2620
2724
|
|
2621
|
-
def deconstruct_keys(
|
2725
|
+
def deconstruct_keys(_keys)
|
2622
2726
|
{
|
2623
2727
|
keyword: keyword,
|
2624
2728
|
value: value,
|
@@ -2683,7 +2787,7 @@ module SyntaxTree
|
|
2683
2787
|
|
2684
2788
|
alias deconstruct child_nodes
|
2685
2789
|
|
2686
|
-
def deconstruct_keys(
|
2790
|
+
def deconstruct_keys(_keys)
|
2687
2791
|
{
|
2688
2792
|
value: value,
|
2689
2793
|
operator: operator,
|
@@ -2772,7 +2876,7 @@ module SyntaxTree
|
|
2772
2876
|
|
2773
2877
|
alias deconstruct child_nodes
|
2774
2878
|
|
2775
|
-
def deconstruct_keys(
|
2879
|
+
def deconstruct_keys(_keys)
|
2776
2880
|
{
|
2777
2881
|
constant: constant,
|
2778
2882
|
superclass: superclass,
|
@@ -2837,7 +2941,7 @@ module SyntaxTree
|
|
2837
2941
|
|
2838
2942
|
alias deconstruct child_nodes
|
2839
2943
|
|
2840
|
-
def deconstruct_keys(
|
2944
|
+
def deconstruct_keys(_keys)
|
2841
2945
|
{ value: value, location: location }
|
2842
2946
|
end
|
2843
2947
|
end
|
@@ -2875,7 +2979,7 @@ module SyntaxTree
|
|
2875
2979
|
|
2876
2980
|
alias deconstruct child_nodes
|
2877
2981
|
|
2878
|
-
def deconstruct_keys(
|
2982
|
+
def deconstruct_keys(_keys)
|
2879
2983
|
{
|
2880
2984
|
message: message,
|
2881
2985
|
arguments: arguments,
|
@@ -2957,7 +3061,7 @@ module SyntaxTree
|
|
2957
3061
|
|
2958
3062
|
alias deconstruct child_nodes
|
2959
3063
|
|
2960
|
-
def deconstruct_keys(
|
3064
|
+
def deconstruct_keys(_keys)
|
2961
3065
|
{
|
2962
3066
|
receiver: receiver,
|
2963
3067
|
operator: operator,
|
@@ -3079,7 +3183,7 @@ module SyntaxTree
|
|
3079
3183
|
end
|
3080
3184
|
|
3081
3185
|
def ignore?
|
3082
|
-
value[1
|
3186
|
+
value[1..].strip == "stree-ignore"
|
3083
3187
|
end
|
3084
3188
|
|
3085
3189
|
def comments
|
@@ -3096,7 +3200,7 @@ module SyntaxTree
|
|
3096
3200
|
|
3097
3201
|
alias deconstruct child_nodes
|
3098
3202
|
|
3099
|
-
def deconstruct_keys(
|
3203
|
+
def deconstruct_keys(_keys)
|
3100
3204
|
{ value: value, inline: inline, location: location }
|
3101
3205
|
end
|
3102
3206
|
|
@@ -3142,7 +3246,7 @@ module SyntaxTree
|
|
3142
3246
|
|
3143
3247
|
alias deconstruct child_nodes
|
3144
3248
|
|
3145
|
-
def deconstruct_keys(
|
3249
|
+
def deconstruct_keys(_keys)
|
3146
3250
|
{ value: value, location: location, comments: comments }
|
3147
3251
|
end
|
3148
3252
|
|
@@ -3184,7 +3288,7 @@ module SyntaxTree
|
|
3184
3288
|
|
3185
3289
|
alias deconstruct child_nodes
|
3186
3290
|
|
3187
|
-
def deconstruct_keys(
|
3291
|
+
def deconstruct_keys(_keys)
|
3188
3292
|
{
|
3189
3293
|
parent: parent,
|
3190
3294
|
constant: constant,
|
@@ -3231,7 +3335,7 @@ module SyntaxTree
|
|
3231
3335
|
|
3232
3336
|
alias deconstruct child_nodes
|
3233
3337
|
|
3234
|
-
def deconstruct_keys(
|
3338
|
+
def deconstruct_keys(_keys)
|
3235
3339
|
{
|
3236
3340
|
parent: parent,
|
3237
3341
|
constant: constant,
|
@@ -3276,7 +3380,7 @@ module SyntaxTree
|
|
3276
3380
|
|
3277
3381
|
alias deconstruct child_nodes
|
3278
3382
|
|
3279
|
-
def deconstruct_keys(
|
3383
|
+
def deconstruct_keys(_keys)
|
3280
3384
|
{ constant: constant, location: location, comments: comments }
|
3281
3385
|
end
|
3282
3386
|
|
@@ -3312,7 +3416,7 @@ module SyntaxTree
|
|
3312
3416
|
|
3313
3417
|
alias deconstruct child_nodes
|
3314
3418
|
|
3315
|
-
def deconstruct_keys(
|
3419
|
+
def deconstruct_keys(_keys)
|
3316
3420
|
{ value: value, location: location, comments: comments }
|
3317
3421
|
end
|
3318
3422
|
|
@@ -3356,7 +3460,7 @@ module SyntaxTree
|
|
3356
3460
|
|
3357
3461
|
alias deconstruct child_nodes
|
3358
3462
|
|
3359
|
-
def deconstruct_keys(
|
3463
|
+
def deconstruct_keys(_keys)
|
3360
3464
|
{
|
3361
3465
|
name: name,
|
3362
3466
|
params: params,
|
@@ -3441,7 +3545,7 @@ module SyntaxTree
|
|
3441
3545
|
|
3442
3546
|
alias deconstruct child_nodes
|
3443
3547
|
|
3444
|
-
def deconstruct_keys(
|
3548
|
+
def deconstruct_keys(_keys)
|
3445
3549
|
{
|
3446
3550
|
target: target,
|
3447
3551
|
operator: operator,
|
@@ -3509,7 +3613,7 @@ module SyntaxTree
|
|
3509
3613
|
|
3510
3614
|
alias deconstruct child_nodes
|
3511
3615
|
|
3512
|
-
def deconstruct_keys(
|
3616
|
+
def deconstruct_keys(_keys)
|
3513
3617
|
{ value: value, location: location, comments: comments }
|
3514
3618
|
end
|
3515
3619
|
|
@@ -3575,7 +3679,7 @@ module SyntaxTree
|
|
3575
3679
|
|
3576
3680
|
alias deconstruct child_nodes
|
3577
3681
|
|
3578
|
-
def deconstruct_keys(
|
3682
|
+
def deconstruct_keys(_keys)
|
3579
3683
|
{
|
3580
3684
|
target: target,
|
3581
3685
|
operator: operator,
|
@@ -3650,7 +3754,7 @@ module SyntaxTree
|
|
3650
3754
|
|
3651
3755
|
alias deconstruct child_nodes
|
3652
3756
|
|
3653
|
-
def deconstruct_keys(
|
3757
|
+
def deconstruct_keys(_keys)
|
3654
3758
|
{
|
3655
3759
|
keyword: keyword,
|
3656
3760
|
block_var: block_var,
|
@@ -3730,7 +3834,7 @@ module SyntaxTree
|
|
3730
3834
|
|
3731
3835
|
alias deconstruct child_nodes
|
3732
3836
|
|
3733
|
-
def deconstruct_keys(
|
3837
|
+
def deconstruct_keys(_keys)
|
3734
3838
|
{ left: left, right: right, location: location, comments: comments }
|
3735
3839
|
end
|
3736
3840
|
|
@@ -3778,7 +3882,7 @@ module SyntaxTree
|
|
3778
3882
|
|
3779
3883
|
alias deconstruct child_nodes
|
3780
3884
|
|
3781
|
-
def deconstruct_keys(
|
3885
|
+
def deconstruct_keys(_keys)
|
3782
3886
|
{ left: left, right: right, location: location, comments: comments }
|
3783
3887
|
end
|
3784
3888
|
|
@@ -3800,7 +3904,7 @@ module SyntaxTree
|
|
3800
3904
|
# quotes, then single quotes would deactivate it.)
|
3801
3905
|
def self.locked?(node)
|
3802
3906
|
node.parts.any? do |part|
|
3803
|
-
part.is_a?(TStringContent) && part.value.match?(
|
3907
|
+
part.is_a?(TStringContent) && part.value.match?(/\\|#[@${]/)
|
3804
3908
|
end
|
3805
3909
|
end
|
3806
3910
|
|
@@ -3865,7 +3969,7 @@ module SyntaxTree
|
|
3865
3969
|
|
3866
3970
|
alias deconstruct child_nodes
|
3867
3971
|
|
3868
|
-
def deconstruct_keys(
|
3972
|
+
def deconstruct_keys(_keys)
|
3869
3973
|
{ parts: parts, quote: quote, location: location, comments: comments }
|
3870
3974
|
end
|
3871
3975
|
|
@@ -3906,9 +4010,14 @@ module SyntaxTree
|
|
3906
4010
|
matching = Quotes.matching(quote[2])
|
3907
4011
|
pattern = /[\n#{Regexp.escape(matching)}'"]/
|
3908
4012
|
|
3909
|
-
|
3910
|
-
|
3911
|
-
|
4013
|
+
# This check is to ensure we don't find a matching quote inside of the
|
4014
|
+
# symbol that would be confusing.
|
4015
|
+
matched =
|
4016
|
+
parts.any? do |part|
|
4017
|
+
part.is_a?(TStringContent) && part.value.match?(pattern)
|
4018
|
+
end
|
4019
|
+
|
4020
|
+
if matched
|
3912
4021
|
[quote, matching]
|
3913
4022
|
elsif Quotes.locked?(self)
|
3914
4023
|
["#{":" unless hash_key}'", "'"]
|
@@ -3917,7 +4026,7 @@ module SyntaxTree
|
|
3917
4026
|
end
|
3918
4027
|
elsif Quotes.locked?(self)
|
3919
4028
|
if quote.start_with?(":")
|
3920
|
-
[hash_key ? quote[1
|
4029
|
+
[hash_key ? quote[1..] : quote, quote[1..]]
|
3921
4030
|
else
|
3922
4031
|
[hash_key ? quote : ":#{quote}", quote]
|
3923
4032
|
end
|
@@ -3960,7 +4069,7 @@ module SyntaxTree
|
|
3960
4069
|
|
3961
4070
|
alias deconstruct child_nodes
|
3962
4071
|
|
3963
|
-
def deconstruct_keys(
|
4072
|
+
def deconstruct_keys(_keys)
|
3964
4073
|
{
|
3965
4074
|
keyword: keyword,
|
3966
4075
|
statements: statements,
|
@@ -4026,7 +4135,7 @@ module SyntaxTree
|
|
4026
4135
|
|
4027
4136
|
alias deconstruct child_nodes
|
4028
4137
|
|
4029
|
-
def deconstruct_keys(
|
4138
|
+
def deconstruct_keys(_keys)
|
4030
4139
|
{
|
4031
4140
|
predicate: predicate,
|
4032
4141
|
statements: statements,
|
@@ -4098,7 +4207,7 @@ module SyntaxTree
|
|
4098
4207
|
|
4099
4208
|
alias deconstruct child_nodes
|
4100
4209
|
|
4101
|
-
def deconstruct_keys(
|
4210
|
+
def deconstruct_keys(_keys)
|
4102
4211
|
{ value: value, location: location }
|
4103
4212
|
end
|
4104
4213
|
|
@@ -4133,7 +4242,7 @@ module SyntaxTree
|
|
4133
4242
|
|
4134
4243
|
alias deconstruct child_nodes
|
4135
4244
|
|
4136
|
-
def deconstruct_keys(
|
4245
|
+
def deconstruct_keys(_keys)
|
4137
4246
|
{ value: value, location: location }
|
4138
4247
|
end
|
4139
4248
|
end
|
@@ -4163,7 +4272,7 @@ module SyntaxTree
|
|
4163
4272
|
|
4164
4273
|
alias deconstruct child_nodes
|
4165
4274
|
|
4166
|
-
def deconstruct_keys(
|
4275
|
+
def deconstruct_keys(_keys)
|
4167
4276
|
{ value: value, location: location }
|
4168
4277
|
end
|
4169
4278
|
end
|
@@ -4195,7 +4304,7 @@ module SyntaxTree
|
|
4195
4304
|
|
4196
4305
|
alias deconstruct child_nodes
|
4197
4306
|
|
4198
|
-
def deconstruct_keys(
|
4307
|
+
def deconstruct_keys(_keys)
|
4199
4308
|
{ value: value, location: location }
|
4200
4309
|
end
|
4201
4310
|
end
|
@@ -4234,7 +4343,7 @@ module SyntaxTree
|
|
4234
4343
|
|
4235
4344
|
alias deconstruct child_nodes
|
4236
4345
|
|
4237
|
-
def deconstruct_keys(
|
4346
|
+
def deconstruct_keys(_keys)
|
4238
4347
|
{
|
4239
4348
|
keyword: keyword,
|
4240
4349
|
statements: statements,
|
@@ -4288,7 +4397,7 @@ module SyntaxTree
|
|
4288
4397
|
|
4289
4398
|
alias deconstruct child_nodes
|
4290
4399
|
|
4291
|
-
def deconstruct_keys(
|
4400
|
+
def deconstruct_keys(_keys)
|
4292
4401
|
{ value: value, location: location, comments: comments }
|
4293
4402
|
end
|
4294
4403
|
|
@@ -4331,7 +4440,7 @@ module SyntaxTree
|
|
4331
4440
|
|
4332
4441
|
alias deconstruct child_nodes
|
4333
4442
|
|
4334
|
-
def deconstruct_keys(
|
4443
|
+
def deconstruct_keys(_keys)
|
4335
4444
|
{
|
4336
4445
|
value: value,
|
4337
4446
|
arguments: arguments,
|
@@ -4343,7 +4452,8 @@ module SyntaxTree
|
|
4343
4452
|
def format(q)
|
4344
4453
|
q.format(value)
|
4345
4454
|
|
4346
|
-
if arguments.is_a?(ArgParen) && arguments.arguments.nil? &&
|
4455
|
+
if arguments.is_a?(ArgParen) && arguments.arguments.nil? &&
|
4456
|
+
!value.is_a?(Const)
|
4347
4457
|
# If you're using an explicit set of parentheses on something that looks
|
4348
4458
|
# like a constant, then we need to match that in order to maintain valid
|
4349
4459
|
# Ruby. For example, you could do something like Foo(), on which we
|
@@ -4390,7 +4500,7 @@ module SyntaxTree
|
|
4390
4500
|
|
4391
4501
|
alias deconstruct child_nodes
|
4392
4502
|
|
4393
|
-
def deconstruct_keys(
|
4503
|
+
def deconstruct_keys(_keys)
|
4394
4504
|
{
|
4395
4505
|
parent: parent,
|
4396
4506
|
operator: operator,
|
@@ -4436,7 +4546,7 @@ module SyntaxTree
|
|
4436
4546
|
|
4437
4547
|
alias deconstruct child_nodes
|
4438
4548
|
|
4439
|
-
def deconstruct_keys(
|
4549
|
+
def deconstruct_keys(_keys)
|
4440
4550
|
{ value: value, location: location, comments: comments }
|
4441
4551
|
end
|
4442
4552
|
|
@@ -4488,7 +4598,7 @@ module SyntaxTree
|
|
4488
4598
|
|
4489
4599
|
alias deconstruct child_nodes
|
4490
4600
|
|
4491
|
-
def deconstruct_keys(
|
4601
|
+
def deconstruct_keys(_keys)
|
4492
4602
|
{
|
4493
4603
|
constant: constant,
|
4494
4604
|
left: left,
|
@@ -4552,7 +4662,7 @@ module SyntaxTree
|
|
4552
4662
|
|
4553
4663
|
alias deconstruct child_nodes
|
4554
4664
|
|
4555
|
-
def deconstruct_keys(
|
4665
|
+
def deconstruct_keys(_keys)
|
4556
4666
|
{
|
4557
4667
|
index: index,
|
4558
4668
|
collection: collection,
|
@@ -4609,7 +4719,7 @@ module SyntaxTree
|
|
4609
4719
|
|
4610
4720
|
alias deconstruct child_nodes
|
4611
4721
|
|
4612
|
-
def deconstruct_keys(
|
4722
|
+
def deconstruct_keys(_keys)
|
4613
4723
|
{ value: value, location: location, comments: comments }
|
4614
4724
|
end
|
4615
4725
|
|
@@ -4623,6 +4733,9 @@ module SyntaxTree
|
|
4623
4733
|
# { key => value }
|
4624
4734
|
#
|
4625
4735
|
class HashLiteral < Node
|
4736
|
+
# This is a special formatter used if the hash literal contains no values
|
4737
|
+
# but _does_ contain comments. In this case we do some special formatting to
|
4738
|
+
# make sure the comments gets indented properly.
|
4626
4739
|
class EmptyWithCommentsFormatter
|
4627
4740
|
# [LBrace] the opening brace
|
4628
4741
|
attr_reader :lbrace
|
@@ -4672,7 +4785,7 @@ module SyntaxTree
|
|
4672
4785
|
|
4673
4786
|
alias deconstruct child_nodes
|
4674
4787
|
|
4675
|
-
def deconstruct_keys(
|
4788
|
+
def deconstruct_keys(_keys)
|
4676
4789
|
{ lbrace: lbrace, assocs: assocs, location: location, comments: comments }
|
4677
4790
|
end
|
4678
4791
|
|
@@ -4741,7 +4854,14 @@ module SyntaxTree
|
|
4741
4854
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
4742
4855
|
attr_reader :comments
|
4743
4856
|
|
4744
|
-
def initialize(
|
4857
|
+
def initialize(
|
4858
|
+
beginning:,
|
4859
|
+
ending: nil,
|
4860
|
+
dedent: 0,
|
4861
|
+
parts: [],
|
4862
|
+
location:,
|
4863
|
+
comments: []
|
4864
|
+
)
|
4745
4865
|
@beginning = beginning
|
4746
4866
|
@ending = ending
|
4747
4867
|
@dedent = dedent
|
@@ -4760,7 +4880,7 @@ module SyntaxTree
|
|
4760
4880
|
|
4761
4881
|
alias deconstruct child_nodes
|
4762
4882
|
|
4763
|
-
def deconstruct_keys(
|
4883
|
+
def deconstruct_keys(_keys)
|
4764
4884
|
{
|
4765
4885
|
beginning: beginning,
|
4766
4886
|
location: location,
|
@@ -4775,8 +4895,12 @@ module SyntaxTree
|
|
4775
4895
|
# prettyprint module. It's when you want to force a newline, but don't
|
4776
4896
|
# want to force the break parent.
|
4777
4897
|
breakable = -> do
|
4778
|
-
q.target <<
|
4779
|
-
|
4898
|
+
q.target << PrettyPrint::Breakable.new(
|
4899
|
+
" ",
|
4900
|
+
1,
|
4901
|
+
indent: false,
|
4902
|
+
force: true
|
4903
|
+
)
|
4780
4904
|
end
|
4781
4905
|
|
4782
4906
|
q.group do
|
@@ -4832,7 +4956,7 @@ module SyntaxTree
|
|
4832
4956
|
|
4833
4957
|
alias deconstruct child_nodes
|
4834
4958
|
|
4835
|
-
def deconstruct_keys(
|
4959
|
+
def deconstruct_keys(_keys)
|
4836
4960
|
{ value: value, location: location, comments: comments }
|
4837
4961
|
end
|
4838
4962
|
|
@@ -4849,6 +4973,7 @@ module SyntaxTree
|
|
4849
4973
|
# end
|
4850
4974
|
#
|
4851
4975
|
class HshPtn < Node
|
4976
|
+
# Formats a key-value pair in a hash pattern. The value is optional.
|
4852
4977
|
class KeywordFormatter
|
4853
4978
|
# [Label] the keyword being used
|
4854
4979
|
attr_reader :key
|
@@ -4875,6 +5000,7 @@ module SyntaxTree
|
|
4875
5000
|
end
|
4876
5001
|
end
|
4877
5002
|
|
5003
|
+
# Formats the optional double-splat from the pattern.
|
4878
5004
|
class KeywordRestFormatter
|
4879
5005
|
# [VarField] the parameter that matches the remaining keywords
|
4880
5006
|
attr_reader :keyword_rest
|
@@ -4924,7 +5050,7 @@ module SyntaxTree
|
|
4924
5050
|
|
4925
5051
|
alias deconstruct child_nodes
|
4926
5052
|
|
4927
|
-
def deconstruct_keys(
|
5053
|
+
def deconstruct_keys(_keys)
|
4928
5054
|
{
|
4929
5055
|
constant: constant,
|
4930
5056
|
keywords: keywords,
|
@@ -4947,27 +5073,52 @@ module SyntaxTree
|
|
4947
5073
|
q.text(" then") if !constant && keyword_rest && keyword_rest.value.nil?
|
4948
5074
|
end
|
4949
5075
|
|
5076
|
+
# If there is a constant, we're going to format to have the constant name
|
5077
|
+
# first and then use brackets.
|
4950
5078
|
if constant
|
4951
|
-
q.
|
4952
|
-
|
5079
|
+
q.group do
|
5080
|
+
q.format(constant)
|
5081
|
+
q.text("[")
|
5082
|
+
q.indent do
|
5083
|
+
q.breakable("")
|
5084
|
+
contents.call
|
5085
|
+
end
|
5086
|
+
q.breakable("")
|
5087
|
+
q.text("]")
|
5088
|
+
end
|
4953
5089
|
return
|
4954
5090
|
end
|
4955
5091
|
|
5092
|
+
# If there's nothing at all, then we're going to use empty braces.
|
4956
5093
|
if parts.empty?
|
4957
5094
|
q.text("{}")
|
4958
|
-
|
4959
|
-
|
4960
|
-
|
4961
|
-
|
4962
|
-
|
5095
|
+
return
|
5096
|
+
end
|
5097
|
+
|
5098
|
+
# If there's only one pair, then we'll just print the contents provided
|
5099
|
+
# we're not inside another pattern.
|
5100
|
+
if !PATTERNS.include?(q.parent.class) && parts.size == 1
|
4963
5101
|
contents.call
|
5102
|
+
return
|
5103
|
+
end
|
5104
|
+
|
5105
|
+
# Otherwise, we're going to always use braces to make it clear it's a hash
|
5106
|
+
# pattern.
|
5107
|
+
q.group do
|
5108
|
+
q.text("{")
|
5109
|
+
q.indent do
|
5110
|
+
q.breakable
|
5111
|
+
contents.call
|
5112
|
+
end
|
5113
|
+
q.breakable
|
5114
|
+
q.text("}")
|
4964
5115
|
end
|
4965
5116
|
end
|
4966
5117
|
end
|
4967
5118
|
|
4968
5119
|
# The list of nodes that represent patterns inside of pattern matching so that
|
4969
5120
|
# when a pattern is being printed it knows if it's nested.
|
4970
|
-
PATTERNS = [AryPtn, Binary, FndPtn, HshPtn, RAssign]
|
5121
|
+
PATTERNS = [AryPtn, Binary, FndPtn, HshPtn, RAssign].freeze
|
4971
5122
|
|
4972
5123
|
# Ident represents an identifier anywhere in code. It can represent a very
|
4973
5124
|
# large number of things, depending on where it is in the syntax tree.
|
@@ -4997,7 +5148,7 @@ module SyntaxTree
|
|
4997
5148
|
|
4998
5149
|
alias deconstruct child_nodes
|
4999
5150
|
|
5000
|
-
def deconstruct_keys(
|
5151
|
+
def deconstruct_keys(_keys)
|
5001
5152
|
{ value: value, location: location, comments: comments }
|
5002
5153
|
end
|
5003
5154
|
|
@@ -5014,7 +5165,7 @@ module SyntaxTree
|
|
5014
5165
|
def self.call(parent)
|
5015
5166
|
queue = [parent]
|
5016
5167
|
|
5017
|
-
while node = queue.shift
|
5168
|
+
while (node = queue.shift)
|
5018
5169
|
return true if [Assign, MAssign, OpAssign].include?(node.class)
|
5019
5170
|
queue += node.child_nodes
|
5020
5171
|
end
|
@@ -5041,9 +5192,12 @@ module SyntaxTree
|
|
5041
5192
|
else
|
5042
5193
|
# Otherwise, we're going to check the conditional for certain cases.
|
5043
5194
|
case node
|
5044
|
-
in
|
5195
|
+
in predicate: Assign | Command | CommandCall | MAssign | OpAssign
|
5045
5196
|
false
|
5046
|
-
in {
|
5197
|
+
in {
|
5198
|
+
statements: { body: [truthy] },
|
5199
|
+
consequent: Else[statements: { body: [falsy] }]
|
5200
|
+
}
|
5047
5201
|
ternaryable?(truthy) && ternaryable?(falsy)
|
5048
5202
|
else
|
5049
5203
|
false
|
@@ -5054,8 +5208,8 @@ module SyntaxTree
|
|
5054
5208
|
private
|
5055
5209
|
|
5056
5210
|
# Certain expressions cannot be reduced to a ternary without adding
|
5057
|
-
# parentheses around them. In this case we say they cannot be ternaried
|
5058
|
-
# default instead to breaking them into multiple lines.
|
5211
|
+
# parentheses around them. In this case we say they cannot be ternaried
|
5212
|
+
# and default instead to breaking them into multiple lines.
|
5059
5213
|
def ternaryable?(statement)
|
5060
5214
|
# This is a list of nodes that should not be allowed to be a part of a
|
5061
5215
|
# ternary clause.
|
@@ -5113,13 +5267,15 @@ module SyntaxTree
|
|
5113
5267
|
q.group { format_break(q, force: true) }
|
5114
5268
|
else
|
5115
5269
|
q.group do
|
5116
|
-
q
|
5117
|
-
|
5118
|
-
|
5119
|
-
|
5120
|
-
|
5270
|
+
q
|
5271
|
+
.if_break { format_break(q, force: false) }
|
5272
|
+
.if_flat do
|
5273
|
+
Parentheses.flat(q) do
|
5274
|
+
q.format(node.statements)
|
5275
|
+
q.text(" #{keyword} ")
|
5276
|
+
q.format(node.predicate)
|
5277
|
+
end
|
5121
5278
|
end
|
5122
|
-
end
|
5123
5279
|
end
|
5124
5280
|
end
|
5125
5281
|
end
|
@@ -5148,51 +5304,53 @@ module SyntaxTree
|
|
5148
5304
|
|
5149
5305
|
def format_ternary(q)
|
5150
5306
|
q.group do
|
5151
|
-
q
|
5152
|
-
|
5153
|
-
|
5154
|
-
|
5155
|
-
q.indent do
|
5156
|
-
q.breakable
|
5157
|
-
q.format(node.statements)
|
5158
|
-
end
|
5307
|
+
q
|
5308
|
+
.if_break do
|
5309
|
+
q.text("#{keyword} ")
|
5310
|
+
q.nest(keyword.length + 1) { q.format(node.predicate) }
|
5159
5311
|
|
5160
|
-
q.breakable
|
5161
|
-
q.group do
|
5162
|
-
q.format(node.consequent.keyword)
|
5163
5312
|
q.indent do
|
5164
|
-
|
5165
|
-
|
5166
|
-
# parent. If a break-parent shows up in the tree, then it's going
|
5167
|
-
# to force it all the way up to the tree, which is going to negate
|
5168
|
-
# the ternary. Maybe this should be an option in prettyprint? As
|
5169
|
-
# in force: :no_break_parent or something.
|
5170
|
-
q.target << PrettyPrint::Breakable.new(" ", 1, force: true)
|
5171
|
-
q.format(node.consequent.statements)
|
5313
|
+
q.breakable
|
5314
|
+
q.format(node.statements)
|
5172
5315
|
end
|
5173
|
-
end
|
5174
5316
|
|
5175
|
-
|
5176
|
-
|
5177
|
-
|
5178
|
-
|
5179
|
-
|
5180
|
-
|
5317
|
+
q.breakable
|
5318
|
+
q.group do
|
5319
|
+
q.format(node.consequent.keyword)
|
5320
|
+
q.indent do
|
5321
|
+
# This is a very special case of breakable where we want to
|
5322
|
+
# force it into the output but we _don't_ want to explicitly
|
5323
|
+
# break the parent. If a break-parent shows up in the tree, then
|
5324
|
+
# it's going to force it all the way up to the tree, which is
|
5325
|
+
# going to negate the ternary. Maybe this should be an option in
|
5326
|
+
# prettyprint? As in force: :no_break_parent or something.
|
5327
|
+
q.target << PrettyPrint::Breakable.new(" ", 1, force: true)
|
5328
|
+
q.format(node.consequent.statements)
|
5329
|
+
end
|
5330
|
+
end
|
5331
|
+
|
5332
|
+
q.breakable
|
5333
|
+
q.text("end")
|
5334
|
+
end
|
5335
|
+
.if_flat do
|
5336
|
+
Parentheses.flat(q) do
|
5337
|
+
q.format(node.predicate)
|
5338
|
+
q.text(" ? ")
|
5181
5339
|
|
5182
|
-
|
5183
|
-
|
5340
|
+
statements = [node.statements, node.consequent.statements]
|
5341
|
+
statements.reverse! if keyword == "unless"
|
5184
5342
|
|
5185
|
-
|
5186
|
-
|
5187
|
-
|
5343
|
+
q.format(statements[0])
|
5344
|
+
q.text(" : ")
|
5345
|
+
q.format(statements[1])
|
5346
|
+
end
|
5188
5347
|
end
|
5189
|
-
end
|
5190
5348
|
end
|
5191
5349
|
end
|
5192
5350
|
|
5193
5351
|
def contains_conditional?
|
5194
5352
|
case node
|
5195
|
-
in
|
5353
|
+
in statements: { body: [If | IfMod | IfOp | Unless | UnlessMod] }
|
5196
5354
|
true
|
5197
5355
|
else
|
5198
5356
|
false
|
@@ -5242,7 +5400,7 @@ module SyntaxTree
|
|
5242
5400
|
|
5243
5401
|
alias deconstruct child_nodes
|
5244
5402
|
|
5245
|
-
def deconstruct_keys(
|
5403
|
+
def deconstruct_keys(_keys)
|
5246
5404
|
{
|
5247
5405
|
predicate: predicate,
|
5248
5406
|
statements: statements,
|
@@ -5292,7 +5450,7 @@ module SyntaxTree
|
|
5292
5450
|
|
5293
5451
|
alias deconstruct child_nodes
|
5294
5452
|
|
5295
|
-
def deconstruct_keys(
|
5453
|
+
def deconstruct_keys(_keys)
|
5296
5454
|
{
|
5297
5455
|
predicate: predicate,
|
5298
5456
|
truthy: truthy,
|
@@ -5310,7 +5468,8 @@ module SyntaxTree
|
|
5310
5468
|
Yield0, ZSuper
|
5311
5469
|
]
|
5312
5470
|
|
5313
|
-
if q.parent.is_a?(Paren) || force_flat.include?(truthy.class) ||
|
5471
|
+
if q.parent.is_a?(Paren) || force_flat.include?(truthy.class) ||
|
5472
|
+
force_flat.include?(falsy.class)
|
5314
5473
|
q.group { format_flat(q) }
|
5315
5474
|
return
|
5316
5475
|
end
|
@@ -5430,7 +5589,7 @@ module SyntaxTree
|
|
5430
5589
|
|
5431
5590
|
alias deconstruct child_nodes
|
5432
5591
|
|
5433
|
-
def deconstruct_keys(
|
5592
|
+
def deconstruct_keys(_keys)
|
5434
5593
|
{
|
5435
5594
|
statement: statement,
|
5436
5595
|
predicate: predicate,
|
@@ -5471,7 +5630,7 @@ module SyntaxTree
|
|
5471
5630
|
|
5472
5631
|
alias deconstruct child_nodes
|
5473
5632
|
|
5474
|
-
def deconstruct_keys(
|
5633
|
+
def deconstruct_keys(_keys)
|
5475
5634
|
{ value: value, location: location, comments: comments }
|
5476
5635
|
end
|
5477
5636
|
|
@@ -5518,7 +5677,7 @@ module SyntaxTree
|
|
5518
5677
|
|
5519
5678
|
alias deconstruct child_nodes
|
5520
5679
|
|
5521
|
-
def deconstruct_keys(
|
5680
|
+
def deconstruct_keys(_keys)
|
5522
5681
|
{
|
5523
5682
|
pattern: pattern,
|
5524
5683
|
statements: statements,
|
@@ -5577,7 +5736,7 @@ module SyntaxTree
|
|
5577
5736
|
|
5578
5737
|
alias deconstruct child_nodes
|
5579
5738
|
|
5580
|
-
def deconstruct_keys(
|
5739
|
+
def deconstruct_keys(_keys)
|
5581
5740
|
{ value: value, location: location, comments: comments }
|
5582
5741
|
end
|
5583
5742
|
|
@@ -5587,7 +5746,7 @@ module SyntaxTree
|
|
5587
5746
|
# the values, then we're going to insert them every 3 characters
|
5588
5747
|
# starting from the right.
|
5589
5748
|
index = (value.length + 2) % 3
|
5590
|
-
q.text(" #{value}"[index
|
5749
|
+
q.text(" #{value}"[index..].scan(/.../).join("_").strip)
|
5591
5750
|
else
|
5592
5751
|
q.text(value)
|
5593
5752
|
end
|
@@ -5621,7 +5780,7 @@ module SyntaxTree
|
|
5621
5780
|
|
5622
5781
|
alias deconstruct child_nodes
|
5623
5782
|
|
5624
|
-
def deconstruct_keys(
|
5783
|
+
def deconstruct_keys(_keys)
|
5625
5784
|
{ value: value, location: location, comments: comments }
|
5626
5785
|
end
|
5627
5786
|
|
@@ -5666,7 +5825,7 @@ module SyntaxTree
|
|
5666
5825
|
|
5667
5826
|
alias deconstruct child_nodes
|
5668
5827
|
|
5669
|
-
def deconstruct_keys(
|
5828
|
+
def deconstruct_keys(_keys)
|
5670
5829
|
{ value: value, location: location, comments: comments }
|
5671
5830
|
end
|
5672
5831
|
|
@@ -5703,7 +5862,7 @@ module SyntaxTree
|
|
5703
5862
|
|
5704
5863
|
alias deconstruct child_nodes
|
5705
5864
|
|
5706
|
-
def deconstruct_keys(
|
5865
|
+
def deconstruct_keys(_keys)
|
5707
5866
|
{ name: name, location: location, comments: comments }
|
5708
5867
|
end
|
5709
5868
|
|
@@ -5749,7 +5908,7 @@ module SyntaxTree
|
|
5749
5908
|
|
5750
5909
|
alias deconstruct child_nodes
|
5751
5910
|
|
5752
|
-
def deconstruct_keys(
|
5911
|
+
def deconstruct_keys(_keys)
|
5753
5912
|
{ value: value, location: location, comments: comments }
|
5754
5913
|
end
|
5755
5914
|
|
@@ -5784,7 +5943,7 @@ module SyntaxTree
|
|
5784
5943
|
|
5785
5944
|
alias deconstruct child_nodes
|
5786
5945
|
|
5787
|
-
def deconstruct_keys(
|
5946
|
+
def deconstruct_keys(_keys)
|
5788
5947
|
{ value: value, location: location }
|
5789
5948
|
end
|
5790
5949
|
end
|
@@ -5820,7 +5979,7 @@ module SyntaxTree
|
|
5820
5979
|
|
5821
5980
|
alias deconstruct child_nodes
|
5822
5981
|
|
5823
|
-
def deconstruct_keys(
|
5982
|
+
def deconstruct_keys(_keys)
|
5824
5983
|
{
|
5825
5984
|
params: params,
|
5826
5985
|
statements: statements,
|
@@ -5842,25 +6001,27 @@ module SyntaxTree
|
|
5842
6001
|
end
|
5843
6002
|
|
5844
6003
|
q.text(" ")
|
5845
|
-
q
|
5846
|
-
|
5847
|
-
|
5848
|
-
|
6004
|
+
q
|
6005
|
+
.if_break do
|
6006
|
+
force_parens =
|
6007
|
+
q.parents.any? do |node|
|
6008
|
+
node.is_a?(Command) || node.is_a?(CommandCall)
|
6009
|
+
end
|
6010
|
+
|
6011
|
+
q.text(force_parens ? "{" : "do")
|
6012
|
+
q.indent do
|
6013
|
+
q.breakable
|
6014
|
+
q.format(statements)
|
5849
6015
|
end
|
5850
6016
|
|
5851
|
-
q.text(force_parens ? "{" : "do")
|
5852
|
-
q.indent do
|
5853
6017
|
q.breakable
|
6018
|
+
q.text(force_parens ? "}" : "end")
|
6019
|
+
end
|
6020
|
+
.if_flat do
|
6021
|
+
q.text("{ ")
|
5854
6022
|
q.format(statements)
|
6023
|
+
q.text(" }")
|
5855
6024
|
end
|
5856
|
-
|
5857
|
-
q.breakable
|
5858
|
-
q.text(force_parens ? "}" : "end")
|
5859
|
-
end.if_flat do
|
5860
|
-
q.text("{ ")
|
5861
|
-
q.format(statements)
|
5862
|
-
q.text(" }")
|
5863
|
-
end
|
5864
6025
|
end
|
5865
6026
|
end
|
5866
6027
|
end
|
@@ -5889,7 +6050,7 @@ module SyntaxTree
|
|
5889
6050
|
|
5890
6051
|
alias deconstruct child_nodes
|
5891
6052
|
|
5892
|
-
def deconstruct_keys(
|
6053
|
+
def deconstruct_keys(_keys)
|
5893
6054
|
{ value: value, location: location, comments: comments }
|
5894
6055
|
end
|
5895
6056
|
|
@@ -5922,7 +6083,7 @@ module SyntaxTree
|
|
5922
6083
|
|
5923
6084
|
alias deconstruct child_nodes
|
5924
6085
|
|
5925
|
-
def deconstruct_keys(
|
6086
|
+
def deconstruct_keys(_keys)
|
5926
6087
|
{ value: value, location: location, comments: comments }
|
5927
6088
|
end
|
5928
6089
|
|
@@ -5955,7 +6116,7 @@ module SyntaxTree
|
|
5955
6116
|
|
5956
6117
|
alias deconstruct child_nodes
|
5957
6118
|
|
5958
|
-
def deconstruct_keys(
|
6119
|
+
def deconstruct_keys(_keys)
|
5959
6120
|
{ value: value, location: location, comments: comments }
|
5960
6121
|
end
|
5961
6122
|
|
@@ -6005,7 +6166,7 @@ module SyntaxTree
|
|
6005
6166
|
|
6006
6167
|
alias deconstruct child_nodes
|
6007
6168
|
|
6008
|
-
def deconstruct_keys(
|
6169
|
+
def deconstruct_keys(_keys)
|
6009
6170
|
{ target: target, value: value, location: location, comments: comments }
|
6010
6171
|
end
|
6011
6172
|
|
@@ -6052,7 +6213,7 @@ module SyntaxTree
|
|
6052
6213
|
|
6053
6214
|
alias deconstruct child_nodes
|
6054
6215
|
|
6055
|
-
def deconstruct_keys(
|
6216
|
+
def deconstruct_keys(_keys)
|
6056
6217
|
{ call: call, block: block, location: location, comments: comments }
|
6057
6218
|
end
|
6058
6219
|
|
@@ -6060,8 +6221,13 @@ module SyntaxTree
|
|
6060
6221
|
# If we're at the top of a call chain, then we're going to do some
|
6061
6222
|
# specialized printing in case we can print it nicely. We _only_ do this
|
6062
6223
|
# at the top of the chain to avoid weird recursion issues.
|
6063
|
-
if !CallChainFormatter.chained?(q.parent) &&
|
6064
|
-
|
6224
|
+
if !CallChainFormatter.chained?(q.parent) &&
|
6225
|
+
CallChainFormatter.chained?(call)
|
6226
|
+
q.group do
|
6227
|
+
q
|
6228
|
+
.if_break { CallChainFormatter.new(self).format(q) }
|
6229
|
+
.if_flat { format_contents(q) }
|
6230
|
+
end
|
6065
6231
|
else
|
6066
6232
|
format_contents(q)
|
6067
6233
|
end
|
@@ -6108,7 +6274,7 @@ module SyntaxTree
|
|
6108
6274
|
|
6109
6275
|
alias deconstruct child_nodes
|
6110
6276
|
|
6111
|
-
def deconstruct_keys(
|
6277
|
+
def deconstruct_keys(_keys)
|
6112
6278
|
{ parts: parts, location: location, comma: comma, comments: comments }
|
6113
6279
|
end
|
6114
6280
|
|
@@ -6152,7 +6318,7 @@ module SyntaxTree
|
|
6152
6318
|
|
6153
6319
|
alias deconstruct child_nodes
|
6154
6320
|
|
6155
|
-
def deconstruct_keys(
|
6321
|
+
def deconstruct_keys(_keys)
|
6156
6322
|
{ contents: contents, location: location, comments: comments }
|
6157
6323
|
end
|
6158
6324
|
|
@@ -6208,7 +6374,7 @@ module SyntaxTree
|
|
6208
6374
|
|
6209
6375
|
alias deconstruct child_nodes
|
6210
6376
|
|
6211
|
-
def deconstruct_keys(
|
6377
|
+
def deconstruct_keys(_keys)
|
6212
6378
|
{
|
6213
6379
|
constant: constant,
|
6214
6380
|
bodystmt: bodystmt,
|
@@ -6275,7 +6441,7 @@ module SyntaxTree
|
|
6275
6441
|
|
6276
6442
|
alias deconstruct child_nodes
|
6277
6443
|
|
6278
|
-
def deconstruct_keys(
|
6444
|
+
def deconstruct_keys(_keys)
|
6279
6445
|
{ parts: parts, location: location, comments: comments }
|
6280
6446
|
end
|
6281
6447
|
|
@@ -6324,7 +6490,7 @@ module SyntaxTree
|
|
6324
6490
|
|
6325
6491
|
alias deconstruct child_nodes
|
6326
6492
|
|
6327
|
-
def deconstruct_keys(
|
6493
|
+
def deconstruct_keys(_keys)
|
6328
6494
|
{ arguments: arguments, location: location, comments: comments }
|
6329
6495
|
end
|
6330
6496
|
|
@@ -6361,7 +6527,7 @@ module SyntaxTree
|
|
6361
6527
|
|
6362
6528
|
alias deconstruct child_nodes
|
6363
6529
|
|
6364
|
-
def deconstruct_keys(
|
6530
|
+
def deconstruct_keys(_keys)
|
6365
6531
|
{ value: value, location: location, comments: comments }
|
6366
6532
|
end
|
6367
6533
|
|
@@ -6407,7 +6573,7 @@ module SyntaxTree
|
|
6407
6573
|
|
6408
6574
|
alias deconstruct child_nodes
|
6409
6575
|
|
6410
|
-
def deconstruct_keys(
|
6576
|
+
def deconstruct_keys(_keys)
|
6411
6577
|
{
|
6412
6578
|
target: target,
|
6413
6579
|
operator: operator,
|
@@ -6475,7 +6641,16 @@ module SyntaxTree
|
|
6475
6641
|
# This approach maintains the nice conciseness of the inline version, while
|
6476
6642
|
# keeping the correct semantic meaning.
|
6477
6643
|
module Parentheses
|
6478
|
-
NODES = [
|
6644
|
+
NODES = [
|
6645
|
+
Args,
|
6646
|
+
Assign,
|
6647
|
+
Assoc,
|
6648
|
+
Binary,
|
6649
|
+
Call,
|
6650
|
+
Defined,
|
6651
|
+
MAssign,
|
6652
|
+
OpAssign
|
6653
|
+
].freeze
|
6479
6654
|
|
6480
6655
|
def self.flat(q)
|
6481
6656
|
return yield unless NODES.include?(q.parent.class)
|
@@ -6507,6 +6682,8 @@ module SyntaxTree
|
|
6507
6682
|
# def method(param) end
|
6508
6683
|
#
|
6509
6684
|
class Params < Node
|
6685
|
+
# Formats the optional position of the parameters. This includes the label,
|
6686
|
+
# as well as the default value.
|
6510
6687
|
class OptionalFormatter
|
6511
6688
|
# [Ident] the name of the parameter
|
6512
6689
|
attr_reader :name
|
@@ -6530,6 +6707,8 @@ module SyntaxTree
|
|
6530
6707
|
end
|
6531
6708
|
end
|
6532
6709
|
|
6710
|
+
# Formats the keyword position of the parameters. This includes the label,
|
6711
|
+
# as well as an optional default value.
|
6533
6712
|
class KeywordFormatter
|
6534
6713
|
# [Ident] the name of the parameter
|
6535
6714
|
attr_reader :name
|
@@ -6556,6 +6735,8 @@ module SyntaxTree
|
|
6556
6735
|
end
|
6557
6736
|
end
|
6558
6737
|
|
6738
|
+
# Formats the keyword_rest position of the parameters. This can be the **nil
|
6739
|
+
# syntax, the ... syntax, or the ** syntax.
|
6559
6740
|
class KeywordRestFormatter
|
6560
6741
|
# [:nil | ArgsForward | KwRestParam] the value of the parameter
|
6561
6742
|
attr_reader :value
|
@@ -6569,11 +6750,7 @@ module SyntaxTree
|
|
6569
6750
|
end
|
6570
6751
|
|
6571
6752
|
def format(q)
|
6572
|
-
|
6573
|
-
q.text("**nil")
|
6574
|
-
else
|
6575
|
-
q.format(value)
|
6576
|
-
end
|
6753
|
+
value == :nil ? q.text("**nil") : q.format(value)
|
6577
6754
|
end
|
6578
6755
|
end
|
6579
6756
|
|
@@ -6654,7 +6831,7 @@ module SyntaxTree
|
|
6654
6831
|
|
6655
6832
|
alias deconstruct child_nodes
|
6656
6833
|
|
6657
|
-
def deconstruct_keys(
|
6834
|
+
def deconstruct_keys(_keys)
|
6658
6835
|
{
|
6659
6836
|
location: location,
|
6660
6837
|
requireds: requireds,
|
@@ -6675,18 +6852,17 @@ module SyntaxTree
|
|
6675
6852
|
]
|
6676
6853
|
|
6677
6854
|
parts << rest if rest && !rest.is_a?(ExcessedComma)
|
6678
|
-
parts +=
|
6679
|
-
|
6680
|
-
|
6681
|
-
|
6682
|
-
]
|
6855
|
+
parts += [
|
6856
|
+
*posts,
|
6857
|
+
*keywords.map { |(name, value)| KeywordFormatter.new(name, value) }
|
6858
|
+
]
|
6683
6859
|
|
6684
6860
|
parts << KeywordRestFormatter.new(keyword_rest) if keyword_rest
|
6685
6861
|
parts << block if block
|
6686
6862
|
|
6687
6863
|
contents = -> do
|
6688
6864
|
q.seplist(parts) { |part| q.format(part) }
|
6689
|
-
q.format(rest) if rest
|
6865
|
+
q.format(rest) if rest.is_a?(ExcessedComma)
|
6690
6866
|
end
|
6691
6867
|
|
6692
6868
|
if ![Def, Defs, DefEndless].include?(q.parent.class) || parts.empty?
|
@@ -6736,7 +6912,7 @@ module SyntaxTree
|
|
6736
6912
|
|
6737
6913
|
alias deconstruct child_nodes
|
6738
6914
|
|
6739
|
-
def deconstruct_keys(
|
6915
|
+
def deconstruct_keys(_keys)
|
6740
6916
|
{
|
6741
6917
|
lparen: lparen,
|
6742
6918
|
contents: contents,
|
@@ -6787,7 +6963,7 @@ module SyntaxTree
|
|
6787
6963
|
|
6788
6964
|
alias deconstruct child_nodes
|
6789
6965
|
|
6790
|
-
def deconstruct_keys(
|
6966
|
+
def deconstruct_keys(_keys)
|
6791
6967
|
{ value: value, location: location, comments: comments }
|
6792
6968
|
end
|
6793
6969
|
|
@@ -6820,7 +6996,7 @@ module SyntaxTree
|
|
6820
6996
|
|
6821
6997
|
alias deconstruct child_nodes
|
6822
6998
|
|
6823
|
-
def deconstruct_keys(
|
6999
|
+
def deconstruct_keys(_keys)
|
6824
7000
|
{ statements: statements, location: location, comments: comments }
|
6825
7001
|
end
|
6826
7002
|
|
@@ -6865,7 +7041,7 @@ module SyntaxTree
|
|
6865
7041
|
|
6866
7042
|
alias deconstruct child_nodes
|
6867
7043
|
|
6868
|
-
def deconstruct_keys(
|
7044
|
+
def deconstruct_keys(_keys)
|
6869
7045
|
{
|
6870
7046
|
beginning: beginning,
|
6871
7047
|
elements: elements,
|
@@ -6920,18 +7096,9 @@ module SyntaxTree
|
|
6920
7096
|
|
6921
7097
|
alias deconstruct child_nodes
|
6922
7098
|
|
6923
|
-
def deconstruct_keys(
|
7099
|
+
def deconstruct_keys(_keys)
|
6924
7100
|
{ value: value, location: location }
|
6925
7101
|
end
|
6926
|
-
|
6927
|
-
def pretty_print(q)
|
6928
|
-
q.group(2, "(", ")") do
|
6929
|
-
q.text("qsymbols_beg")
|
6930
|
-
|
6931
|
-
q.breakable
|
6932
|
-
q.pp(value)
|
6933
|
-
end
|
6934
|
-
end
|
6935
7102
|
end
|
6936
7103
|
|
6937
7104
|
# QWords represents a string literal array without interpolation.
|
@@ -6965,7 +7132,7 @@ module SyntaxTree
|
|
6965
7132
|
|
6966
7133
|
alias deconstruct child_nodes
|
6967
7134
|
|
6968
|
-
def deconstruct_keys(
|
7135
|
+
def deconstruct_keys(_keys)
|
6969
7136
|
{
|
6970
7137
|
beginning: beginning,
|
6971
7138
|
elements: elements,
|
@@ -7020,7 +7187,7 @@ module SyntaxTree
|
|
7020
7187
|
|
7021
7188
|
alias deconstruct child_nodes
|
7022
7189
|
|
7023
|
-
def deconstruct_keys(
|
7190
|
+
def deconstruct_keys(_keys)
|
7024
7191
|
{ value: value, location: location }
|
7025
7192
|
end
|
7026
7193
|
end
|
@@ -7052,7 +7219,7 @@ module SyntaxTree
|
|
7052
7219
|
|
7053
7220
|
alias deconstruct child_nodes
|
7054
7221
|
|
7055
|
-
def deconstruct_keys(
|
7222
|
+
def deconstruct_keys(_keys)
|
7056
7223
|
{ value: value, location: location, comments: comments }
|
7057
7224
|
end
|
7058
7225
|
|
@@ -7081,7 +7248,7 @@ module SyntaxTree
|
|
7081
7248
|
|
7082
7249
|
alias deconstruct child_nodes
|
7083
7250
|
|
7084
|
-
def deconstruct_keys(
|
7251
|
+
def deconstruct_keys(_keys)
|
7085
7252
|
{ value: value, location: location }
|
7086
7253
|
end
|
7087
7254
|
end
|
@@ -7106,7 +7273,7 @@ module SyntaxTree
|
|
7106
7273
|
|
7107
7274
|
alias deconstruct child_nodes
|
7108
7275
|
|
7109
|
-
def deconstruct_keys(
|
7276
|
+
def deconstruct_keys(_keys)
|
7110
7277
|
{ value: value, location: location }
|
7111
7278
|
end
|
7112
7279
|
end
|
@@ -7138,7 +7305,7 @@ module SyntaxTree
|
|
7138
7305
|
|
7139
7306
|
alias deconstruct child_nodes
|
7140
7307
|
|
7141
|
-
def deconstruct_keys(
|
7308
|
+
def deconstruct_keys(_keys)
|
7142
7309
|
{ value: value, location: location, comments: comments }
|
7143
7310
|
end
|
7144
7311
|
|
@@ -7177,7 +7344,7 @@ module SyntaxTree
|
|
7177
7344
|
|
7178
7345
|
alias deconstruct child_nodes
|
7179
7346
|
|
7180
|
-
def deconstruct_keys(
|
7347
|
+
def deconstruct_keys(_keys)
|
7181
7348
|
{ beginning: beginning, parts: parts, location: location }
|
7182
7349
|
end
|
7183
7350
|
end
|
@@ -7210,7 +7377,7 @@ module SyntaxTree
|
|
7210
7377
|
|
7211
7378
|
alias deconstruct child_nodes
|
7212
7379
|
|
7213
|
-
def deconstruct_keys(
|
7380
|
+
def deconstruct_keys(_keys)
|
7214
7381
|
{ value: value, location: location }
|
7215
7382
|
end
|
7216
7383
|
end
|
@@ -7244,7 +7411,7 @@ module SyntaxTree
|
|
7244
7411
|
|
7245
7412
|
alias deconstruct child_nodes
|
7246
7413
|
|
7247
|
-
def deconstruct_keys(
|
7414
|
+
def deconstruct_keys(_keys)
|
7248
7415
|
{ value: value, location: location }
|
7249
7416
|
end
|
7250
7417
|
end
|
@@ -7285,10 +7452,11 @@ module SyntaxTree
|
|
7285
7452
|
|
7286
7453
|
alias deconstruct child_nodes
|
7287
7454
|
|
7288
|
-
def deconstruct_keys(
|
7455
|
+
def deconstruct_keys(_keys)
|
7289
7456
|
{
|
7290
7457
|
beginning: beginning,
|
7291
7458
|
ending: ending,
|
7459
|
+
options: options,
|
7292
7460
|
parts: parts,
|
7293
7461
|
location: location,
|
7294
7462
|
comments: comments
|
@@ -7296,7 +7464,7 @@ module SyntaxTree
|
|
7296
7464
|
end
|
7297
7465
|
|
7298
7466
|
def format(q)
|
7299
|
-
braces = ambiguous?(q) || include?(%r{
|
7467
|
+
braces = ambiguous?(q) || include?(%r{/})
|
7300
7468
|
|
7301
7469
|
if braces && include?(/[{}]/)
|
7302
7470
|
q.group do
|
@@ -7323,18 +7491,22 @@ module SyntaxTree
|
|
7323
7491
|
end
|
7324
7492
|
|
7325
7493
|
q.text("}")
|
7326
|
-
q.text(
|
7494
|
+
q.text(options)
|
7327
7495
|
end
|
7328
7496
|
else
|
7329
7497
|
q.group do
|
7330
7498
|
q.text("/")
|
7331
7499
|
q.format_each(parts)
|
7332
7500
|
q.text("/")
|
7333
|
-
q.text(
|
7501
|
+
q.text(options)
|
7334
7502
|
end
|
7335
7503
|
end
|
7336
7504
|
end
|
7337
7505
|
|
7506
|
+
def options
|
7507
|
+
ending[1..]
|
7508
|
+
end
|
7509
|
+
|
7338
7510
|
private
|
7339
7511
|
|
7340
7512
|
def include?(pattern)
|
@@ -7390,7 +7562,7 @@ module SyntaxTree
|
|
7390
7562
|
|
7391
7563
|
alias deconstruct child_nodes
|
7392
7564
|
|
7393
|
-
def deconstruct_keys(
|
7565
|
+
def deconstruct_keys(_keys)
|
7394
7566
|
{
|
7395
7567
|
exceptions: exceptions,
|
7396
7568
|
variable: variable,
|
@@ -7465,7 +7637,10 @@ module SyntaxTree
|
|
7465
7637
|
|
7466
7638
|
if consequent
|
7467
7639
|
consequent.bind_end(end_char, end_column)
|
7468
|
-
statements.bind_end(
|
7640
|
+
statements.bind_end(
|
7641
|
+
consequent.location.start_char,
|
7642
|
+
consequent.location.start_column
|
7643
|
+
)
|
7469
7644
|
else
|
7470
7645
|
statements.bind_end(end_char, end_column)
|
7471
7646
|
end
|
@@ -7481,7 +7656,7 @@ module SyntaxTree
|
|
7481
7656
|
|
7482
7657
|
alias deconstruct child_nodes
|
7483
7658
|
|
7484
|
-
def deconstruct_keys(
|
7659
|
+
def deconstruct_keys(_keys)
|
7485
7660
|
{
|
7486
7661
|
keyword: keyword,
|
7487
7662
|
exception: exception,
|
@@ -7548,7 +7723,7 @@ module SyntaxTree
|
|
7548
7723
|
|
7549
7724
|
alias deconstruct child_nodes
|
7550
7725
|
|
7551
|
-
def deconstruct_keys(
|
7726
|
+
def deconstruct_keys(_keys)
|
7552
7727
|
{
|
7553
7728
|
statement: statement,
|
7554
7729
|
value: value,
|
@@ -7602,7 +7777,7 @@ module SyntaxTree
|
|
7602
7777
|
|
7603
7778
|
alias deconstruct child_nodes
|
7604
7779
|
|
7605
|
-
def deconstruct_keys(
|
7780
|
+
def deconstruct_keys(_keys)
|
7606
7781
|
{ name: name, location: location, comments: comments }
|
7607
7782
|
end
|
7608
7783
|
|
@@ -7639,7 +7814,7 @@ module SyntaxTree
|
|
7639
7814
|
|
7640
7815
|
alias deconstruct child_nodes
|
7641
7816
|
|
7642
|
-
def deconstruct_keys(
|
7817
|
+
def deconstruct_keys(_keys)
|
7643
7818
|
{ value: value, location: location, comments: comments }
|
7644
7819
|
end
|
7645
7820
|
|
@@ -7675,7 +7850,7 @@ module SyntaxTree
|
|
7675
7850
|
|
7676
7851
|
alias deconstruct child_nodes
|
7677
7852
|
|
7678
|
-
def deconstruct_keys(
|
7853
|
+
def deconstruct_keys(_keys)
|
7679
7854
|
{ arguments: arguments, location: location, comments: comments }
|
7680
7855
|
end
|
7681
7856
|
|
@@ -7711,7 +7886,7 @@ module SyntaxTree
|
|
7711
7886
|
|
7712
7887
|
alias deconstruct child_nodes
|
7713
7888
|
|
7714
|
-
def deconstruct_keys(
|
7889
|
+
def deconstruct_keys(_keys)
|
7715
7890
|
{ value: value, location: location, comments: comments }
|
7716
7891
|
end
|
7717
7892
|
|
@@ -7740,7 +7915,7 @@ module SyntaxTree
|
|
7740
7915
|
|
7741
7916
|
alias deconstruct child_nodes
|
7742
7917
|
|
7743
|
-
def deconstruct_keys(
|
7918
|
+
def deconstruct_keys(_keys)
|
7744
7919
|
{ value: value, location: location }
|
7745
7920
|
end
|
7746
7921
|
end
|
@@ -7779,7 +7954,7 @@ module SyntaxTree
|
|
7779
7954
|
|
7780
7955
|
alias deconstruct child_nodes
|
7781
7956
|
|
7782
|
-
def deconstruct_keys(
|
7957
|
+
def deconstruct_keys(_keys)
|
7783
7958
|
{
|
7784
7959
|
target: target,
|
7785
7960
|
bodystmt: bodystmt,
|
@@ -7881,7 +8056,7 @@ module SyntaxTree
|
|
7881
8056
|
|
7882
8057
|
alias deconstruct child_nodes
|
7883
8058
|
|
7884
|
-
def deconstruct_keys(
|
8059
|
+
def deconstruct_keys(_keys)
|
7885
8060
|
{ parser: parser, body: body, location: location, comments: comments }
|
7886
8061
|
end
|
7887
8062
|
|
@@ -7951,12 +8126,19 @@ module SyntaxTree
|
|
7951
8126
|
comment = parser_comments[comment_index]
|
7952
8127
|
location = comment.location
|
7953
8128
|
|
7954
|
-
if !comment.inline? && (start_char <= location.start_char) &&
|
7955
|
-
|
8129
|
+
if !comment.inline? && (start_char <= location.start_char) &&
|
8130
|
+
(end_char >= location.end_char) && !comment.ignore?
|
8131
|
+
while (node = body[body_index]) &&
|
8132
|
+
(
|
8133
|
+
node.is_a?(VoidStmt) ||
|
8134
|
+
node.location.start_char < location.start_char
|
8135
|
+
)
|
7956
8136
|
body_index += 1
|
7957
8137
|
end
|
7958
8138
|
|
7959
|
-
if body_index != 0 &&
|
8139
|
+
if body_index != 0 &&
|
8140
|
+
body[body_index - 1].location.start_char < location.start_char &&
|
8141
|
+
body[body_index - 1].location.end_char > location.start_char
|
7960
8142
|
# The previous node entirely encapsules the comment, so we don't
|
7961
8143
|
# want to attach it here since it will get attached normally. This
|
7962
8144
|
# is mostly in the case of hash and array literals.
|
@@ -7996,7 +8178,7 @@ module SyntaxTree
|
|
7996
8178
|
|
7997
8179
|
alias deconstruct child_nodes
|
7998
8180
|
|
7999
|
-
def deconstruct_keys(
|
8181
|
+
def deconstruct_keys(_keys)
|
8000
8182
|
{ parts: parts, location: location }
|
8001
8183
|
end
|
8002
8184
|
end
|
@@ -8034,14 +8216,14 @@ module SyntaxTree
|
|
8034
8216
|
|
8035
8217
|
alias deconstruct child_nodes
|
8036
8218
|
|
8037
|
-
def deconstruct_keys(
|
8219
|
+
def deconstruct_keys(_keys)
|
8038
8220
|
{ left: left, right: right, location: location, comments: comments }
|
8039
8221
|
end
|
8040
8222
|
|
8041
8223
|
def format(q)
|
8042
8224
|
q.group do
|
8043
8225
|
q.format(left)
|
8044
|
-
q.text(
|
8226
|
+
q.text(" \\")
|
8045
8227
|
q.indent do
|
8046
8228
|
q.breakable(force: true)
|
8047
8229
|
q.format(right)
|
@@ -8079,7 +8261,7 @@ module SyntaxTree
|
|
8079
8261
|
|
8080
8262
|
alias deconstruct child_nodes
|
8081
8263
|
|
8082
|
-
def deconstruct_keys(
|
8264
|
+
def deconstruct_keys(_keys)
|
8083
8265
|
{ variable: variable, location: location, comments: comments }
|
8084
8266
|
end
|
8085
8267
|
|
@@ -8119,7 +8301,7 @@ module SyntaxTree
|
|
8119
8301
|
|
8120
8302
|
alias deconstruct child_nodes
|
8121
8303
|
|
8122
|
-
def deconstruct_keys(
|
8304
|
+
def deconstruct_keys(_keys)
|
8123
8305
|
{ statements: statements, location: location, comments: comments }
|
8124
8306
|
end
|
8125
8307
|
|
@@ -8177,7 +8359,7 @@ module SyntaxTree
|
|
8177
8359
|
|
8178
8360
|
alias deconstruct child_nodes
|
8179
8361
|
|
8180
|
-
def deconstruct_keys(
|
8362
|
+
def deconstruct_keys(_keys)
|
8181
8363
|
{ parts: parts, quote: quote, location: location, comments: comments }
|
8182
8364
|
end
|
8183
8365
|
|
@@ -8240,7 +8422,7 @@ module SyntaxTree
|
|
8240
8422
|
|
8241
8423
|
alias deconstruct child_nodes
|
8242
8424
|
|
8243
|
-
def deconstruct_keys(
|
8425
|
+
def deconstruct_keys(_keys)
|
8244
8426
|
{ arguments: arguments, location: location, comments: comments }
|
8245
8427
|
end
|
8246
8428
|
|
@@ -8293,7 +8475,7 @@ module SyntaxTree
|
|
8293
8475
|
|
8294
8476
|
alias deconstruct child_nodes
|
8295
8477
|
|
8296
|
-
def deconstruct_keys(
|
8478
|
+
def deconstruct_keys(_keys)
|
8297
8479
|
{ value: value, location: location }
|
8298
8480
|
end
|
8299
8481
|
end
|
@@ -8323,7 +8505,7 @@ module SyntaxTree
|
|
8323
8505
|
|
8324
8506
|
alias deconstruct child_nodes
|
8325
8507
|
|
8326
|
-
def deconstruct_keys(
|
8508
|
+
def deconstruct_keys(_keys)
|
8327
8509
|
{ value: value, location: location }
|
8328
8510
|
end
|
8329
8511
|
end
|
@@ -8357,7 +8539,7 @@ module SyntaxTree
|
|
8357
8539
|
|
8358
8540
|
alias deconstruct child_nodes
|
8359
8541
|
|
8360
|
-
def deconstruct_keys(
|
8542
|
+
def deconstruct_keys(_keys)
|
8361
8543
|
{ value: value, location: location, comments: comments }
|
8362
8544
|
end
|
8363
8545
|
|
@@ -8398,7 +8580,7 @@ module SyntaxTree
|
|
8398
8580
|
|
8399
8581
|
alias deconstruct child_nodes
|
8400
8582
|
|
8401
|
-
def deconstruct_keys(
|
8583
|
+
def deconstruct_keys(_keys)
|
8402
8584
|
{
|
8403
8585
|
beginning: beginning,
|
8404
8586
|
elements: elements,
|
@@ -8454,7 +8636,7 @@ module SyntaxTree
|
|
8454
8636
|
|
8455
8637
|
alias deconstruct child_nodes
|
8456
8638
|
|
8457
|
-
def deconstruct_keys(
|
8639
|
+
def deconstruct_keys(_keys)
|
8458
8640
|
{ value: value, location: location }
|
8459
8641
|
end
|
8460
8642
|
end
|
@@ -8483,7 +8665,7 @@ module SyntaxTree
|
|
8483
8665
|
|
8484
8666
|
alias deconstruct child_nodes
|
8485
8667
|
|
8486
|
-
def deconstruct_keys(
|
8668
|
+
def deconstruct_keys(_keys)
|
8487
8669
|
{ value: value, location: location }
|
8488
8670
|
end
|
8489
8671
|
end
|
@@ -8513,7 +8695,7 @@ module SyntaxTree
|
|
8513
8695
|
|
8514
8696
|
alias deconstruct child_nodes
|
8515
8697
|
|
8516
|
-
def deconstruct_keys(
|
8698
|
+
def deconstruct_keys(_keys)
|
8517
8699
|
{ value: value, location: location }
|
8518
8700
|
end
|
8519
8701
|
end
|
@@ -8547,7 +8729,7 @@ module SyntaxTree
|
|
8547
8729
|
|
8548
8730
|
alias deconstruct child_nodes
|
8549
8731
|
|
8550
|
-
def deconstruct_keys(
|
8732
|
+
def deconstruct_keys(_keys)
|
8551
8733
|
{ constant: constant, location: location, comments: comments }
|
8552
8734
|
end
|
8553
8735
|
|
@@ -8585,7 +8767,7 @@ module SyntaxTree
|
|
8585
8767
|
|
8586
8768
|
alias deconstruct child_nodes
|
8587
8769
|
|
8588
|
-
def deconstruct_keys(
|
8770
|
+
def deconstruct_keys(_keys)
|
8589
8771
|
{ constant: constant, location: location, comments: comments }
|
8590
8772
|
end
|
8591
8773
|
|
@@ -8624,7 +8806,7 @@ module SyntaxTree
|
|
8624
8806
|
|
8625
8807
|
alias deconstruct child_nodes
|
8626
8808
|
|
8627
|
-
def deconstruct_keys(
|
8809
|
+
def deconstruct_keys(_keys)
|
8628
8810
|
{ value: value, location: location }
|
8629
8811
|
end
|
8630
8812
|
end
|
@@ -8664,7 +8846,7 @@ module SyntaxTree
|
|
8664
8846
|
|
8665
8847
|
alias deconstruct child_nodes
|
8666
8848
|
|
8667
|
-
def deconstruct_keys(
|
8849
|
+
def deconstruct_keys(_keys)
|
8668
8850
|
{ value: value, location: location, comments: comments }
|
8669
8851
|
end
|
8670
8852
|
|
@@ -8702,7 +8884,7 @@ module SyntaxTree
|
|
8702
8884
|
|
8703
8885
|
alias deconstruct child_nodes
|
8704
8886
|
|
8705
|
-
def deconstruct_keys(
|
8887
|
+
def deconstruct_keys(_keys)
|
8706
8888
|
{ value: value, location: location }
|
8707
8889
|
end
|
8708
8890
|
end
|
@@ -8738,7 +8920,7 @@ module SyntaxTree
|
|
8738
8920
|
|
8739
8921
|
alias deconstruct child_nodes
|
8740
8922
|
|
8741
|
-
def deconstruct_keys(
|
8923
|
+
def deconstruct_keys(_keys)
|
8742
8924
|
{
|
8743
8925
|
statement: statement,
|
8744
8926
|
parentheses: parentheses,
|
@@ -8749,7 +8931,9 @@ module SyntaxTree
|
|
8749
8931
|
|
8750
8932
|
def format(q)
|
8751
8933
|
parent = q.parents.take(2)[1]
|
8752
|
-
ternary =
|
8934
|
+
ternary =
|
8935
|
+
(parent.is_a?(If) || parent.is_a?(Unless)) &&
|
8936
|
+
Ternaryable.call(q, parent)
|
8753
8937
|
|
8754
8938
|
q.text("not")
|
8755
8939
|
|
@@ -8803,7 +8987,7 @@ module SyntaxTree
|
|
8803
8987
|
|
8804
8988
|
alias deconstruct child_nodes
|
8805
8989
|
|
8806
|
-
def deconstruct_keys(
|
8990
|
+
def deconstruct_keys(_keys)
|
8807
8991
|
{
|
8808
8992
|
operator: operator,
|
8809
8993
|
statement: statement,
|
@@ -8823,6 +9007,9 @@ module SyntaxTree
|
|
8823
9007
|
# undef method
|
8824
9008
|
#
|
8825
9009
|
class Undef < Node
|
9010
|
+
# Undef accepts a variable number of arguments that can be either DynaSymbol
|
9011
|
+
# or SymbolLiteral objects. For SymbolLiteral objects we descend directly
|
9012
|
+
# into the value in order to have it come out as bare words.
|
8826
9013
|
class UndefArgumentFormatter
|
8827
9014
|
# [DynaSymbol | SymbolLiteral] the symbol to undefine
|
8828
9015
|
attr_reader :node
|
@@ -8866,7 +9053,7 @@ module SyntaxTree
|
|
8866
9053
|
|
8867
9054
|
alias deconstruct child_nodes
|
8868
9055
|
|
8869
|
-
def deconstruct_keys(
|
9056
|
+
def deconstruct_keys(_keys)
|
8870
9057
|
{ symbols: symbols, location: location, comments: comments }
|
8871
9058
|
end
|
8872
9059
|
|
@@ -8925,7 +9112,7 @@ module SyntaxTree
|
|
8925
9112
|
|
8926
9113
|
alias deconstruct child_nodes
|
8927
9114
|
|
8928
|
-
def deconstruct_keys(
|
9115
|
+
def deconstruct_keys(_keys)
|
8929
9116
|
{
|
8930
9117
|
predicate: predicate,
|
8931
9118
|
statements: statements,
|
@@ -8971,7 +9158,7 @@ module SyntaxTree
|
|
8971
9158
|
|
8972
9159
|
alias deconstruct child_nodes
|
8973
9160
|
|
8974
|
-
def deconstruct_keys(
|
9161
|
+
def deconstruct_keys(_keys)
|
8975
9162
|
{
|
8976
9163
|
statement: statement,
|
8977
9164
|
predicate: predicate,
|
@@ -9010,13 +9197,15 @@ module SyntaxTree
|
|
9010
9197
|
end
|
9011
9198
|
|
9012
9199
|
q.group do
|
9013
|
-
q
|
9014
|
-
|
9015
|
-
|
9016
|
-
|
9017
|
-
|
9200
|
+
q
|
9201
|
+
.if_break { format_break(q) }
|
9202
|
+
.if_flat do
|
9203
|
+
Parentheses.flat(q) do
|
9204
|
+
q.format(statements)
|
9205
|
+
q.text(" #{keyword} ")
|
9206
|
+
q.format(node.predicate)
|
9207
|
+
end
|
9018
9208
|
end
|
9019
|
-
end
|
9020
9209
|
end
|
9021
9210
|
end
|
9022
9211
|
|
@@ -9066,7 +9255,7 @@ module SyntaxTree
|
|
9066
9255
|
|
9067
9256
|
alias deconstruct child_nodes
|
9068
9257
|
|
9069
|
-
def deconstruct_keys(
|
9258
|
+
def deconstruct_keys(_keys)
|
9070
9259
|
{
|
9071
9260
|
predicate: predicate,
|
9072
9261
|
statements: statements,
|
@@ -9122,7 +9311,7 @@ module SyntaxTree
|
|
9122
9311
|
|
9123
9312
|
alias deconstruct child_nodes
|
9124
9313
|
|
9125
|
-
def deconstruct_keys(
|
9314
|
+
def deconstruct_keys(_keys)
|
9126
9315
|
{
|
9127
9316
|
statement: statement,
|
9128
9317
|
predicate: predicate,
|
@@ -9188,7 +9377,7 @@ module SyntaxTree
|
|
9188
9377
|
|
9189
9378
|
alias deconstruct child_nodes
|
9190
9379
|
|
9191
|
-
def deconstruct_keys(
|
9380
|
+
def deconstruct_keys(_keys)
|
9192
9381
|
{ left: left, right: right, location: location, comments: comments }
|
9193
9382
|
end
|
9194
9383
|
|
@@ -9231,7 +9420,7 @@ module SyntaxTree
|
|
9231
9420
|
|
9232
9421
|
alias deconstruct child_nodes
|
9233
9422
|
|
9234
|
-
def deconstruct_keys(
|
9423
|
+
def deconstruct_keys(_keys)
|
9235
9424
|
{ value: value, location: location, comments: comments }
|
9236
9425
|
end
|
9237
9426
|
|
@@ -9275,7 +9464,7 @@ module SyntaxTree
|
|
9275
9464
|
|
9276
9465
|
alias deconstruct child_nodes
|
9277
9466
|
|
9278
|
-
def deconstruct_keys(
|
9467
|
+
def deconstruct_keys(_keys)
|
9279
9468
|
{ value: value, location: location, comments: comments }
|
9280
9469
|
end
|
9281
9470
|
|
@@ -9316,7 +9505,7 @@ module SyntaxTree
|
|
9316
9505
|
|
9317
9506
|
alias deconstruct child_nodes
|
9318
9507
|
|
9319
|
-
def deconstruct_keys(
|
9508
|
+
def deconstruct_keys(_keys)
|
9320
9509
|
{ value: value, location: location, comments: comments }
|
9321
9510
|
end
|
9322
9511
|
|
@@ -9356,7 +9545,7 @@ module SyntaxTree
|
|
9356
9545
|
|
9357
9546
|
alias deconstruct child_nodes
|
9358
9547
|
|
9359
|
-
def deconstruct_keys(
|
9548
|
+
def deconstruct_keys(_keys)
|
9360
9549
|
{ value: value, location: location, comments: comments }
|
9361
9550
|
end
|
9362
9551
|
|
@@ -9391,7 +9580,7 @@ module SyntaxTree
|
|
9391
9580
|
|
9392
9581
|
alias deconstruct child_nodes
|
9393
9582
|
|
9394
|
-
def deconstruct_keys(
|
9583
|
+
def deconstruct_keys(_keys)
|
9395
9584
|
{ location: location, comments: comments }
|
9396
9585
|
end
|
9397
9586
|
|
@@ -9442,7 +9631,7 @@ module SyntaxTree
|
|
9442
9631
|
|
9443
9632
|
alias deconstruct child_nodes
|
9444
9633
|
|
9445
|
-
def deconstruct_keys(
|
9634
|
+
def deconstruct_keys(_keys)
|
9446
9635
|
{
|
9447
9636
|
arguments: arguments,
|
9448
9637
|
statements: statements,
|
@@ -9523,7 +9712,7 @@ module SyntaxTree
|
|
9523
9712
|
|
9524
9713
|
alias deconstruct child_nodes
|
9525
9714
|
|
9526
|
-
def deconstruct_keys(
|
9715
|
+
def deconstruct_keys(_keys)
|
9527
9716
|
{
|
9528
9717
|
predicate: predicate,
|
9529
9718
|
statements: statements,
|
@@ -9579,7 +9768,7 @@ module SyntaxTree
|
|
9579
9768
|
|
9580
9769
|
alias deconstruct child_nodes
|
9581
9770
|
|
9582
|
-
def deconstruct_keys(
|
9771
|
+
def deconstruct_keys(_keys)
|
9583
9772
|
{
|
9584
9773
|
statement: statement,
|
9585
9774
|
predicate: predicate,
|
@@ -9648,7 +9837,7 @@ module SyntaxTree
|
|
9648
9837
|
|
9649
9838
|
alias deconstruct child_nodes
|
9650
9839
|
|
9651
|
-
def deconstruct_keys(
|
9840
|
+
def deconstruct_keys(_keys)
|
9652
9841
|
{ parts: parts, location: location, comments: comments }
|
9653
9842
|
end
|
9654
9843
|
|
@@ -9688,7 +9877,7 @@ module SyntaxTree
|
|
9688
9877
|
|
9689
9878
|
alias deconstruct child_nodes
|
9690
9879
|
|
9691
|
-
def deconstruct_keys(
|
9880
|
+
def deconstruct_keys(_keys)
|
9692
9881
|
{
|
9693
9882
|
beginning: beginning,
|
9694
9883
|
elements: elements,
|
@@ -9744,7 +9933,7 @@ module SyntaxTree
|
|
9744
9933
|
|
9745
9934
|
alias deconstruct child_nodes
|
9746
9935
|
|
9747
|
-
def deconstruct_keys(
|
9936
|
+
def deconstruct_keys(_keys)
|
9748
9937
|
{ value: value, location: location }
|
9749
9938
|
end
|
9750
9939
|
end
|
@@ -9773,7 +9962,7 @@ module SyntaxTree
|
|
9773
9962
|
|
9774
9963
|
alias deconstruct child_nodes
|
9775
9964
|
|
9776
|
-
def deconstruct_keys(
|
9965
|
+
def deconstruct_keys(_keys)
|
9777
9966
|
{ parts: parts, location: location }
|
9778
9967
|
end
|
9779
9968
|
end
|
@@ -9806,7 +9995,7 @@ module SyntaxTree
|
|
9806
9995
|
|
9807
9996
|
alias deconstruct child_nodes
|
9808
9997
|
|
9809
|
-
def deconstruct_keys(
|
9998
|
+
def deconstruct_keys(_keys)
|
9810
9999
|
{ parts: parts, location: location, comments: comments }
|
9811
10000
|
end
|
9812
10001
|
|
@@ -9844,7 +10033,7 @@ module SyntaxTree
|
|
9844
10033
|
|
9845
10034
|
alias deconstruct child_nodes
|
9846
10035
|
|
9847
|
-
def deconstruct_keys(
|
10036
|
+
def deconstruct_keys(_keys)
|
9848
10037
|
{ arguments: arguments, location: location, comments: comments }
|
9849
10038
|
end
|
9850
10039
|
|
@@ -9894,7 +10083,7 @@ module SyntaxTree
|
|
9894
10083
|
|
9895
10084
|
alias deconstruct child_nodes
|
9896
10085
|
|
9897
|
-
def deconstruct_keys(
|
10086
|
+
def deconstruct_keys(_keys)
|
9898
10087
|
{ value: value, location: location, comments: comments }
|
9899
10088
|
end
|
9900
10089
|
|
@@ -9930,7 +10119,7 @@ module SyntaxTree
|
|
9930
10119
|
|
9931
10120
|
alias deconstruct child_nodes
|
9932
10121
|
|
9933
|
-
def deconstruct_keys(
|
10122
|
+
def deconstruct_keys(_keys)
|
9934
10123
|
{ value: value, location: location, comments: comments }
|
9935
10124
|
end
|
9936
10125
|
|