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/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,
|
@@ -2899,6 +3003,7 @@ module SyntaxTree
|
|
2899
3003
|
q.text(" ")
|
2900
3004
|
yield
|
2901
3005
|
in Args[parts: [IfOp]]
|
3006
|
+
q.if_flat { q.text(" ") }
|
2902
3007
|
yield
|
2903
3008
|
in Args[parts: [Command => command]]
|
2904
3009
|
align(q, command, &block)
|
@@ -2956,7 +3061,7 @@ module SyntaxTree
|
|
2956
3061
|
|
2957
3062
|
alias deconstruct child_nodes
|
2958
3063
|
|
2959
|
-
def deconstruct_keys(
|
3064
|
+
def deconstruct_keys(_keys)
|
2960
3065
|
{
|
2961
3066
|
receiver: receiver,
|
2962
3067
|
operator: operator,
|
@@ -3078,7 +3183,7 @@ module SyntaxTree
|
|
3078
3183
|
end
|
3079
3184
|
|
3080
3185
|
def ignore?
|
3081
|
-
value[1
|
3186
|
+
value[1..].strip == "stree-ignore"
|
3082
3187
|
end
|
3083
3188
|
|
3084
3189
|
def comments
|
@@ -3095,7 +3200,7 @@ module SyntaxTree
|
|
3095
3200
|
|
3096
3201
|
alias deconstruct child_nodes
|
3097
3202
|
|
3098
|
-
def deconstruct_keys(
|
3203
|
+
def deconstruct_keys(_keys)
|
3099
3204
|
{ value: value, inline: inline, location: location }
|
3100
3205
|
end
|
3101
3206
|
|
@@ -3141,7 +3246,7 @@ module SyntaxTree
|
|
3141
3246
|
|
3142
3247
|
alias deconstruct child_nodes
|
3143
3248
|
|
3144
|
-
def deconstruct_keys(
|
3249
|
+
def deconstruct_keys(_keys)
|
3145
3250
|
{ value: value, location: location, comments: comments }
|
3146
3251
|
end
|
3147
3252
|
|
@@ -3183,7 +3288,7 @@ module SyntaxTree
|
|
3183
3288
|
|
3184
3289
|
alias deconstruct child_nodes
|
3185
3290
|
|
3186
|
-
def deconstruct_keys(
|
3291
|
+
def deconstruct_keys(_keys)
|
3187
3292
|
{
|
3188
3293
|
parent: parent,
|
3189
3294
|
constant: constant,
|
@@ -3230,7 +3335,7 @@ module SyntaxTree
|
|
3230
3335
|
|
3231
3336
|
alias deconstruct child_nodes
|
3232
3337
|
|
3233
|
-
def deconstruct_keys(
|
3338
|
+
def deconstruct_keys(_keys)
|
3234
3339
|
{
|
3235
3340
|
parent: parent,
|
3236
3341
|
constant: constant,
|
@@ -3275,7 +3380,7 @@ module SyntaxTree
|
|
3275
3380
|
|
3276
3381
|
alias deconstruct child_nodes
|
3277
3382
|
|
3278
|
-
def deconstruct_keys(
|
3383
|
+
def deconstruct_keys(_keys)
|
3279
3384
|
{ constant: constant, location: location, comments: comments }
|
3280
3385
|
end
|
3281
3386
|
|
@@ -3311,7 +3416,7 @@ module SyntaxTree
|
|
3311
3416
|
|
3312
3417
|
alias deconstruct child_nodes
|
3313
3418
|
|
3314
|
-
def deconstruct_keys(
|
3419
|
+
def deconstruct_keys(_keys)
|
3315
3420
|
{ value: value, location: location, comments: comments }
|
3316
3421
|
end
|
3317
3422
|
|
@@ -3355,7 +3460,7 @@ module SyntaxTree
|
|
3355
3460
|
|
3356
3461
|
alias deconstruct child_nodes
|
3357
3462
|
|
3358
|
-
def deconstruct_keys(
|
3463
|
+
def deconstruct_keys(_keys)
|
3359
3464
|
{
|
3360
3465
|
name: name,
|
3361
3466
|
params: params,
|
@@ -3440,7 +3545,7 @@ module SyntaxTree
|
|
3440
3545
|
|
3441
3546
|
alias deconstruct child_nodes
|
3442
3547
|
|
3443
|
-
def deconstruct_keys(
|
3548
|
+
def deconstruct_keys(_keys)
|
3444
3549
|
{
|
3445
3550
|
target: target,
|
3446
3551
|
operator: operator,
|
@@ -3508,7 +3613,7 @@ module SyntaxTree
|
|
3508
3613
|
|
3509
3614
|
alias deconstruct child_nodes
|
3510
3615
|
|
3511
|
-
def deconstruct_keys(
|
3616
|
+
def deconstruct_keys(_keys)
|
3512
3617
|
{ value: value, location: location, comments: comments }
|
3513
3618
|
end
|
3514
3619
|
|
@@ -3574,7 +3679,7 @@ module SyntaxTree
|
|
3574
3679
|
|
3575
3680
|
alias deconstruct child_nodes
|
3576
3681
|
|
3577
|
-
def deconstruct_keys(
|
3682
|
+
def deconstruct_keys(_keys)
|
3578
3683
|
{
|
3579
3684
|
target: target,
|
3580
3685
|
operator: operator,
|
@@ -3649,7 +3754,7 @@ module SyntaxTree
|
|
3649
3754
|
|
3650
3755
|
alias deconstruct child_nodes
|
3651
3756
|
|
3652
|
-
def deconstruct_keys(
|
3757
|
+
def deconstruct_keys(_keys)
|
3653
3758
|
{
|
3654
3759
|
keyword: keyword,
|
3655
3760
|
block_var: block_var,
|
@@ -3729,7 +3834,7 @@ module SyntaxTree
|
|
3729
3834
|
|
3730
3835
|
alias deconstruct child_nodes
|
3731
3836
|
|
3732
|
-
def deconstruct_keys(
|
3837
|
+
def deconstruct_keys(_keys)
|
3733
3838
|
{ left: left, right: right, location: location, comments: comments }
|
3734
3839
|
end
|
3735
3840
|
|
@@ -3777,7 +3882,7 @@ module SyntaxTree
|
|
3777
3882
|
|
3778
3883
|
alias deconstruct child_nodes
|
3779
3884
|
|
3780
|
-
def deconstruct_keys(
|
3885
|
+
def deconstruct_keys(_keys)
|
3781
3886
|
{ left: left, right: right, location: location, comments: comments }
|
3782
3887
|
end
|
3783
3888
|
|
@@ -3799,7 +3904,7 @@ module SyntaxTree
|
|
3799
3904
|
# quotes, then single quotes would deactivate it.)
|
3800
3905
|
def self.locked?(node)
|
3801
3906
|
node.parts.any? do |part|
|
3802
|
-
part.is_a?(TStringContent)
|
3907
|
+
!part.is_a?(TStringContent) || part.value.match?(/\\|#[@${]/)
|
3803
3908
|
end
|
3804
3909
|
end
|
3805
3910
|
|
@@ -3864,7 +3969,7 @@ module SyntaxTree
|
|
3864
3969
|
|
3865
3970
|
alias deconstruct child_nodes
|
3866
3971
|
|
3867
|
-
def deconstruct_keys(
|
3972
|
+
def deconstruct_keys(_keys)
|
3868
3973
|
{ parts: parts, quote: quote, location: location, comments: comments }
|
3869
3974
|
end
|
3870
3975
|
|
@@ -3905,9 +4010,14 @@ module SyntaxTree
|
|
3905
4010
|
matching = Quotes.matching(quote[2])
|
3906
4011
|
pattern = /[\n#{Regexp.escape(matching)}'"]/
|
3907
4012
|
|
3908
|
-
|
3909
|
-
|
3910
|
-
|
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
|
3911
4021
|
[quote, matching]
|
3912
4022
|
elsif Quotes.locked?(self)
|
3913
4023
|
["#{":" unless hash_key}'", "'"]
|
@@ -3916,7 +4026,7 @@ module SyntaxTree
|
|
3916
4026
|
end
|
3917
4027
|
elsif Quotes.locked?(self)
|
3918
4028
|
if quote.start_with?(":")
|
3919
|
-
[hash_key ? quote[1
|
4029
|
+
[hash_key ? quote[1..] : quote, quote[1..]]
|
3920
4030
|
else
|
3921
4031
|
[hash_key ? quote : ":#{quote}", quote]
|
3922
4032
|
end
|
@@ -3959,7 +4069,7 @@ module SyntaxTree
|
|
3959
4069
|
|
3960
4070
|
alias deconstruct child_nodes
|
3961
4071
|
|
3962
|
-
def deconstruct_keys(
|
4072
|
+
def deconstruct_keys(_keys)
|
3963
4073
|
{
|
3964
4074
|
keyword: keyword,
|
3965
4075
|
statements: statements,
|
@@ -4025,7 +4135,7 @@ module SyntaxTree
|
|
4025
4135
|
|
4026
4136
|
alias deconstruct child_nodes
|
4027
4137
|
|
4028
|
-
def deconstruct_keys(
|
4138
|
+
def deconstruct_keys(_keys)
|
4029
4139
|
{
|
4030
4140
|
predicate: predicate,
|
4031
4141
|
statements: statements,
|
@@ -4097,7 +4207,7 @@ module SyntaxTree
|
|
4097
4207
|
|
4098
4208
|
alias deconstruct child_nodes
|
4099
4209
|
|
4100
|
-
def deconstruct_keys(
|
4210
|
+
def deconstruct_keys(_keys)
|
4101
4211
|
{ value: value, location: location }
|
4102
4212
|
end
|
4103
4213
|
|
@@ -4132,7 +4242,7 @@ module SyntaxTree
|
|
4132
4242
|
|
4133
4243
|
alias deconstruct child_nodes
|
4134
4244
|
|
4135
|
-
def deconstruct_keys(
|
4245
|
+
def deconstruct_keys(_keys)
|
4136
4246
|
{ value: value, location: location }
|
4137
4247
|
end
|
4138
4248
|
end
|
@@ -4162,7 +4272,7 @@ module SyntaxTree
|
|
4162
4272
|
|
4163
4273
|
alias deconstruct child_nodes
|
4164
4274
|
|
4165
|
-
def deconstruct_keys(
|
4275
|
+
def deconstruct_keys(_keys)
|
4166
4276
|
{ value: value, location: location }
|
4167
4277
|
end
|
4168
4278
|
end
|
@@ -4194,7 +4304,7 @@ module SyntaxTree
|
|
4194
4304
|
|
4195
4305
|
alias deconstruct child_nodes
|
4196
4306
|
|
4197
|
-
def deconstruct_keys(
|
4307
|
+
def deconstruct_keys(_keys)
|
4198
4308
|
{ value: value, location: location }
|
4199
4309
|
end
|
4200
4310
|
end
|
@@ -4233,7 +4343,7 @@ module SyntaxTree
|
|
4233
4343
|
|
4234
4344
|
alias deconstruct child_nodes
|
4235
4345
|
|
4236
|
-
def deconstruct_keys(
|
4346
|
+
def deconstruct_keys(_keys)
|
4237
4347
|
{
|
4238
4348
|
keyword: keyword,
|
4239
4349
|
statements: statements,
|
@@ -4287,7 +4397,7 @@ module SyntaxTree
|
|
4287
4397
|
|
4288
4398
|
alias deconstruct child_nodes
|
4289
4399
|
|
4290
|
-
def deconstruct_keys(
|
4400
|
+
def deconstruct_keys(_keys)
|
4291
4401
|
{ value: value, location: location, comments: comments }
|
4292
4402
|
end
|
4293
4403
|
|
@@ -4330,7 +4440,7 @@ module SyntaxTree
|
|
4330
4440
|
|
4331
4441
|
alias deconstruct child_nodes
|
4332
4442
|
|
4333
|
-
def deconstruct_keys(
|
4443
|
+
def deconstruct_keys(_keys)
|
4334
4444
|
{
|
4335
4445
|
value: value,
|
4336
4446
|
arguments: arguments,
|
@@ -4342,7 +4452,8 @@ module SyntaxTree
|
|
4342
4452
|
def format(q)
|
4343
4453
|
q.format(value)
|
4344
4454
|
|
4345
|
-
if arguments.is_a?(ArgParen) && arguments.arguments.nil? &&
|
4455
|
+
if arguments.is_a?(ArgParen) && arguments.arguments.nil? &&
|
4456
|
+
!value.is_a?(Const)
|
4346
4457
|
# If you're using an explicit set of parentheses on something that looks
|
4347
4458
|
# like a constant, then we need to match that in order to maintain valid
|
4348
4459
|
# Ruby. For example, you could do something like Foo(), on which we
|
@@ -4389,7 +4500,7 @@ module SyntaxTree
|
|
4389
4500
|
|
4390
4501
|
alias deconstruct child_nodes
|
4391
4502
|
|
4392
|
-
def deconstruct_keys(
|
4503
|
+
def deconstruct_keys(_keys)
|
4393
4504
|
{
|
4394
4505
|
parent: parent,
|
4395
4506
|
operator: operator,
|
@@ -4435,7 +4546,7 @@ module SyntaxTree
|
|
4435
4546
|
|
4436
4547
|
alias deconstruct child_nodes
|
4437
4548
|
|
4438
|
-
def deconstruct_keys(
|
4549
|
+
def deconstruct_keys(_keys)
|
4439
4550
|
{ value: value, location: location, comments: comments }
|
4440
4551
|
end
|
4441
4552
|
|
@@ -4487,7 +4598,7 @@ module SyntaxTree
|
|
4487
4598
|
|
4488
4599
|
alias deconstruct child_nodes
|
4489
4600
|
|
4490
|
-
def deconstruct_keys(
|
4601
|
+
def deconstruct_keys(_keys)
|
4491
4602
|
{
|
4492
4603
|
constant: constant,
|
4493
4604
|
left: left,
|
@@ -4551,7 +4662,7 @@ module SyntaxTree
|
|
4551
4662
|
|
4552
4663
|
alias deconstruct child_nodes
|
4553
4664
|
|
4554
|
-
def deconstruct_keys(
|
4665
|
+
def deconstruct_keys(_keys)
|
4555
4666
|
{
|
4556
4667
|
index: index,
|
4557
4668
|
collection: collection,
|
@@ -4608,7 +4719,7 @@ module SyntaxTree
|
|
4608
4719
|
|
4609
4720
|
alias deconstruct child_nodes
|
4610
4721
|
|
4611
|
-
def deconstruct_keys(
|
4722
|
+
def deconstruct_keys(_keys)
|
4612
4723
|
{ value: value, location: location, comments: comments }
|
4613
4724
|
end
|
4614
4725
|
|
@@ -4622,6 +4733,9 @@ module SyntaxTree
|
|
4622
4733
|
# { key => value }
|
4623
4734
|
#
|
4624
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.
|
4625
4739
|
class EmptyWithCommentsFormatter
|
4626
4740
|
# [LBrace] the opening brace
|
4627
4741
|
attr_reader :lbrace
|
@@ -4671,7 +4785,7 @@ module SyntaxTree
|
|
4671
4785
|
|
4672
4786
|
alias deconstruct child_nodes
|
4673
4787
|
|
4674
|
-
def deconstruct_keys(
|
4788
|
+
def deconstruct_keys(_keys)
|
4675
4789
|
{ lbrace: lbrace, assocs: assocs, location: location, comments: comments }
|
4676
4790
|
end
|
4677
4791
|
|
@@ -4740,7 +4854,14 @@ module SyntaxTree
|
|
4740
4854
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
4741
4855
|
attr_reader :comments
|
4742
4856
|
|
4743
|
-
def initialize(
|
4857
|
+
def initialize(
|
4858
|
+
beginning:,
|
4859
|
+
ending: nil,
|
4860
|
+
dedent: 0,
|
4861
|
+
parts: [],
|
4862
|
+
location:,
|
4863
|
+
comments: []
|
4864
|
+
)
|
4744
4865
|
@beginning = beginning
|
4745
4866
|
@ending = ending
|
4746
4867
|
@dedent = dedent
|
@@ -4759,7 +4880,7 @@ module SyntaxTree
|
|
4759
4880
|
|
4760
4881
|
alias deconstruct child_nodes
|
4761
4882
|
|
4762
|
-
def deconstruct_keys(
|
4883
|
+
def deconstruct_keys(_keys)
|
4763
4884
|
{
|
4764
4885
|
beginning: beginning,
|
4765
4886
|
location: location,
|
@@ -4774,8 +4895,12 @@ module SyntaxTree
|
|
4774
4895
|
# prettyprint module. It's when you want to force a newline, but don't
|
4775
4896
|
# want to force the break parent.
|
4776
4897
|
breakable = -> do
|
4777
|
-
q.target <<
|
4778
|
-
|
4898
|
+
q.target << PrettyPrint::Breakable.new(
|
4899
|
+
" ",
|
4900
|
+
1,
|
4901
|
+
indent: false,
|
4902
|
+
force: true
|
4903
|
+
)
|
4779
4904
|
end
|
4780
4905
|
|
4781
4906
|
q.group do
|
@@ -4831,7 +4956,7 @@ module SyntaxTree
|
|
4831
4956
|
|
4832
4957
|
alias deconstruct child_nodes
|
4833
4958
|
|
4834
|
-
def deconstruct_keys(
|
4959
|
+
def deconstruct_keys(_keys)
|
4835
4960
|
{ value: value, location: location, comments: comments }
|
4836
4961
|
end
|
4837
4962
|
|
@@ -4848,6 +4973,7 @@ module SyntaxTree
|
|
4848
4973
|
# end
|
4849
4974
|
#
|
4850
4975
|
class HshPtn < Node
|
4976
|
+
# Formats a key-value pair in a hash pattern. The value is optional.
|
4851
4977
|
class KeywordFormatter
|
4852
4978
|
# [Label] the keyword being used
|
4853
4979
|
attr_reader :key
|
@@ -4874,6 +5000,7 @@ module SyntaxTree
|
|
4874
5000
|
end
|
4875
5001
|
end
|
4876
5002
|
|
5003
|
+
# Formats the optional double-splat from the pattern.
|
4877
5004
|
class KeywordRestFormatter
|
4878
5005
|
# [VarField] the parameter that matches the remaining keywords
|
4879
5006
|
attr_reader :keyword_rest
|
@@ -4923,7 +5050,7 @@ module SyntaxTree
|
|
4923
5050
|
|
4924
5051
|
alias deconstruct child_nodes
|
4925
5052
|
|
4926
|
-
def deconstruct_keys(
|
5053
|
+
def deconstruct_keys(_keys)
|
4927
5054
|
{
|
4928
5055
|
constant: constant,
|
4929
5056
|
keywords: keywords,
|
@@ -4937,36 +5064,64 @@ module SyntaxTree
|
|
4937
5064
|
parts = keywords.map { |(key, value)| KeywordFormatter.new(key, value) }
|
4938
5065
|
parts << KeywordRestFormatter.new(keyword_rest) if keyword_rest
|
4939
5066
|
|
5067
|
+
nested = PATTERNS.include?(q.parent.class)
|
4940
5068
|
contents = -> do
|
4941
5069
|
q.group { q.seplist(parts) { |part| q.format(part, stackable: false) } }
|
4942
5070
|
|
4943
5071
|
# If there isn't a constant, and there's a blank keyword_rest, then we
|
4944
5072
|
# have an plain ** that needs to have a `then` after it in order to
|
4945
5073
|
# parse correctly on the next parse.
|
4946
|
-
|
5074
|
+
if !constant && keyword_rest && keyword_rest.value.nil? && !nested
|
5075
|
+
q.text(" then")
|
5076
|
+
end
|
4947
5077
|
end
|
4948
5078
|
|
5079
|
+
# If there is a constant, we're going to format to have the constant name
|
5080
|
+
# first and then use brackets.
|
4949
5081
|
if constant
|
4950
|
-
q.
|
4951
|
-
|
5082
|
+
q.group do
|
5083
|
+
q.format(constant)
|
5084
|
+
q.text("[")
|
5085
|
+
q.indent do
|
5086
|
+
q.breakable("")
|
5087
|
+
contents.call
|
5088
|
+
end
|
5089
|
+
q.breakable("")
|
5090
|
+
q.text("]")
|
5091
|
+
end
|
4952
5092
|
return
|
4953
5093
|
end
|
4954
5094
|
|
5095
|
+
# If there's nothing at all, then we're going to use empty braces.
|
4955
5096
|
if parts.empty?
|
4956
5097
|
q.text("{}")
|
4957
|
-
|
4958
|
-
|
4959
|
-
|
4960
|
-
|
4961
|
-
|
5098
|
+
return
|
5099
|
+
end
|
5100
|
+
|
5101
|
+
# If there's only one pair, then we'll just print the contents provided
|
5102
|
+
# we're not inside another pattern.
|
5103
|
+
if !nested && parts.size == 1
|
4962
5104
|
contents.call
|
5105
|
+
return
|
5106
|
+
end
|
5107
|
+
|
5108
|
+
# Otherwise, we're going to always use braces to make it clear it's a hash
|
5109
|
+
# pattern.
|
5110
|
+
q.group do
|
5111
|
+
q.text("{")
|
5112
|
+
q.indent do
|
5113
|
+
q.breakable
|
5114
|
+
contents.call
|
5115
|
+
end
|
5116
|
+
q.breakable
|
5117
|
+
q.text("}")
|
4963
5118
|
end
|
4964
5119
|
end
|
4965
5120
|
end
|
4966
5121
|
|
4967
5122
|
# The list of nodes that represent patterns inside of pattern matching so that
|
4968
5123
|
# when a pattern is being printed it knows if it's nested.
|
4969
|
-
PATTERNS = [AryPtn, Binary, FndPtn, HshPtn, RAssign]
|
5124
|
+
PATTERNS = [AryPtn, Binary, FndPtn, HshPtn, RAssign].freeze
|
4970
5125
|
|
4971
5126
|
# Ident represents an identifier anywhere in code. It can represent a very
|
4972
5127
|
# large number of things, depending on where it is in the syntax tree.
|
@@ -4996,7 +5151,7 @@ module SyntaxTree
|
|
4996
5151
|
|
4997
5152
|
alias deconstruct child_nodes
|
4998
5153
|
|
4999
|
-
def deconstruct_keys(
|
5154
|
+
def deconstruct_keys(_keys)
|
5000
5155
|
{ value: value, location: location, comments: comments }
|
5001
5156
|
end
|
5002
5157
|
|
@@ -5013,7 +5168,7 @@ module SyntaxTree
|
|
5013
5168
|
def self.call(parent)
|
5014
5169
|
queue = [parent]
|
5015
5170
|
|
5016
|
-
while node = queue.shift
|
5171
|
+
while (node = queue.shift)
|
5017
5172
|
return true if [Assign, MAssign, OpAssign].include?(node.class)
|
5018
5173
|
queue += node.child_nodes
|
5019
5174
|
end
|
@@ -5040,9 +5195,12 @@ module SyntaxTree
|
|
5040
5195
|
else
|
5041
5196
|
# Otherwise, we're going to check the conditional for certain cases.
|
5042
5197
|
case node
|
5043
|
-
in
|
5198
|
+
in predicate: Assign | Command | CommandCall | MAssign | OpAssign
|
5044
5199
|
false
|
5045
|
-
in {
|
5200
|
+
in {
|
5201
|
+
statements: { body: [truthy] },
|
5202
|
+
consequent: Else[statements: { body: [falsy] }]
|
5203
|
+
}
|
5046
5204
|
ternaryable?(truthy) && ternaryable?(falsy)
|
5047
5205
|
else
|
5048
5206
|
false
|
@@ -5053,8 +5211,8 @@ module SyntaxTree
|
|
5053
5211
|
private
|
5054
5212
|
|
5055
5213
|
# Certain expressions cannot be reduced to a ternary without adding
|
5056
|
-
# parentheses around them. In this case we say they cannot be ternaried
|
5057
|
-
# default instead to breaking them into multiple lines.
|
5214
|
+
# parentheses around them. In this case we say they cannot be ternaried
|
5215
|
+
# and default instead to breaking them into multiple lines.
|
5058
5216
|
def ternaryable?(statement)
|
5059
5217
|
# This is a list of nodes that should not be allowed to be a part of a
|
5060
5218
|
# ternary clause.
|
@@ -5112,13 +5270,15 @@ module SyntaxTree
|
|
5112
5270
|
q.group { format_break(q, force: true) }
|
5113
5271
|
else
|
5114
5272
|
q.group do
|
5115
|
-
q
|
5116
|
-
|
5117
|
-
|
5118
|
-
|
5119
|
-
|
5273
|
+
q
|
5274
|
+
.if_break { format_break(q, force: false) }
|
5275
|
+
.if_flat do
|
5276
|
+
Parentheses.flat(q) do
|
5277
|
+
q.format(node.statements)
|
5278
|
+
q.text(" #{keyword} ")
|
5279
|
+
q.format(node.predicate)
|
5280
|
+
end
|
5120
5281
|
end
|
5121
|
-
end
|
5122
5282
|
end
|
5123
5283
|
end
|
5124
5284
|
end
|
@@ -5147,51 +5307,53 @@ module SyntaxTree
|
|
5147
5307
|
|
5148
5308
|
def format_ternary(q)
|
5149
5309
|
q.group do
|
5150
|
-
q
|
5151
|
-
|
5152
|
-
|
5153
|
-
|
5154
|
-
q.indent do
|
5155
|
-
q.breakable
|
5156
|
-
q.format(node.statements)
|
5157
|
-
end
|
5310
|
+
q
|
5311
|
+
.if_break do
|
5312
|
+
q.text("#{keyword} ")
|
5313
|
+
q.nest(keyword.length + 1) { q.format(node.predicate) }
|
5158
5314
|
|
5159
|
-
q.breakable
|
5160
|
-
q.group do
|
5161
|
-
q.format(node.consequent.keyword)
|
5162
5315
|
q.indent do
|
5163
|
-
|
5164
|
-
|
5165
|
-
# parent. If a break-parent shows up in the tree, then it's going
|
5166
|
-
# to force it all the way up to the tree, which is going to negate
|
5167
|
-
# the ternary. Maybe this should be an option in prettyprint? As
|
5168
|
-
# in force: :no_break_parent or something.
|
5169
|
-
q.target << PrettyPrint::Breakable.new(" ", 1, force: true)
|
5170
|
-
q.format(node.consequent.statements)
|
5316
|
+
q.breakable
|
5317
|
+
q.format(node.statements)
|
5171
5318
|
end
|
5172
|
-
end
|
5173
5319
|
|
5174
|
-
|
5175
|
-
|
5176
|
-
|
5177
|
-
|
5178
|
-
|
5179
|
-
|
5320
|
+
q.breakable
|
5321
|
+
q.group do
|
5322
|
+
q.format(node.consequent.keyword)
|
5323
|
+
q.indent do
|
5324
|
+
# This is a very special case of breakable where we want to
|
5325
|
+
# force it into the output but we _don't_ want to explicitly
|
5326
|
+
# break the parent. If a break-parent shows up in the tree, then
|
5327
|
+
# it's going to force it all the way up to the tree, which is
|
5328
|
+
# going to negate the ternary. Maybe this should be an option in
|
5329
|
+
# prettyprint? As in force: :no_break_parent or something.
|
5330
|
+
q.target << PrettyPrint::Breakable.new(" ", 1, force: true)
|
5331
|
+
q.format(node.consequent.statements)
|
5332
|
+
end
|
5333
|
+
end
|
5334
|
+
|
5335
|
+
q.breakable
|
5336
|
+
q.text("end")
|
5337
|
+
end
|
5338
|
+
.if_flat do
|
5339
|
+
Parentheses.flat(q) do
|
5340
|
+
q.format(node.predicate)
|
5341
|
+
q.text(" ? ")
|
5180
5342
|
|
5181
|
-
|
5182
|
-
|
5343
|
+
statements = [node.statements, node.consequent.statements]
|
5344
|
+
statements.reverse! if keyword == "unless"
|
5183
5345
|
|
5184
|
-
|
5185
|
-
|
5186
|
-
|
5346
|
+
q.format(statements[0])
|
5347
|
+
q.text(" : ")
|
5348
|
+
q.format(statements[1])
|
5349
|
+
end
|
5187
5350
|
end
|
5188
|
-
end
|
5189
5351
|
end
|
5190
5352
|
end
|
5191
5353
|
|
5192
5354
|
def contains_conditional?
|
5193
5355
|
case node
|
5194
|
-
in
|
5356
|
+
in statements: { body: [If | IfMod | IfOp | Unless | UnlessMod] }
|
5195
5357
|
true
|
5196
5358
|
else
|
5197
5359
|
false
|
@@ -5241,7 +5403,7 @@ module SyntaxTree
|
|
5241
5403
|
|
5242
5404
|
alias deconstruct child_nodes
|
5243
5405
|
|
5244
|
-
def deconstruct_keys(
|
5406
|
+
def deconstruct_keys(_keys)
|
5245
5407
|
{
|
5246
5408
|
predicate: predicate,
|
5247
5409
|
statements: statements,
|
@@ -5291,7 +5453,7 @@ module SyntaxTree
|
|
5291
5453
|
|
5292
5454
|
alias deconstruct child_nodes
|
5293
5455
|
|
5294
|
-
def deconstruct_keys(
|
5456
|
+
def deconstruct_keys(_keys)
|
5295
5457
|
{
|
5296
5458
|
predicate: predicate,
|
5297
5459
|
truthy: truthy,
|
@@ -5309,7 +5471,8 @@ module SyntaxTree
|
|
5309
5471
|
Yield0, ZSuper
|
5310
5472
|
]
|
5311
5473
|
|
5312
|
-
if q.parent.is_a?(Paren) || force_flat.include?(truthy.class) ||
|
5474
|
+
if q.parent.is_a?(Paren) || force_flat.include?(truthy.class) ||
|
5475
|
+
force_flat.include?(falsy.class)
|
5313
5476
|
q.group { format_flat(q) }
|
5314
5477
|
return
|
5315
5478
|
end
|
@@ -5429,7 +5592,7 @@ module SyntaxTree
|
|
5429
5592
|
|
5430
5593
|
alias deconstruct child_nodes
|
5431
5594
|
|
5432
|
-
def deconstruct_keys(
|
5595
|
+
def deconstruct_keys(_keys)
|
5433
5596
|
{
|
5434
5597
|
statement: statement,
|
5435
5598
|
predicate: predicate,
|
@@ -5470,7 +5633,7 @@ module SyntaxTree
|
|
5470
5633
|
|
5471
5634
|
alias deconstruct child_nodes
|
5472
5635
|
|
5473
|
-
def deconstruct_keys(
|
5636
|
+
def deconstruct_keys(_keys)
|
5474
5637
|
{ value: value, location: location, comments: comments }
|
5475
5638
|
end
|
5476
5639
|
|
@@ -5517,7 +5680,7 @@ module SyntaxTree
|
|
5517
5680
|
|
5518
5681
|
alias deconstruct child_nodes
|
5519
5682
|
|
5520
|
-
def deconstruct_keys(
|
5683
|
+
def deconstruct_keys(_keys)
|
5521
5684
|
{
|
5522
5685
|
pattern: pattern,
|
5523
5686
|
statements: statements,
|
@@ -5576,7 +5739,7 @@ module SyntaxTree
|
|
5576
5739
|
|
5577
5740
|
alias deconstruct child_nodes
|
5578
5741
|
|
5579
|
-
def deconstruct_keys(
|
5742
|
+
def deconstruct_keys(_keys)
|
5580
5743
|
{ value: value, location: location, comments: comments }
|
5581
5744
|
end
|
5582
5745
|
|
@@ -5586,7 +5749,7 @@ module SyntaxTree
|
|
5586
5749
|
# the values, then we're going to insert them every 3 characters
|
5587
5750
|
# starting from the right.
|
5588
5751
|
index = (value.length + 2) % 3
|
5589
|
-
q.text(" #{value}"[index
|
5752
|
+
q.text(" #{value}"[index..].scan(/.../).join("_").strip)
|
5590
5753
|
else
|
5591
5754
|
q.text(value)
|
5592
5755
|
end
|
@@ -5620,7 +5783,7 @@ module SyntaxTree
|
|
5620
5783
|
|
5621
5784
|
alias deconstruct child_nodes
|
5622
5785
|
|
5623
|
-
def deconstruct_keys(
|
5786
|
+
def deconstruct_keys(_keys)
|
5624
5787
|
{ value: value, location: location, comments: comments }
|
5625
5788
|
end
|
5626
5789
|
|
@@ -5665,7 +5828,7 @@ module SyntaxTree
|
|
5665
5828
|
|
5666
5829
|
alias deconstruct child_nodes
|
5667
5830
|
|
5668
|
-
def deconstruct_keys(
|
5831
|
+
def deconstruct_keys(_keys)
|
5669
5832
|
{ value: value, location: location, comments: comments }
|
5670
5833
|
end
|
5671
5834
|
|
@@ -5702,7 +5865,7 @@ module SyntaxTree
|
|
5702
5865
|
|
5703
5866
|
alias deconstruct child_nodes
|
5704
5867
|
|
5705
|
-
def deconstruct_keys(
|
5868
|
+
def deconstruct_keys(_keys)
|
5706
5869
|
{ name: name, location: location, comments: comments }
|
5707
5870
|
end
|
5708
5871
|
|
@@ -5748,7 +5911,7 @@ module SyntaxTree
|
|
5748
5911
|
|
5749
5912
|
alias deconstruct child_nodes
|
5750
5913
|
|
5751
|
-
def deconstruct_keys(
|
5914
|
+
def deconstruct_keys(_keys)
|
5752
5915
|
{ value: value, location: location, comments: comments }
|
5753
5916
|
end
|
5754
5917
|
|
@@ -5783,7 +5946,7 @@ module SyntaxTree
|
|
5783
5946
|
|
5784
5947
|
alias deconstruct child_nodes
|
5785
5948
|
|
5786
|
-
def deconstruct_keys(
|
5949
|
+
def deconstruct_keys(_keys)
|
5787
5950
|
{ value: value, location: location }
|
5788
5951
|
end
|
5789
5952
|
end
|
@@ -5819,7 +5982,7 @@ module SyntaxTree
|
|
5819
5982
|
|
5820
5983
|
alias deconstruct child_nodes
|
5821
5984
|
|
5822
|
-
def deconstruct_keys(
|
5985
|
+
def deconstruct_keys(_keys)
|
5823
5986
|
{
|
5824
5987
|
params: params,
|
5825
5988
|
statements: statements,
|
@@ -5841,25 +6004,27 @@ module SyntaxTree
|
|
5841
6004
|
end
|
5842
6005
|
|
5843
6006
|
q.text(" ")
|
5844
|
-
q
|
5845
|
-
|
5846
|
-
|
5847
|
-
|
6007
|
+
q
|
6008
|
+
.if_break do
|
6009
|
+
force_parens =
|
6010
|
+
q.parents.any? do |node|
|
6011
|
+
node.is_a?(Command) || node.is_a?(CommandCall)
|
6012
|
+
end
|
6013
|
+
|
6014
|
+
q.text(force_parens ? "{" : "do")
|
6015
|
+
q.indent do
|
6016
|
+
q.breakable
|
6017
|
+
q.format(statements)
|
5848
6018
|
end
|
5849
6019
|
|
5850
|
-
q.text(force_parens ? "{" : "do")
|
5851
|
-
q.indent do
|
5852
6020
|
q.breakable
|
6021
|
+
q.text(force_parens ? "}" : "end")
|
6022
|
+
end
|
6023
|
+
.if_flat do
|
6024
|
+
q.text("{ ")
|
5853
6025
|
q.format(statements)
|
6026
|
+
q.text(" }")
|
5854
6027
|
end
|
5855
|
-
|
5856
|
-
q.breakable
|
5857
|
-
q.text(force_parens ? "}" : "end")
|
5858
|
-
end.if_flat do
|
5859
|
-
q.text("{ ")
|
5860
|
-
q.format(statements)
|
5861
|
-
q.text(" }")
|
5862
|
-
end
|
5863
6028
|
end
|
5864
6029
|
end
|
5865
6030
|
end
|
@@ -5888,7 +6053,7 @@ module SyntaxTree
|
|
5888
6053
|
|
5889
6054
|
alias deconstruct child_nodes
|
5890
6055
|
|
5891
|
-
def deconstruct_keys(
|
6056
|
+
def deconstruct_keys(_keys)
|
5892
6057
|
{ value: value, location: location, comments: comments }
|
5893
6058
|
end
|
5894
6059
|
|
@@ -5921,7 +6086,7 @@ module SyntaxTree
|
|
5921
6086
|
|
5922
6087
|
alias deconstruct child_nodes
|
5923
6088
|
|
5924
|
-
def deconstruct_keys(
|
6089
|
+
def deconstruct_keys(_keys)
|
5925
6090
|
{ value: value, location: location, comments: comments }
|
5926
6091
|
end
|
5927
6092
|
|
@@ -5954,7 +6119,7 @@ module SyntaxTree
|
|
5954
6119
|
|
5955
6120
|
alias deconstruct child_nodes
|
5956
6121
|
|
5957
|
-
def deconstruct_keys(
|
6122
|
+
def deconstruct_keys(_keys)
|
5958
6123
|
{ value: value, location: location, comments: comments }
|
5959
6124
|
end
|
5960
6125
|
|
@@ -6004,7 +6169,7 @@ module SyntaxTree
|
|
6004
6169
|
|
6005
6170
|
alias deconstruct child_nodes
|
6006
6171
|
|
6007
|
-
def deconstruct_keys(
|
6172
|
+
def deconstruct_keys(_keys)
|
6008
6173
|
{ target: target, value: value, location: location, comments: comments }
|
6009
6174
|
end
|
6010
6175
|
|
@@ -6051,7 +6216,7 @@ module SyntaxTree
|
|
6051
6216
|
|
6052
6217
|
alias deconstruct child_nodes
|
6053
6218
|
|
6054
|
-
def deconstruct_keys(
|
6219
|
+
def deconstruct_keys(_keys)
|
6055
6220
|
{ call: call, block: block, location: location, comments: comments }
|
6056
6221
|
end
|
6057
6222
|
|
@@ -6059,8 +6224,13 @@ module SyntaxTree
|
|
6059
6224
|
# If we're at the top of a call chain, then we're going to do some
|
6060
6225
|
# specialized printing in case we can print it nicely. We _only_ do this
|
6061
6226
|
# at the top of the chain to avoid weird recursion issues.
|
6062
|
-
if !CallChainFormatter.chained?(q.parent) &&
|
6063
|
-
|
6227
|
+
if !CallChainFormatter.chained?(q.parent) &&
|
6228
|
+
CallChainFormatter.chained?(call)
|
6229
|
+
q.group do
|
6230
|
+
q
|
6231
|
+
.if_break { CallChainFormatter.new(self).format(q) }
|
6232
|
+
.if_flat { format_contents(q) }
|
6233
|
+
end
|
6064
6234
|
else
|
6065
6235
|
format_contents(q)
|
6066
6236
|
end
|
@@ -6107,7 +6277,7 @@ module SyntaxTree
|
|
6107
6277
|
|
6108
6278
|
alias deconstruct child_nodes
|
6109
6279
|
|
6110
|
-
def deconstruct_keys(
|
6280
|
+
def deconstruct_keys(_keys)
|
6111
6281
|
{ parts: parts, location: location, comma: comma, comments: comments }
|
6112
6282
|
end
|
6113
6283
|
|
@@ -6151,7 +6321,7 @@ module SyntaxTree
|
|
6151
6321
|
|
6152
6322
|
alias deconstruct child_nodes
|
6153
6323
|
|
6154
|
-
def deconstruct_keys(
|
6324
|
+
def deconstruct_keys(_keys)
|
6155
6325
|
{ contents: contents, location: location, comments: comments }
|
6156
6326
|
end
|
6157
6327
|
|
@@ -6207,7 +6377,7 @@ module SyntaxTree
|
|
6207
6377
|
|
6208
6378
|
alias deconstruct child_nodes
|
6209
6379
|
|
6210
|
-
def deconstruct_keys(
|
6380
|
+
def deconstruct_keys(_keys)
|
6211
6381
|
{
|
6212
6382
|
constant: constant,
|
6213
6383
|
bodystmt: bodystmt,
|
@@ -6274,7 +6444,7 @@ module SyntaxTree
|
|
6274
6444
|
|
6275
6445
|
alias deconstruct child_nodes
|
6276
6446
|
|
6277
|
-
def deconstruct_keys(
|
6447
|
+
def deconstruct_keys(_keys)
|
6278
6448
|
{ parts: parts, location: location, comments: comments }
|
6279
6449
|
end
|
6280
6450
|
|
@@ -6323,7 +6493,7 @@ module SyntaxTree
|
|
6323
6493
|
|
6324
6494
|
alias deconstruct child_nodes
|
6325
6495
|
|
6326
|
-
def deconstruct_keys(
|
6496
|
+
def deconstruct_keys(_keys)
|
6327
6497
|
{ arguments: arguments, location: location, comments: comments }
|
6328
6498
|
end
|
6329
6499
|
|
@@ -6360,7 +6530,7 @@ module SyntaxTree
|
|
6360
6530
|
|
6361
6531
|
alias deconstruct child_nodes
|
6362
6532
|
|
6363
|
-
def deconstruct_keys(
|
6533
|
+
def deconstruct_keys(_keys)
|
6364
6534
|
{ value: value, location: location, comments: comments }
|
6365
6535
|
end
|
6366
6536
|
|
@@ -6406,7 +6576,7 @@ module SyntaxTree
|
|
6406
6576
|
|
6407
6577
|
alias deconstruct child_nodes
|
6408
6578
|
|
6409
|
-
def deconstruct_keys(
|
6579
|
+
def deconstruct_keys(_keys)
|
6410
6580
|
{
|
6411
6581
|
target: target,
|
6412
6582
|
operator: operator,
|
@@ -6474,7 +6644,16 @@ module SyntaxTree
|
|
6474
6644
|
# This approach maintains the nice conciseness of the inline version, while
|
6475
6645
|
# keeping the correct semantic meaning.
|
6476
6646
|
module Parentheses
|
6477
|
-
NODES = [
|
6647
|
+
NODES = [
|
6648
|
+
Args,
|
6649
|
+
Assign,
|
6650
|
+
Assoc,
|
6651
|
+
Binary,
|
6652
|
+
Call,
|
6653
|
+
Defined,
|
6654
|
+
MAssign,
|
6655
|
+
OpAssign
|
6656
|
+
].freeze
|
6478
6657
|
|
6479
6658
|
def self.flat(q)
|
6480
6659
|
return yield unless NODES.include?(q.parent.class)
|
@@ -6506,6 +6685,8 @@ module SyntaxTree
|
|
6506
6685
|
# def method(param) end
|
6507
6686
|
#
|
6508
6687
|
class Params < Node
|
6688
|
+
# Formats the optional position of the parameters. This includes the label,
|
6689
|
+
# as well as the default value.
|
6509
6690
|
class OptionalFormatter
|
6510
6691
|
# [Ident] the name of the parameter
|
6511
6692
|
attr_reader :name
|
@@ -6529,6 +6710,8 @@ module SyntaxTree
|
|
6529
6710
|
end
|
6530
6711
|
end
|
6531
6712
|
|
6713
|
+
# Formats the keyword position of the parameters. This includes the label,
|
6714
|
+
# as well as an optional default value.
|
6532
6715
|
class KeywordFormatter
|
6533
6716
|
# [Ident] the name of the parameter
|
6534
6717
|
attr_reader :name
|
@@ -6555,6 +6738,8 @@ module SyntaxTree
|
|
6555
6738
|
end
|
6556
6739
|
end
|
6557
6740
|
|
6741
|
+
# Formats the keyword_rest position of the parameters. This can be the **nil
|
6742
|
+
# syntax, the ... syntax, or the ** syntax.
|
6558
6743
|
class KeywordRestFormatter
|
6559
6744
|
# [:nil | ArgsForward | KwRestParam] the value of the parameter
|
6560
6745
|
attr_reader :value
|
@@ -6568,11 +6753,7 @@ module SyntaxTree
|
|
6568
6753
|
end
|
6569
6754
|
|
6570
6755
|
def format(q)
|
6571
|
-
|
6572
|
-
q.text("**nil")
|
6573
|
-
else
|
6574
|
-
q.format(value)
|
6575
|
-
end
|
6756
|
+
value == :nil ? q.text("**nil") : q.format(value)
|
6576
6757
|
end
|
6577
6758
|
end
|
6578
6759
|
|
@@ -6653,7 +6834,7 @@ module SyntaxTree
|
|
6653
6834
|
|
6654
6835
|
alias deconstruct child_nodes
|
6655
6836
|
|
6656
|
-
def deconstruct_keys(
|
6837
|
+
def deconstruct_keys(_keys)
|
6657
6838
|
{
|
6658
6839
|
location: location,
|
6659
6840
|
requireds: requireds,
|
@@ -6674,18 +6855,17 @@ module SyntaxTree
|
|
6674
6855
|
]
|
6675
6856
|
|
6676
6857
|
parts << rest if rest && !rest.is_a?(ExcessedComma)
|
6677
|
-
parts +=
|
6678
|
-
|
6679
|
-
|
6680
|
-
|
6681
|
-
]
|
6858
|
+
parts += [
|
6859
|
+
*posts,
|
6860
|
+
*keywords.map { |(name, value)| KeywordFormatter.new(name, value) }
|
6861
|
+
]
|
6682
6862
|
|
6683
6863
|
parts << KeywordRestFormatter.new(keyword_rest) if keyword_rest
|
6684
6864
|
parts << block if block
|
6685
6865
|
|
6686
6866
|
contents = -> do
|
6687
6867
|
q.seplist(parts) { |part| q.format(part) }
|
6688
|
-
q.format(rest) if rest
|
6868
|
+
q.format(rest) if rest.is_a?(ExcessedComma)
|
6689
6869
|
end
|
6690
6870
|
|
6691
6871
|
if ![Def, Defs, DefEndless].include?(q.parent.class) || parts.empty?
|
@@ -6735,7 +6915,7 @@ module SyntaxTree
|
|
6735
6915
|
|
6736
6916
|
alias deconstruct child_nodes
|
6737
6917
|
|
6738
|
-
def deconstruct_keys(
|
6918
|
+
def deconstruct_keys(_keys)
|
6739
6919
|
{
|
6740
6920
|
lparen: lparen,
|
6741
6921
|
contents: contents,
|
@@ -6786,7 +6966,7 @@ module SyntaxTree
|
|
6786
6966
|
|
6787
6967
|
alias deconstruct child_nodes
|
6788
6968
|
|
6789
|
-
def deconstruct_keys(
|
6969
|
+
def deconstruct_keys(_keys)
|
6790
6970
|
{ value: value, location: location, comments: comments }
|
6791
6971
|
end
|
6792
6972
|
|
@@ -6819,7 +6999,7 @@ module SyntaxTree
|
|
6819
6999
|
|
6820
7000
|
alias deconstruct child_nodes
|
6821
7001
|
|
6822
|
-
def deconstruct_keys(
|
7002
|
+
def deconstruct_keys(_keys)
|
6823
7003
|
{ statements: statements, location: location, comments: comments }
|
6824
7004
|
end
|
6825
7005
|
|
@@ -6864,7 +7044,7 @@ module SyntaxTree
|
|
6864
7044
|
|
6865
7045
|
alias deconstruct child_nodes
|
6866
7046
|
|
6867
|
-
def deconstruct_keys(
|
7047
|
+
def deconstruct_keys(_keys)
|
6868
7048
|
{
|
6869
7049
|
beginning: beginning,
|
6870
7050
|
elements: elements,
|
@@ -6919,18 +7099,9 @@ module SyntaxTree
|
|
6919
7099
|
|
6920
7100
|
alias deconstruct child_nodes
|
6921
7101
|
|
6922
|
-
def deconstruct_keys(
|
7102
|
+
def deconstruct_keys(_keys)
|
6923
7103
|
{ value: value, location: location }
|
6924
7104
|
end
|
6925
|
-
|
6926
|
-
def pretty_print(q)
|
6927
|
-
q.group(2, "(", ")") do
|
6928
|
-
q.text("qsymbols_beg")
|
6929
|
-
|
6930
|
-
q.breakable
|
6931
|
-
q.pp(value)
|
6932
|
-
end
|
6933
|
-
end
|
6934
7105
|
end
|
6935
7106
|
|
6936
7107
|
# QWords represents a string literal array without interpolation.
|
@@ -6964,7 +7135,7 @@ module SyntaxTree
|
|
6964
7135
|
|
6965
7136
|
alias deconstruct child_nodes
|
6966
7137
|
|
6967
|
-
def deconstruct_keys(
|
7138
|
+
def deconstruct_keys(_keys)
|
6968
7139
|
{
|
6969
7140
|
beginning: beginning,
|
6970
7141
|
elements: elements,
|
@@ -7019,7 +7190,7 @@ module SyntaxTree
|
|
7019
7190
|
|
7020
7191
|
alias deconstruct child_nodes
|
7021
7192
|
|
7022
|
-
def deconstruct_keys(
|
7193
|
+
def deconstruct_keys(_keys)
|
7023
7194
|
{ value: value, location: location }
|
7024
7195
|
end
|
7025
7196
|
end
|
@@ -7051,7 +7222,7 @@ module SyntaxTree
|
|
7051
7222
|
|
7052
7223
|
alias deconstruct child_nodes
|
7053
7224
|
|
7054
|
-
def deconstruct_keys(
|
7225
|
+
def deconstruct_keys(_keys)
|
7055
7226
|
{ value: value, location: location, comments: comments }
|
7056
7227
|
end
|
7057
7228
|
|
@@ -7080,7 +7251,7 @@ module SyntaxTree
|
|
7080
7251
|
|
7081
7252
|
alias deconstruct child_nodes
|
7082
7253
|
|
7083
|
-
def deconstruct_keys(
|
7254
|
+
def deconstruct_keys(_keys)
|
7084
7255
|
{ value: value, location: location }
|
7085
7256
|
end
|
7086
7257
|
end
|
@@ -7105,7 +7276,7 @@ module SyntaxTree
|
|
7105
7276
|
|
7106
7277
|
alias deconstruct child_nodes
|
7107
7278
|
|
7108
|
-
def deconstruct_keys(
|
7279
|
+
def deconstruct_keys(_keys)
|
7109
7280
|
{ value: value, location: location }
|
7110
7281
|
end
|
7111
7282
|
end
|
@@ -7137,7 +7308,7 @@ module SyntaxTree
|
|
7137
7308
|
|
7138
7309
|
alias deconstruct child_nodes
|
7139
7310
|
|
7140
|
-
def deconstruct_keys(
|
7311
|
+
def deconstruct_keys(_keys)
|
7141
7312
|
{ value: value, location: location, comments: comments }
|
7142
7313
|
end
|
7143
7314
|
|
@@ -7176,7 +7347,7 @@ module SyntaxTree
|
|
7176
7347
|
|
7177
7348
|
alias deconstruct child_nodes
|
7178
7349
|
|
7179
|
-
def deconstruct_keys(
|
7350
|
+
def deconstruct_keys(_keys)
|
7180
7351
|
{ beginning: beginning, parts: parts, location: location }
|
7181
7352
|
end
|
7182
7353
|
end
|
@@ -7209,7 +7380,7 @@ module SyntaxTree
|
|
7209
7380
|
|
7210
7381
|
alias deconstruct child_nodes
|
7211
7382
|
|
7212
|
-
def deconstruct_keys(
|
7383
|
+
def deconstruct_keys(_keys)
|
7213
7384
|
{ value: value, location: location }
|
7214
7385
|
end
|
7215
7386
|
end
|
@@ -7243,7 +7414,7 @@ module SyntaxTree
|
|
7243
7414
|
|
7244
7415
|
alias deconstruct child_nodes
|
7245
7416
|
|
7246
|
-
def deconstruct_keys(
|
7417
|
+
def deconstruct_keys(_keys)
|
7247
7418
|
{ value: value, location: location }
|
7248
7419
|
end
|
7249
7420
|
end
|
@@ -7284,10 +7455,11 @@ module SyntaxTree
|
|
7284
7455
|
|
7285
7456
|
alias deconstruct child_nodes
|
7286
7457
|
|
7287
|
-
def deconstruct_keys(
|
7458
|
+
def deconstruct_keys(_keys)
|
7288
7459
|
{
|
7289
7460
|
beginning: beginning,
|
7290
7461
|
ending: ending,
|
7462
|
+
options: options,
|
7291
7463
|
parts: parts,
|
7292
7464
|
location: location,
|
7293
7465
|
comments: comments
|
@@ -7295,7 +7467,7 @@ module SyntaxTree
|
|
7295
7467
|
end
|
7296
7468
|
|
7297
7469
|
def format(q)
|
7298
|
-
braces = ambiguous?(q) || include?(%r{
|
7470
|
+
braces = ambiguous?(q) || include?(%r{/})
|
7299
7471
|
|
7300
7472
|
if braces && include?(/[{}]/)
|
7301
7473
|
q.group do
|
@@ -7322,18 +7494,22 @@ module SyntaxTree
|
|
7322
7494
|
end
|
7323
7495
|
|
7324
7496
|
q.text("}")
|
7325
|
-
q.text(
|
7497
|
+
q.text(options)
|
7326
7498
|
end
|
7327
7499
|
else
|
7328
7500
|
q.group do
|
7329
7501
|
q.text("/")
|
7330
7502
|
q.format_each(parts)
|
7331
7503
|
q.text("/")
|
7332
|
-
q.text(
|
7504
|
+
q.text(options)
|
7333
7505
|
end
|
7334
7506
|
end
|
7335
7507
|
end
|
7336
7508
|
|
7509
|
+
def options
|
7510
|
+
ending[1..]
|
7511
|
+
end
|
7512
|
+
|
7337
7513
|
private
|
7338
7514
|
|
7339
7515
|
def include?(pattern)
|
@@ -7389,7 +7565,7 @@ module SyntaxTree
|
|
7389
7565
|
|
7390
7566
|
alias deconstruct child_nodes
|
7391
7567
|
|
7392
|
-
def deconstruct_keys(
|
7568
|
+
def deconstruct_keys(_keys)
|
7393
7569
|
{
|
7394
7570
|
exceptions: exceptions,
|
7395
7571
|
variable: variable,
|
@@ -7464,7 +7640,10 @@ module SyntaxTree
|
|
7464
7640
|
|
7465
7641
|
if consequent
|
7466
7642
|
consequent.bind_end(end_char, end_column)
|
7467
|
-
statements.bind_end(
|
7643
|
+
statements.bind_end(
|
7644
|
+
consequent.location.start_char,
|
7645
|
+
consequent.location.start_column
|
7646
|
+
)
|
7468
7647
|
else
|
7469
7648
|
statements.bind_end(end_char, end_column)
|
7470
7649
|
end
|
@@ -7480,7 +7659,7 @@ module SyntaxTree
|
|
7480
7659
|
|
7481
7660
|
alias deconstruct child_nodes
|
7482
7661
|
|
7483
|
-
def deconstruct_keys(
|
7662
|
+
def deconstruct_keys(_keys)
|
7484
7663
|
{
|
7485
7664
|
keyword: keyword,
|
7486
7665
|
exception: exception,
|
@@ -7547,7 +7726,7 @@ module SyntaxTree
|
|
7547
7726
|
|
7548
7727
|
alias deconstruct child_nodes
|
7549
7728
|
|
7550
|
-
def deconstruct_keys(
|
7729
|
+
def deconstruct_keys(_keys)
|
7551
7730
|
{
|
7552
7731
|
statement: statement,
|
7553
7732
|
value: value,
|
@@ -7601,7 +7780,7 @@ module SyntaxTree
|
|
7601
7780
|
|
7602
7781
|
alias deconstruct child_nodes
|
7603
7782
|
|
7604
|
-
def deconstruct_keys(
|
7783
|
+
def deconstruct_keys(_keys)
|
7605
7784
|
{ name: name, location: location, comments: comments }
|
7606
7785
|
end
|
7607
7786
|
|
@@ -7638,7 +7817,7 @@ module SyntaxTree
|
|
7638
7817
|
|
7639
7818
|
alias deconstruct child_nodes
|
7640
7819
|
|
7641
|
-
def deconstruct_keys(
|
7820
|
+
def deconstruct_keys(_keys)
|
7642
7821
|
{ value: value, location: location, comments: comments }
|
7643
7822
|
end
|
7644
7823
|
|
@@ -7674,7 +7853,7 @@ module SyntaxTree
|
|
7674
7853
|
|
7675
7854
|
alias deconstruct child_nodes
|
7676
7855
|
|
7677
|
-
def deconstruct_keys(
|
7856
|
+
def deconstruct_keys(_keys)
|
7678
7857
|
{ arguments: arguments, location: location, comments: comments }
|
7679
7858
|
end
|
7680
7859
|
|
@@ -7710,7 +7889,7 @@ module SyntaxTree
|
|
7710
7889
|
|
7711
7890
|
alias deconstruct child_nodes
|
7712
7891
|
|
7713
|
-
def deconstruct_keys(
|
7892
|
+
def deconstruct_keys(_keys)
|
7714
7893
|
{ value: value, location: location, comments: comments }
|
7715
7894
|
end
|
7716
7895
|
|
@@ -7739,7 +7918,7 @@ module SyntaxTree
|
|
7739
7918
|
|
7740
7919
|
alias deconstruct child_nodes
|
7741
7920
|
|
7742
|
-
def deconstruct_keys(
|
7921
|
+
def deconstruct_keys(_keys)
|
7743
7922
|
{ value: value, location: location }
|
7744
7923
|
end
|
7745
7924
|
end
|
@@ -7778,7 +7957,7 @@ module SyntaxTree
|
|
7778
7957
|
|
7779
7958
|
alias deconstruct child_nodes
|
7780
7959
|
|
7781
|
-
def deconstruct_keys(
|
7960
|
+
def deconstruct_keys(_keys)
|
7782
7961
|
{
|
7783
7962
|
target: target,
|
7784
7963
|
bodystmt: bodystmt,
|
@@ -7880,7 +8059,7 @@ module SyntaxTree
|
|
7880
8059
|
|
7881
8060
|
alias deconstruct child_nodes
|
7882
8061
|
|
7883
|
-
def deconstruct_keys(
|
8062
|
+
def deconstruct_keys(_keys)
|
7884
8063
|
{ parser: parser, body: body, location: location, comments: comments }
|
7885
8064
|
end
|
7886
8065
|
|
@@ -7950,12 +8129,19 @@ module SyntaxTree
|
|
7950
8129
|
comment = parser_comments[comment_index]
|
7951
8130
|
location = comment.location
|
7952
8131
|
|
7953
|
-
if !comment.inline? && (start_char <= location.start_char) &&
|
7954
|
-
|
8132
|
+
if !comment.inline? && (start_char <= location.start_char) &&
|
8133
|
+
(end_char >= location.end_char) && !comment.ignore?
|
8134
|
+
while (node = body[body_index]) &&
|
8135
|
+
(
|
8136
|
+
node.is_a?(VoidStmt) ||
|
8137
|
+
node.location.start_char < location.start_char
|
8138
|
+
)
|
7955
8139
|
body_index += 1
|
7956
8140
|
end
|
7957
8141
|
|
7958
|
-
if body_index != 0 &&
|
8142
|
+
if body_index != 0 &&
|
8143
|
+
body[body_index - 1].location.start_char < location.start_char &&
|
8144
|
+
body[body_index - 1].location.end_char > location.start_char
|
7959
8145
|
# The previous node entirely encapsules the comment, so we don't
|
7960
8146
|
# want to attach it here since it will get attached normally. This
|
7961
8147
|
# is mostly in the case of hash and array literals.
|
@@ -7995,7 +8181,7 @@ module SyntaxTree
|
|
7995
8181
|
|
7996
8182
|
alias deconstruct child_nodes
|
7997
8183
|
|
7998
|
-
def deconstruct_keys(
|
8184
|
+
def deconstruct_keys(_keys)
|
7999
8185
|
{ parts: parts, location: location }
|
8000
8186
|
end
|
8001
8187
|
end
|
@@ -8033,14 +8219,14 @@ module SyntaxTree
|
|
8033
8219
|
|
8034
8220
|
alias deconstruct child_nodes
|
8035
8221
|
|
8036
|
-
def deconstruct_keys(
|
8222
|
+
def deconstruct_keys(_keys)
|
8037
8223
|
{ left: left, right: right, location: location, comments: comments }
|
8038
8224
|
end
|
8039
8225
|
|
8040
8226
|
def format(q)
|
8041
8227
|
q.group do
|
8042
8228
|
q.format(left)
|
8043
|
-
q.text(
|
8229
|
+
q.text(" \\")
|
8044
8230
|
q.indent do
|
8045
8231
|
q.breakable(force: true)
|
8046
8232
|
q.format(right)
|
@@ -8078,7 +8264,7 @@ module SyntaxTree
|
|
8078
8264
|
|
8079
8265
|
alias deconstruct child_nodes
|
8080
8266
|
|
8081
|
-
def deconstruct_keys(
|
8267
|
+
def deconstruct_keys(_keys)
|
8082
8268
|
{ variable: variable, location: location, comments: comments }
|
8083
8269
|
end
|
8084
8270
|
|
@@ -8118,7 +8304,7 @@ module SyntaxTree
|
|
8118
8304
|
|
8119
8305
|
alias deconstruct child_nodes
|
8120
8306
|
|
8121
|
-
def deconstruct_keys(
|
8307
|
+
def deconstruct_keys(_keys)
|
8122
8308
|
{ statements: statements, location: location, comments: comments }
|
8123
8309
|
end
|
8124
8310
|
|
@@ -8176,7 +8362,7 @@ module SyntaxTree
|
|
8176
8362
|
|
8177
8363
|
alias deconstruct child_nodes
|
8178
8364
|
|
8179
|
-
def deconstruct_keys(
|
8365
|
+
def deconstruct_keys(_keys)
|
8180
8366
|
{ parts: parts, quote: quote, location: location, comments: comments }
|
8181
8367
|
end
|
8182
8368
|
|
@@ -8239,7 +8425,7 @@ module SyntaxTree
|
|
8239
8425
|
|
8240
8426
|
alias deconstruct child_nodes
|
8241
8427
|
|
8242
|
-
def deconstruct_keys(
|
8428
|
+
def deconstruct_keys(_keys)
|
8243
8429
|
{ arguments: arguments, location: location, comments: comments }
|
8244
8430
|
end
|
8245
8431
|
|
@@ -8292,7 +8478,7 @@ module SyntaxTree
|
|
8292
8478
|
|
8293
8479
|
alias deconstruct child_nodes
|
8294
8480
|
|
8295
|
-
def deconstruct_keys(
|
8481
|
+
def deconstruct_keys(_keys)
|
8296
8482
|
{ value: value, location: location }
|
8297
8483
|
end
|
8298
8484
|
end
|
@@ -8322,7 +8508,7 @@ module SyntaxTree
|
|
8322
8508
|
|
8323
8509
|
alias deconstruct child_nodes
|
8324
8510
|
|
8325
|
-
def deconstruct_keys(
|
8511
|
+
def deconstruct_keys(_keys)
|
8326
8512
|
{ value: value, location: location }
|
8327
8513
|
end
|
8328
8514
|
end
|
@@ -8356,7 +8542,7 @@ module SyntaxTree
|
|
8356
8542
|
|
8357
8543
|
alias deconstruct child_nodes
|
8358
8544
|
|
8359
|
-
def deconstruct_keys(
|
8545
|
+
def deconstruct_keys(_keys)
|
8360
8546
|
{ value: value, location: location, comments: comments }
|
8361
8547
|
end
|
8362
8548
|
|
@@ -8397,7 +8583,7 @@ module SyntaxTree
|
|
8397
8583
|
|
8398
8584
|
alias deconstruct child_nodes
|
8399
8585
|
|
8400
|
-
def deconstruct_keys(
|
8586
|
+
def deconstruct_keys(_keys)
|
8401
8587
|
{
|
8402
8588
|
beginning: beginning,
|
8403
8589
|
elements: elements,
|
@@ -8453,7 +8639,7 @@ module SyntaxTree
|
|
8453
8639
|
|
8454
8640
|
alias deconstruct child_nodes
|
8455
8641
|
|
8456
|
-
def deconstruct_keys(
|
8642
|
+
def deconstruct_keys(_keys)
|
8457
8643
|
{ value: value, location: location }
|
8458
8644
|
end
|
8459
8645
|
end
|
@@ -8482,7 +8668,7 @@ module SyntaxTree
|
|
8482
8668
|
|
8483
8669
|
alias deconstruct child_nodes
|
8484
8670
|
|
8485
|
-
def deconstruct_keys(
|
8671
|
+
def deconstruct_keys(_keys)
|
8486
8672
|
{ value: value, location: location }
|
8487
8673
|
end
|
8488
8674
|
end
|
@@ -8512,7 +8698,7 @@ module SyntaxTree
|
|
8512
8698
|
|
8513
8699
|
alias deconstruct child_nodes
|
8514
8700
|
|
8515
|
-
def deconstruct_keys(
|
8701
|
+
def deconstruct_keys(_keys)
|
8516
8702
|
{ value: value, location: location }
|
8517
8703
|
end
|
8518
8704
|
end
|
@@ -8546,7 +8732,7 @@ module SyntaxTree
|
|
8546
8732
|
|
8547
8733
|
alias deconstruct child_nodes
|
8548
8734
|
|
8549
|
-
def deconstruct_keys(
|
8735
|
+
def deconstruct_keys(_keys)
|
8550
8736
|
{ constant: constant, location: location, comments: comments }
|
8551
8737
|
end
|
8552
8738
|
|
@@ -8584,7 +8770,7 @@ module SyntaxTree
|
|
8584
8770
|
|
8585
8771
|
alias deconstruct child_nodes
|
8586
8772
|
|
8587
|
-
def deconstruct_keys(
|
8773
|
+
def deconstruct_keys(_keys)
|
8588
8774
|
{ constant: constant, location: location, comments: comments }
|
8589
8775
|
end
|
8590
8776
|
|
@@ -8623,7 +8809,7 @@ module SyntaxTree
|
|
8623
8809
|
|
8624
8810
|
alias deconstruct child_nodes
|
8625
8811
|
|
8626
|
-
def deconstruct_keys(
|
8812
|
+
def deconstruct_keys(_keys)
|
8627
8813
|
{ value: value, location: location }
|
8628
8814
|
end
|
8629
8815
|
end
|
@@ -8663,7 +8849,7 @@ module SyntaxTree
|
|
8663
8849
|
|
8664
8850
|
alias deconstruct child_nodes
|
8665
8851
|
|
8666
|
-
def deconstruct_keys(
|
8852
|
+
def deconstruct_keys(_keys)
|
8667
8853
|
{ value: value, location: location, comments: comments }
|
8668
8854
|
end
|
8669
8855
|
|
@@ -8701,7 +8887,7 @@ module SyntaxTree
|
|
8701
8887
|
|
8702
8888
|
alias deconstruct child_nodes
|
8703
8889
|
|
8704
|
-
def deconstruct_keys(
|
8890
|
+
def deconstruct_keys(_keys)
|
8705
8891
|
{ value: value, location: location }
|
8706
8892
|
end
|
8707
8893
|
end
|
@@ -8737,7 +8923,7 @@ module SyntaxTree
|
|
8737
8923
|
|
8738
8924
|
alias deconstruct child_nodes
|
8739
8925
|
|
8740
|
-
def deconstruct_keys(
|
8926
|
+
def deconstruct_keys(_keys)
|
8741
8927
|
{
|
8742
8928
|
statement: statement,
|
8743
8929
|
parentheses: parentheses,
|
@@ -8748,7 +8934,9 @@ module SyntaxTree
|
|
8748
8934
|
|
8749
8935
|
def format(q)
|
8750
8936
|
parent = q.parents.take(2)[1]
|
8751
|
-
ternary =
|
8937
|
+
ternary =
|
8938
|
+
(parent.is_a?(If) || parent.is_a?(Unless)) &&
|
8939
|
+
Ternaryable.call(q, parent)
|
8752
8940
|
|
8753
8941
|
q.text("not")
|
8754
8942
|
|
@@ -8802,7 +8990,7 @@ module SyntaxTree
|
|
8802
8990
|
|
8803
8991
|
alias deconstruct child_nodes
|
8804
8992
|
|
8805
|
-
def deconstruct_keys(
|
8993
|
+
def deconstruct_keys(_keys)
|
8806
8994
|
{
|
8807
8995
|
operator: operator,
|
8808
8996
|
statement: statement,
|
@@ -8822,6 +9010,9 @@ module SyntaxTree
|
|
8822
9010
|
# undef method
|
8823
9011
|
#
|
8824
9012
|
class Undef < Node
|
9013
|
+
# Undef accepts a variable number of arguments that can be either DynaSymbol
|
9014
|
+
# or SymbolLiteral objects. For SymbolLiteral objects we descend directly
|
9015
|
+
# into the value in order to have it come out as bare words.
|
8825
9016
|
class UndefArgumentFormatter
|
8826
9017
|
# [DynaSymbol | SymbolLiteral] the symbol to undefine
|
8827
9018
|
attr_reader :node
|
@@ -8865,7 +9056,7 @@ module SyntaxTree
|
|
8865
9056
|
|
8866
9057
|
alias deconstruct child_nodes
|
8867
9058
|
|
8868
|
-
def deconstruct_keys(
|
9059
|
+
def deconstruct_keys(_keys)
|
8869
9060
|
{ symbols: symbols, location: location, comments: comments }
|
8870
9061
|
end
|
8871
9062
|
|
@@ -8924,7 +9115,7 @@ module SyntaxTree
|
|
8924
9115
|
|
8925
9116
|
alias deconstruct child_nodes
|
8926
9117
|
|
8927
|
-
def deconstruct_keys(
|
9118
|
+
def deconstruct_keys(_keys)
|
8928
9119
|
{
|
8929
9120
|
predicate: predicate,
|
8930
9121
|
statements: statements,
|
@@ -8970,7 +9161,7 @@ module SyntaxTree
|
|
8970
9161
|
|
8971
9162
|
alias deconstruct child_nodes
|
8972
9163
|
|
8973
|
-
def deconstruct_keys(
|
9164
|
+
def deconstruct_keys(_keys)
|
8974
9165
|
{
|
8975
9166
|
statement: statement,
|
8976
9167
|
predicate: predicate,
|
@@ -9009,13 +9200,15 @@ module SyntaxTree
|
|
9009
9200
|
end
|
9010
9201
|
|
9011
9202
|
q.group do
|
9012
|
-
q
|
9013
|
-
|
9014
|
-
|
9015
|
-
|
9016
|
-
|
9203
|
+
q
|
9204
|
+
.if_break { format_break(q) }
|
9205
|
+
.if_flat do
|
9206
|
+
Parentheses.flat(q) do
|
9207
|
+
q.format(statements)
|
9208
|
+
q.text(" #{keyword} ")
|
9209
|
+
q.format(node.predicate)
|
9210
|
+
end
|
9017
9211
|
end
|
9018
|
-
end
|
9019
9212
|
end
|
9020
9213
|
end
|
9021
9214
|
|
@@ -9065,7 +9258,7 @@ module SyntaxTree
|
|
9065
9258
|
|
9066
9259
|
alias deconstruct child_nodes
|
9067
9260
|
|
9068
|
-
def deconstruct_keys(
|
9261
|
+
def deconstruct_keys(_keys)
|
9069
9262
|
{
|
9070
9263
|
predicate: predicate,
|
9071
9264
|
statements: statements,
|
@@ -9121,7 +9314,7 @@ module SyntaxTree
|
|
9121
9314
|
|
9122
9315
|
alias deconstruct child_nodes
|
9123
9316
|
|
9124
|
-
def deconstruct_keys(
|
9317
|
+
def deconstruct_keys(_keys)
|
9125
9318
|
{
|
9126
9319
|
statement: statement,
|
9127
9320
|
predicate: predicate,
|
@@ -9187,7 +9380,7 @@ module SyntaxTree
|
|
9187
9380
|
|
9188
9381
|
alias deconstruct child_nodes
|
9189
9382
|
|
9190
|
-
def deconstruct_keys(
|
9383
|
+
def deconstruct_keys(_keys)
|
9191
9384
|
{ left: left, right: right, location: location, comments: comments }
|
9192
9385
|
end
|
9193
9386
|
|
@@ -9230,7 +9423,7 @@ module SyntaxTree
|
|
9230
9423
|
|
9231
9424
|
alias deconstruct child_nodes
|
9232
9425
|
|
9233
|
-
def deconstruct_keys(
|
9426
|
+
def deconstruct_keys(_keys)
|
9234
9427
|
{ value: value, location: location, comments: comments }
|
9235
9428
|
end
|
9236
9429
|
|
@@ -9274,7 +9467,7 @@ module SyntaxTree
|
|
9274
9467
|
|
9275
9468
|
alias deconstruct child_nodes
|
9276
9469
|
|
9277
|
-
def deconstruct_keys(
|
9470
|
+
def deconstruct_keys(_keys)
|
9278
9471
|
{ value: value, location: location, comments: comments }
|
9279
9472
|
end
|
9280
9473
|
|
@@ -9315,7 +9508,7 @@ module SyntaxTree
|
|
9315
9508
|
|
9316
9509
|
alias deconstruct child_nodes
|
9317
9510
|
|
9318
|
-
def deconstruct_keys(
|
9511
|
+
def deconstruct_keys(_keys)
|
9319
9512
|
{ value: value, location: location, comments: comments }
|
9320
9513
|
end
|
9321
9514
|
|
@@ -9355,7 +9548,7 @@ module SyntaxTree
|
|
9355
9548
|
|
9356
9549
|
alias deconstruct child_nodes
|
9357
9550
|
|
9358
|
-
def deconstruct_keys(
|
9551
|
+
def deconstruct_keys(_keys)
|
9359
9552
|
{ value: value, location: location, comments: comments }
|
9360
9553
|
end
|
9361
9554
|
|
@@ -9390,7 +9583,7 @@ module SyntaxTree
|
|
9390
9583
|
|
9391
9584
|
alias deconstruct child_nodes
|
9392
9585
|
|
9393
|
-
def deconstruct_keys(
|
9586
|
+
def deconstruct_keys(_keys)
|
9394
9587
|
{ location: location, comments: comments }
|
9395
9588
|
end
|
9396
9589
|
|
@@ -9441,7 +9634,7 @@ module SyntaxTree
|
|
9441
9634
|
|
9442
9635
|
alias deconstruct child_nodes
|
9443
9636
|
|
9444
|
-
def deconstruct_keys(
|
9637
|
+
def deconstruct_keys(_keys)
|
9445
9638
|
{
|
9446
9639
|
arguments: arguments,
|
9447
9640
|
statements: statements,
|
@@ -9522,7 +9715,7 @@ module SyntaxTree
|
|
9522
9715
|
|
9523
9716
|
alias deconstruct child_nodes
|
9524
9717
|
|
9525
|
-
def deconstruct_keys(
|
9718
|
+
def deconstruct_keys(_keys)
|
9526
9719
|
{
|
9527
9720
|
predicate: predicate,
|
9528
9721
|
statements: statements,
|
@@ -9578,7 +9771,7 @@ module SyntaxTree
|
|
9578
9771
|
|
9579
9772
|
alias deconstruct child_nodes
|
9580
9773
|
|
9581
|
-
def deconstruct_keys(
|
9774
|
+
def deconstruct_keys(_keys)
|
9582
9775
|
{
|
9583
9776
|
statement: statement,
|
9584
9777
|
predicate: predicate,
|
@@ -9647,7 +9840,7 @@ module SyntaxTree
|
|
9647
9840
|
|
9648
9841
|
alias deconstruct child_nodes
|
9649
9842
|
|
9650
|
-
def deconstruct_keys(
|
9843
|
+
def deconstruct_keys(_keys)
|
9651
9844
|
{ parts: parts, location: location, comments: comments }
|
9652
9845
|
end
|
9653
9846
|
|
@@ -9687,7 +9880,7 @@ module SyntaxTree
|
|
9687
9880
|
|
9688
9881
|
alias deconstruct child_nodes
|
9689
9882
|
|
9690
|
-
def deconstruct_keys(
|
9883
|
+
def deconstruct_keys(_keys)
|
9691
9884
|
{
|
9692
9885
|
beginning: beginning,
|
9693
9886
|
elements: elements,
|
@@ -9743,7 +9936,7 @@ module SyntaxTree
|
|
9743
9936
|
|
9744
9937
|
alias deconstruct child_nodes
|
9745
9938
|
|
9746
|
-
def deconstruct_keys(
|
9939
|
+
def deconstruct_keys(_keys)
|
9747
9940
|
{ value: value, location: location }
|
9748
9941
|
end
|
9749
9942
|
end
|
@@ -9772,7 +9965,7 @@ module SyntaxTree
|
|
9772
9965
|
|
9773
9966
|
alias deconstruct child_nodes
|
9774
9967
|
|
9775
|
-
def deconstruct_keys(
|
9968
|
+
def deconstruct_keys(_keys)
|
9776
9969
|
{ parts: parts, location: location }
|
9777
9970
|
end
|
9778
9971
|
end
|
@@ -9805,7 +9998,7 @@ module SyntaxTree
|
|
9805
9998
|
|
9806
9999
|
alias deconstruct child_nodes
|
9807
10000
|
|
9808
|
-
def deconstruct_keys(
|
10001
|
+
def deconstruct_keys(_keys)
|
9809
10002
|
{ parts: parts, location: location, comments: comments }
|
9810
10003
|
end
|
9811
10004
|
|
@@ -9843,7 +10036,7 @@ module SyntaxTree
|
|
9843
10036
|
|
9844
10037
|
alias deconstruct child_nodes
|
9845
10038
|
|
9846
|
-
def deconstruct_keys(
|
10039
|
+
def deconstruct_keys(_keys)
|
9847
10040
|
{ arguments: arguments, location: location, comments: comments }
|
9848
10041
|
end
|
9849
10042
|
|
@@ -9893,7 +10086,7 @@ module SyntaxTree
|
|
9893
10086
|
|
9894
10087
|
alias deconstruct child_nodes
|
9895
10088
|
|
9896
|
-
def deconstruct_keys(
|
10089
|
+
def deconstruct_keys(_keys)
|
9897
10090
|
{ value: value, location: location, comments: comments }
|
9898
10091
|
end
|
9899
10092
|
|
@@ -9929,7 +10122,7 @@ module SyntaxTree
|
|
9929
10122
|
|
9930
10123
|
alias deconstruct child_nodes
|
9931
10124
|
|
9932
|
-
def deconstruct_keys(
|
10125
|
+
def deconstruct_keys(_keys)
|
9933
10126
|
{ value: value, location: location, comments: comments }
|
9934
10127
|
end
|
9935
10128
|
|