syntax_tree 2.3.1 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +20 -1
- data/.rubocop.yml +80 -0
- data/CHANGELOG.md +36 -1
- data/Gemfile.lock +24 -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 +7 -6
- data/lib/syntax_tree/language_server/inlay_hints.rb +87 -38
- data/lib/syntax_tree/language_server.rb +50 -14
- data/lib/syntax_tree/node.rb +499 -387
- data/lib/syntax_tree/parser.rb +447 -112
- data/lib/syntax_tree/plugin/single_quotes.rb +4 -0
- 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 +12 -18
- data/syntax_tree.gemspec +26 -21
- metadata +38 -5
- data/lib/syntax_tree/prettyprint.rb +0 -1156
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
|
+
PrettierPrint.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[A-Za-z_](\w*[\w!?])?\z/
|
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,
|
@@ -1602,52 +1666,6 @@ module SyntaxTree
|
|
1602
1666
|
end
|
1603
1667
|
end
|
1604
1668
|
|
1605
|
-
# This module will remove any breakables from the list of contents so that no
|
1606
|
-
# newlines are present in the output.
|
1607
|
-
module RemoveBreaks
|
1608
|
-
class << self
|
1609
|
-
def call(doc)
|
1610
|
-
marker = Object.new
|
1611
|
-
stack = [doc]
|
1612
|
-
|
1613
|
-
while stack.any?
|
1614
|
-
doc = stack.pop
|
1615
|
-
|
1616
|
-
if doc == marker
|
1617
|
-
stack.pop
|
1618
|
-
next
|
1619
|
-
end
|
1620
|
-
|
1621
|
-
stack += [doc, marker]
|
1622
|
-
|
1623
|
-
case doc
|
1624
|
-
when PrettyPrint::Align, PrettyPrint::Indent, PrettyPrint::Group
|
1625
|
-
doc.contents.map! { |child| remove_breaks(child) }
|
1626
|
-
stack += doc.contents.reverse
|
1627
|
-
when PrettyPrint::IfBreak
|
1628
|
-
doc.flat_contents.map! { |child| remove_breaks(child) }
|
1629
|
-
stack += doc.flat_contents.reverse
|
1630
|
-
end
|
1631
|
-
end
|
1632
|
-
end
|
1633
|
-
|
1634
|
-
private
|
1635
|
-
|
1636
|
-
def remove_breaks(doc)
|
1637
|
-
case doc
|
1638
|
-
when PrettyPrint::Breakable
|
1639
|
-
text = PrettyPrint::Text.new
|
1640
|
-
text.add(object: doc.force? ? "; " : doc.separator, width: doc.width)
|
1641
|
-
text
|
1642
|
-
when PrettyPrint::IfBreak
|
1643
|
-
PrettyPrint::Align.new(indent: 0, contents: doc.flat_contents)
|
1644
|
-
else
|
1645
|
-
doc
|
1646
|
-
end
|
1647
|
-
end
|
1648
|
-
end
|
1649
|
-
end
|
1650
|
-
|
1651
1669
|
# BlockVar represents the parameters being declared for a block. Effectively
|
1652
1670
|
# this node is everything contained within the pipes. This includes all of the
|
1653
1671
|
# various parameter types, as well as block-local variable declarations.
|
@@ -1682,14 +1700,13 @@ module SyntaxTree
|
|
1682
1700
|
|
1683
1701
|
alias deconstruct child_nodes
|
1684
1702
|
|
1685
|
-
def deconstruct_keys(
|
1703
|
+
def deconstruct_keys(_keys)
|
1686
1704
|
{ params: params, locals: locals, location: location, comments: comments }
|
1687
1705
|
end
|
1688
1706
|
|
1689
1707
|
def format(q)
|
1690
1708
|
q.group(0, "|", "|") do
|
1691
|
-
|
1692
|
-
RemoveBreaks.call(doc)
|
1709
|
+
q.remove_breaks(q.format(params))
|
1693
1710
|
|
1694
1711
|
if locals.any?
|
1695
1712
|
q.text("; ")
|
@@ -1726,7 +1743,7 @@ module SyntaxTree
|
|
1726
1743
|
|
1727
1744
|
alias deconstruct child_nodes
|
1728
1745
|
|
1729
|
-
def deconstruct_keys(
|
1746
|
+
def deconstruct_keys(_keys)
|
1730
1747
|
{ name: name, location: location, comments: comments }
|
1731
1748
|
end
|
1732
1749
|
|
@@ -1822,7 +1839,7 @@ module SyntaxTree
|
|
1822
1839
|
|
1823
1840
|
alias deconstruct child_nodes
|
1824
1841
|
|
1825
|
-
def deconstruct_keys(
|
1842
|
+
def deconstruct_keys(_keys)
|
1826
1843
|
{
|
1827
1844
|
statements: statements,
|
1828
1845
|
rescue_clause: rescue_clause,
|
@@ -1868,6 +1885,7 @@ module SyntaxTree
|
|
1868
1885
|
|
1869
1886
|
# Responsible for formatting either a BraceBlock or a DoBlock.
|
1870
1887
|
class BlockFormatter
|
1888
|
+
# Formats the opening brace or keyword of a block.
|
1871
1889
|
class BlockOpenFormatter
|
1872
1890
|
# [String] the actual output that should be printed
|
1873
1891
|
attr_reader :text
|
@@ -1933,9 +1951,9 @@ module SyntaxTree
|
|
1933
1951
|
end
|
1934
1952
|
|
1935
1953
|
q.group do
|
1936
|
-
q
|
1937
|
-
|
1938
|
-
|
1954
|
+
q
|
1955
|
+
.if_break { format_break(q, break_opening, break_closing) }
|
1956
|
+
.if_flat { format_flat(q, flat_opening, flat_closing) }
|
1939
1957
|
end
|
1940
1958
|
end
|
1941
1959
|
|
@@ -2060,7 +2078,7 @@ module SyntaxTree
|
|
2060
2078
|
|
2061
2079
|
alias deconstruct child_nodes
|
2062
2080
|
|
2063
|
-
def deconstruct_keys(
|
2081
|
+
def deconstruct_keys(_keys)
|
2064
2082
|
{
|
2065
2083
|
lbrace: lbrace,
|
2066
2084
|
block_var: block_var,
|
@@ -2099,7 +2117,11 @@ module SyntaxTree
|
|
2099
2117
|
#
|
2100
2118
|
# break
|
2101
2119
|
#
|
2102
|
-
in [Paren[
|
2120
|
+
in [Paren[
|
2121
|
+
contents: {
|
2122
|
+
body: [ArrayLiteral[contents: { parts: [_, _, *] }] => array]
|
2123
|
+
}
|
2124
|
+
]]
|
2103
2125
|
# Here we have a single argument that is a set of parentheses wrapping
|
2104
2126
|
# an array literal that has at least 2 elements. We're going to print
|
2105
2127
|
# the contents of the array directly. This would be like if we had:
|
@@ -2255,7 +2277,7 @@ module SyntaxTree
|
|
2255
2277
|
|
2256
2278
|
alias deconstruct child_nodes
|
2257
2279
|
|
2258
|
-
def deconstruct_keys(
|
2280
|
+
def deconstruct_keys(_keys)
|
2259
2281
|
{ arguments: arguments, location: location, comments: comments }
|
2260
2282
|
end
|
2261
2283
|
|
@@ -2287,6 +2309,20 @@ module SyntaxTree
|
|
2287
2309
|
end
|
2288
2310
|
end
|
2289
2311
|
|
2312
|
+
# This is probably the most complicated formatter in this file. It's
|
2313
|
+
# responsible for formatting chains of method calls, with or without arguments
|
2314
|
+
# or blocks. In general, we want to go from something like
|
2315
|
+
#
|
2316
|
+
# foo.bar.baz
|
2317
|
+
#
|
2318
|
+
# to
|
2319
|
+
#
|
2320
|
+
# foo
|
2321
|
+
# .bar
|
2322
|
+
# .baz
|
2323
|
+
#
|
2324
|
+
# Of course there are a lot of caveats to that, including trailing operators
|
2325
|
+
# when necessary, where comments are places, how blocks are aligned, etc.
|
2290
2326
|
class CallChainFormatter
|
2291
2327
|
# [Call | MethodAddBlock] the top of the call chain
|
2292
2328
|
attr_reader :node
|
@@ -2301,7 +2337,7 @@ module SyntaxTree
|
|
2301
2337
|
|
2302
2338
|
# First, walk down the chain until we get to the point where we're not
|
2303
2339
|
# longer at a chainable node.
|
2304
|
-
|
2340
|
+
loop do
|
2305
2341
|
case children.last
|
2306
2342
|
in Call[receiver: Call]
|
2307
2343
|
children << children.last.receiver
|
@@ -2321,7 +2357,7 @@ module SyntaxTree
|
|
2321
2357
|
# block. For more details, see
|
2322
2358
|
# https://github.com/prettier/plugin-ruby/issues/863.
|
2323
2359
|
parents = q.parents.take(4)
|
2324
|
-
if parent = parents[2]
|
2360
|
+
if (parent = parents[2])
|
2325
2361
|
# If we're at a do_block, then we want to go one more level up. This is
|
2326
2362
|
# because do blocks have BodyStmt nodes instead of just Statements
|
2327
2363
|
# nodes.
|
@@ -2335,7 +2371,11 @@ module SyntaxTree
|
|
2335
2371
|
end
|
2336
2372
|
|
2337
2373
|
if children.length >= threshold
|
2338
|
-
q.group
|
2374
|
+
q.group do
|
2375
|
+
q
|
2376
|
+
.if_break { format_chain(q, children) }
|
2377
|
+
.if_flat { node.format_contents(q) }
|
2378
|
+
end
|
2339
2379
|
else
|
2340
2380
|
node.format_contents(q)
|
2341
2381
|
end
|
@@ -2346,9 +2386,9 @@ module SyntaxTree
|
|
2346
2386
|
# chain of calls without arguments except for the last one. This is common
|
2347
2387
|
# enough in Ruby source code that it's worth the extra complexity here.
|
2348
2388
|
empty_except_last =
|
2349
|
-
children
|
2350
|
-
|
2351
|
-
|
2389
|
+
children
|
2390
|
+
.drop(1)
|
2391
|
+
.all? { |child| child.is_a?(Call) && child.arguments.nil? }
|
2352
2392
|
|
2353
2393
|
# Here, we're going to add all of the children onto the stack of the
|
2354
2394
|
# formatter so it's as if we had descending normally into them. This is
|
@@ -2368,9 +2408,12 @@ module SyntaxTree
|
|
2368
2408
|
# and a trailing operator.
|
2369
2409
|
skip_operator = false
|
2370
2410
|
|
2371
|
-
while child = children.pop
|
2411
|
+
while (child = children.pop)
|
2372
2412
|
case child
|
2373
|
-
in Call[
|
2413
|
+
in Call[
|
2414
|
+
receiver: Call[message: { value: "where" }],
|
2415
|
+
message: { value: "not" }
|
2416
|
+
]
|
2374
2417
|
# This is very specialized behavior wherein we group
|
2375
2418
|
# .where.not calls together because it looks better. For more
|
2376
2419
|
# information, see
|
@@ -2432,16 +2475,25 @@ module SyntaxTree
|
|
2432
2475
|
# want to indent the first call. So we'll pop off the first children and
|
2433
2476
|
# format it separately here.
|
2434
2477
|
def attach_directly?(node)
|
2435
|
-
[ArrayLiteral, HashLiteral, Heredoc, If, Unless, XStringLiteral]
|
2436
|
-
|
2478
|
+
[ArrayLiteral, HashLiteral, Heredoc, If, Unless, XStringLiteral].include?(
|
2479
|
+
node.receiver.class
|
2480
|
+
)
|
2437
2481
|
end
|
2438
2482
|
|
2439
|
-
def format_child(
|
2483
|
+
def format_child(
|
2484
|
+
q,
|
2485
|
+
child,
|
2486
|
+
skip_comments: false,
|
2487
|
+
skip_operator: false,
|
2488
|
+
skip_attached: false
|
2489
|
+
)
|
2440
2490
|
# First, format the actual contents of the child.
|
2441
2491
|
case child
|
2442
2492
|
in Call
|
2443
2493
|
q.group do
|
2444
|
-
|
2494
|
+
unless skip_operator
|
2495
|
+
q.format(CallOperatorFormatter.new(child.operator))
|
2496
|
+
end
|
2445
2497
|
q.format(child.message) if child.message != :call
|
2446
2498
|
child.format_arguments(q) unless skip_attached
|
2447
2499
|
end
|
@@ -2513,7 +2565,7 @@ module SyntaxTree
|
|
2513
2565
|
|
2514
2566
|
alias deconstruct child_nodes
|
2515
2567
|
|
2516
|
-
def deconstruct_keys(
|
2568
|
+
def deconstruct_keys(_keys)
|
2517
2569
|
{
|
2518
2570
|
receiver: receiver,
|
2519
2571
|
operator: operator,
|
@@ -2528,8 +2580,13 @@ module SyntaxTree
|
|
2528
2580
|
# If we're at the top of a call chain, then we're going to do some
|
2529
2581
|
# specialized printing in case we can print it nicely. We _only_ do this
|
2530
2582
|
# at the top of the chain to avoid weird recursion issues.
|
2531
|
-
if !CallChainFormatter.chained?(q.parent) &&
|
2532
|
-
|
2583
|
+
if !CallChainFormatter.chained?(q.parent) &&
|
2584
|
+
CallChainFormatter.chained?(receiver)
|
2585
|
+
q.group do
|
2586
|
+
q
|
2587
|
+
.if_break { CallChainFormatter.new(self).format(q) }
|
2588
|
+
.if_flat { format_contents(q) }
|
2589
|
+
end
|
2533
2590
|
else
|
2534
2591
|
format_contents(q)
|
2535
2592
|
end
|
@@ -2618,7 +2675,7 @@ module SyntaxTree
|
|
2618
2675
|
|
2619
2676
|
alias deconstruct child_nodes
|
2620
2677
|
|
2621
|
-
def deconstruct_keys(
|
2678
|
+
def deconstruct_keys(_keys)
|
2622
2679
|
{
|
2623
2680
|
keyword: keyword,
|
2624
2681
|
value: value,
|
@@ -2683,7 +2740,7 @@ module SyntaxTree
|
|
2683
2740
|
|
2684
2741
|
alias deconstruct child_nodes
|
2685
2742
|
|
2686
|
-
def deconstruct_keys(
|
2743
|
+
def deconstruct_keys(_keys)
|
2687
2744
|
{
|
2688
2745
|
value: value,
|
2689
2746
|
operator: operator,
|
@@ -2772,7 +2829,7 @@ module SyntaxTree
|
|
2772
2829
|
|
2773
2830
|
alias deconstruct child_nodes
|
2774
2831
|
|
2775
|
-
def deconstruct_keys(
|
2832
|
+
def deconstruct_keys(_keys)
|
2776
2833
|
{
|
2777
2834
|
constant: constant,
|
2778
2835
|
superclass: superclass,
|
@@ -2837,7 +2894,7 @@ module SyntaxTree
|
|
2837
2894
|
|
2838
2895
|
alias deconstruct child_nodes
|
2839
2896
|
|
2840
|
-
def deconstruct_keys(
|
2897
|
+
def deconstruct_keys(_keys)
|
2841
2898
|
{ value: value, location: location }
|
2842
2899
|
end
|
2843
2900
|
end
|
@@ -2875,7 +2932,7 @@ module SyntaxTree
|
|
2875
2932
|
|
2876
2933
|
alias deconstruct child_nodes
|
2877
2934
|
|
2878
|
-
def deconstruct_keys(
|
2935
|
+
def deconstruct_keys(_keys)
|
2879
2936
|
{
|
2880
2937
|
message: message,
|
2881
2938
|
arguments: arguments,
|
@@ -2957,7 +3014,7 @@ module SyntaxTree
|
|
2957
3014
|
|
2958
3015
|
alias deconstruct child_nodes
|
2959
3016
|
|
2960
|
-
def deconstruct_keys(
|
3017
|
+
def deconstruct_keys(_keys)
|
2961
3018
|
{
|
2962
3019
|
receiver: receiver,
|
2963
3020
|
operator: operator,
|
@@ -2992,31 +3049,6 @@ module SyntaxTree
|
|
2992
3049
|
|
2993
3050
|
private
|
2994
3051
|
|
2995
|
-
# This is a somewhat naive method that is attempting to sum up the width of
|
2996
|
-
# the doc nodes that make up the given doc node. This is used to align
|
2997
|
-
# content.
|
2998
|
-
def doc_width(parent)
|
2999
|
-
queue = [parent]
|
3000
|
-
width = 0
|
3001
|
-
|
3002
|
-
until queue.empty?
|
3003
|
-
doc = queue.shift
|
3004
|
-
|
3005
|
-
case doc
|
3006
|
-
when PrettyPrint::Text
|
3007
|
-
width += doc.width
|
3008
|
-
when PrettyPrint::Indent, PrettyPrint::Align, PrettyPrint::Group
|
3009
|
-
queue = doc.contents + queue
|
3010
|
-
when PrettyPrint::IfBreak
|
3011
|
-
queue = doc.break_contents + queue
|
3012
|
-
when PrettyPrint::Breakable
|
3013
|
-
width = 0
|
3014
|
-
end
|
3015
|
-
end
|
3016
|
-
|
3017
|
-
width
|
3018
|
-
end
|
3019
|
-
|
3020
3052
|
def argument_alignment(q, doc)
|
3021
3053
|
# Very special handling case for rspec matchers. In general with rspec
|
3022
3054
|
# matchers you expect to see something like:
|
@@ -3034,7 +3066,7 @@ module SyntaxTree
|
|
3034
3066
|
if %w[to not_to to_not].include?(message.value)
|
3035
3067
|
0
|
3036
3068
|
else
|
3037
|
-
width =
|
3069
|
+
width = q.last_position(doc) + 1
|
3038
3070
|
width > (q.maxwidth / 2) ? 0 : width
|
3039
3071
|
end
|
3040
3072
|
end
|
@@ -3079,7 +3111,7 @@ module SyntaxTree
|
|
3079
3111
|
end
|
3080
3112
|
|
3081
3113
|
def ignore?
|
3082
|
-
value[1
|
3114
|
+
value[1..].strip == "stree-ignore"
|
3083
3115
|
end
|
3084
3116
|
|
3085
3117
|
def comments
|
@@ -3096,7 +3128,7 @@ module SyntaxTree
|
|
3096
3128
|
|
3097
3129
|
alias deconstruct child_nodes
|
3098
3130
|
|
3099
|
-
def deconstruct_keys(
|
3131
|
+
def deconstruct_keys(_keys)
|
3100
3132
|
{ value: value, inline: inline, location: location }
|
3101
3133
|
end
|
3102
3134
|
|
@@ -3142,7 +3174,7 @@ module SyntaxTree
|
|
3142
3174
|
|
3143
3175
|
alias deconstruct child_nodes
|
3144
3176
|
|
3145
|
-
def deconstruct_keys(
|
3177
|
+
def deconstruct_keys(_keys)
|
3146
3178
|
{ value: value, location: location, comments: comments }
|
3147
3179
|
end
|
3148
3180
|
|
@@ -3184,7 +3216,7 @@ module SyntaxTree
|
|
3184
3216
|
|
3185
3217
|
alias deconstruct child_nodes
|
3186
3218
|
|
3187
|
-
def deconstruct_keys(
|
3219
|
+
def deconstruct_keys(_keys)
|
3188
3220
|
{
|
3189
3221
|
parent: parent,
|
3190
3222
|
constant: constant,
|
@@ -3231,7 +3263,7 @@ module SyntaxTree
|
|
3231
3263
|
|
3232
3264
|
alias deconstruct child_nodes
|
3233
3265
|
|
3234
|
-
def deconstruct_keys(
|
3266
|
+
def deconstruct_keys(_keys)
|
3235
3267
|
{
|
3236
3268
|
parent: parent,
|
3237
3269
|
constant: constant,
|
@@ -3276,7 +3308,7 @@ module SyntaxTree
|
|
3276
3308
|
|
3277
3309
|
alias deconstruct child_nodes
|
3278
3310
|
|
3279
|
-
def deconstruct_keys(
|
3311
|
+
def deconstruct_keys(_keys)
|
3280
3312
|
{ constant: constant, location: location, comments: comments }
|
3281
3313
|
end
|
3282
3314
|
|
@@ -3312,7 +3344,7 @@ module SyntaxTree
|
|
3312
3344
|
|
3313
3345
|
alias deconstruct child_nodes
|
3314
3346
|
|
3315
|
-
def deconstruct_keys(
|
3347
|
+
def deconstruct_keys(_keys)
|
3316
3348
|
{ value: value, location: location, comments: comments }
|
3317
3349
|
end
|
3318
3350
|
|
@@ -3356,7 +3388,7 @@ module SyntaxTree
|
|
3356
3388
|
|
3357
3389
|
alias deconstruct child_nodes
|
3358
3390
|
|
3359
|
-
def deconstruct_keys(
|
3391
|
+
def deconstruct_keys(_keys)
|
3360
3392
|
{
|
3361
3393
|
name: name,
|
3362
3394
|
params: params,
|
@@ -3441,7 +3473,7 @@ module SyntaxTree
|
|
3441
3473
|
|
3442
3474
|
alias deconstruct child_nodes
|
3443
3475
|
|
3444
|
-
def deconstruct_keys(
|
3476
|
+
def deconstruct_keys(_keys)
|
3445
3477
|
{
|
3446
3478
|
target: target,
|
3447
3479
|
operator: operator,
|
@@ -3509,7 +3541,7 @@ module SyntaxTree
|
|
3509
3541
|
|
3510
3542
|
alias deconstruct child_nodes
|
3511
3543
|
|
3512
|
-
def deconstruct_keys(
|
3544
|
+
def deconstruct_keys(_keys)
|
3513
3545
|
{ value: value, location: location, comments: comments }
|
3514
3546
|
end
|
3515
3547
|
|
@@ -3575,7 +3607,7 @@ module SyntaxTree
|
|
3575
3607
|
|
3576
3608
|
alias deconstruct child_nodes
|
3577
3609
|
|
3578
|
-
def deconstruct_keys(
|
3610
|
+
def deconstruct_keys(_keys)
|
3579
3611
|
{
|
3580
3612
|
target: target,
|
3581
3613
|
operator: operator,
|
@@ -3650,7 +3682,7 @@ module SyntaxTree
|
|
3650
3682
|
|
3651
3683
|
alias deconstruct child_nodes
|
3652
3684
|
|
3653
|
-
def deconstruct_keys(
|
3685
|
+
def deconstruct_keys(_keys)
|
3654
3686
|
{
|
3655
3687
|
keyword: keyword,
|
3656
3688
|
block_var: block_var,
|
@@ -3730,7 +3762,7 @@ module SyntaxTree
|
|
3730
3762
|
|
3731
3763
|
alias deconstruct child_nodes
|
3732
3764
|
|
3733
|
-
def deconstruct_keys(
|
3765
|
+
def deconstruct_keys(_keys)
|
3734
3766
|
{ left: left, right: right, location: location, comments: comments }
|
3735
3767
|
end
|
3736
3768
|
|
@@ -3778,7 +3810,7 @@ module SyntaxTree
|
|
3778
3810
|
|
3779
3811
|
alias deconstruct child_nodes
|
3780
3812
|
|
3781
|
-
def deconstruct_keys(
|
3813
|
+
def deconstruct_keys(_keys)
|
3782
3814
|
{ left: left, right: right, location: location, comments: comments }
|
3783
3815
|
end
|
3784
3816
|
|
@@ -3800,7 +3832,7 @@ module SyntaxTree
|
|
3800
3832
|
# quotes, then single quotes would deactivate it.)
|
3801
3833
|
def self.locked?(node)
|
3802
3834
|
node.parts.any? do |part|
|
3803
|
-
part.is_a?(TStringContent)
|
3835
|
+
!part.is_a?(TStringContent) || part.value.match?(/\\|#[@${]/)
|
3804
3836
|
end
|
3805
3837
|
end
|
3806
3838
|
|
@@ -3865,7 +3897,7 @@ module SyntaxTree
|
|
3865
3897
|
|
3866
3898
|
alias deconstruct child_nodes
|
3867
3899
|
|
3868
|
-
def deconstruct_keys(
|
3900
|
+
def deconstruct_keys(_keys)
|
3869
3901
|
{ parts: parts, quote: quote, location: location, comments: comments }
|
3870
3902
|
end
|
3871
3903
|
|
@@ -3906,9 +3938,14 @@ module SyntaxTree
|
|
3906
3938
|
matching = Quotes.matching(quote[2])
|
3907
3939
|
pattern = /[\n#{Regexp.escape(matching)}'"]/
|
3908
3940
|
|
3909
|
-
|
3910
|
-
|
3911
|
-
|
3941
|
+
# This check is to ensure we don't find a matching quote inside of the
|
3942
|
+
# symbol that would be confusing.
|
3943
|
+
matched =
|
3944
|
+
parts.any? do |part|
|
3945
|
+
part.is_a?(TStringContent) && part.value.match?(pattern)
|
3946
|
+
end
|
3947
|
+
|
3948
|
+
if matched
|
3912
3949
|
[quote, matching]
|
3913
3950
|
elsif Quotes.locked?(self)
|
3914
3951
|
["#{":" unless hash_key}'", "'"]
|
@@ -3917,7 +3954,7 @@ module SyntaxTree
|
|
3917
3954
|
end
|
3918
3955
|
elsif Quotes.locked?(self)
|
3919
3956
|
if quote.start_with?(":")
|
3920
|
-
[hash_key ? quote[1
|
3957
|
+
[hash_key ? quote[1..] : quote, quote[1..]]
|
3921
3958
|
else
|
3922
3959
|
[hash_key ? quote : ":#{quote}", quote]
|
3923
3960
|
end
|
@@ -3960,7 +3997,7 @@ module SyntaxTree
|
|
3960
3997
|
|
3961
3998
|
alias deconstruct child_nodes
|
3962
3999
|
|
3963
|
-
def deconstruct_keys(
|
4000
|
+
def deconstruct_keys(_keys)
|
3964
4001
|
{
|
3965
4002
|
keyword: keyword,
|
3966
4003
|
statements: statements,
|
@@ -4026,7 +4063,7 @@ module SyntaxTree
|
|
4026
4063
|
|
4027
4064
|
alias deconstruct child_nodes
|
4028
4065
|
|
4029
|
-
def deconstruct_keys(
|
4066
|
+
def deconstruct_keys(_keys)
|
4030
4067
|
{
|
4031
4068
|
predicate: predicate,
|
4032
4069
|
statements: statements,
|
@@ -4098,7 +4135,7 @@ module SyntaxTree
|
|
4098
4135
|
|
4099
4136
|
alias deconstruct child_nodes
|
4100
4137
|
|
4101
|
-
def deconstruct_keys(
|
4138
|
+
def deconstruct_keys(_keys)
|
4102
4139
|
{ value: value, location: location }
|
4103
4140
|
end
|
4104
4141
|
|
@@ -4133,7 +4170,7 @@ module SyntaxTree
|
|
4133
4170
|
|
4134
4171
|
alias deconstruct child_nodes
|
4135
4172
|
|
4136
|
-
def deconstruct_keys(
|
4173
|
+
def deconstruct_keys(_keys)
|
4137
4174
|
{ value: value, location: location }
|
4138
4175
|
end
|
4139
4176
|
end
|
@@ -4163,7 +4200,7 @@ module SyntaxTree
|
|
4163
4200
|
|
4164
4201
|
alias deconstruct child_nodes
|
4165
4202
|
|
4166
|
-
def deconstruct_keys(
|
4203
|
+
def deconstruct_keys(_keys)
|
4167
4204
|
{ value: value, location: location }
|
4168
4205
|
end
|
4169
4206
|
end
|
@@ -4195,7 +4232,7 @@ module SyntaxTree
|
|
4195
4232
|
|
4196
4233
|
alias deconstruct child_nodes
|
4197
4234
|
|
4198
|
-
def deconstruct_keys(
|
4235
|
+
def deconstruct_keys(_keys)
|
4199
4236
|
{ value: value, location: location }
|
4200
4237
|
end
|
4201
4238
|
end
|
@@ -4234,7 +4271,7 @@ module SyntaxTree
|
|
4234
4271
|
|
4235
4272
|
alias deconstruct child_nodes
|
4236
4273
|
|
4237
|
-
def deconstruct_keys(
|
4274
|
+
def deconstruct_keys(_keys)
|
4238
4275
|
{
|
4239
4276
|
keyword: keyword,
|
4240
4277
|
statements: statements,
|
@@ -4288,7 +4325,7 @@ module SyntaxTree
|
|
4288
4325
|
|
4289
4326
|
alias deconstruct child_nodes
|
4290
4327
|
|
4291
|
-
def deconstruct_keys(
|
4328
|
+
def deconstruct_keys(_keys)
|
4292
4329
|
{ value: value, location: location, comments: comments }
|
4293
4330
|
end
|
4294
4331
|
|
@@ -4331,7 +4368,7 @@ module SyntaxTree
|
|
4331
4368
|
|
4332
4369
|
alias deconstruct child_nodes
|
4333
4370
|
|
4334
|
-
def deconstruct_keys(
|
4371
|
+
def deconstruct_keys(_keys)
|
4335
4372
|
{
|
4336
4373
|
value: value,
|
4337
4374
|
arguments: arguments,
|
@@ -4343,7 +4380,8 @@ module SyntaxTree
|
|
4343
4380
|
def format(q)
|
4344
4381
|
q.format(value)
|
4345
4382
|
|
4346
|
-
if arguments.is_a?(ArgParen) && arguments.arguments.nil? &&
|
4383
|
+
if arguments.is_a?(ArgParen) && arguments.arguments.nil? &&
|
4384
|
+
!value.is_a?(Const)
|
4347
4385
|
# If you're using an explicit set of parentheses on something that looks
|
4348
4386
|
# like a constant, then we need to match that in order to maintain valid
|
4349
4387
|
# Ruby. For example, you could do something like Foo(), on which we
|
@@ -4390,7 +4428,7 @@ module SyntaxTree
|
|
4390
4428
|
|
4391
4429
|
alias deconstruct child_nodes
|
4392
4430
|
|
4393
|
-
def deconstruct_keys(
|
4431
|
+
def deconstruct_keys(_keys)
|
4394
4432
|
{
|
4395
4433
|
parent: parent,
|
4396
4434
|
operator: operator,
|
@@ -4436,7 +4474,7 @@ module SyntaxTree
|
|
4436
4474
|
|
4437
4475
|
alias deconstruct child_nodes
|
4438
4476
|
|
4439
|
-
def deconstruct_keys(
|
4477
|
+
def deconstruct_keys(_keys)
|
4440
4478
|
{ value: value, location: location, comments: comments }
|
4441
4479
|
end
|
4442
4480
|
|
@@ -4488,7 +4526,7 @@ module SyntaxTree
|
|
4488
4526
|
|
4489
4527
|
alias deconstruct child_nodes
|
4490
4528
|
|
4491
|
-
def deconstruct_keys(
|
4529
|
+
def deconstruct_keys(_keys)
|
4492
4530
|
{
|
4493
4531
|
constant: constant,
|
4494
4532
|
left: left,
|
@@ -4552,7 +4590,7 @@ module SyntaxTree
|
|
4552
4590
|
|
4553
4591
|
alias deconstruct child_nodes
|
4554
4592
|
|
4555
|
-
def deconstruct_keys(
|
4593
|
+
def deconstruct_keys(_keys)
|
4556
4594
|
{
|
4557
4595
|
index: index,
|
4558
4596
|
collection: collection,
|
@@ -4609,7 +4647,7 @@ module SyntaxTree
|
|
4609
4647
|
|
4610
4648
|
alias deconstruct child_nodes
|
4611
4649
|
|
4612
|
-
def deconstruct_keys(
|
4650
|
+
def deconstruct_keys(_keys)
|
4613
4651
|
{ value: value, location: location, comments: comments }
|
4614
4652
|
end
|
4615
4653
|
|
@@ -4623,6 +4661,9 @@ module SyntaxTree
|
|
4623
4661
|
# { key => value }
|
4624
4662
|
#
|
4625
4663
|
class HashLiteral < Node
|
4664
|
+
# This is a special formatter used if the hash literal contains no values
|
4665
|
+
# but _does_ contain comments. In this case we do some special formatting to
|
4666
|
+
# make sure the comments gets indented properly.
|
4626
4667
|
class EmptyWithCommentsFormatter
|
4627
4668
|
# [LBrace] the opening brace
|
4628
4669
|
attr_reader :lbrace
|
@@ -4672,7 +4713,7 @@ module SyntaxTree
|
|
4672
4713
|
|
4673
4714
|
alias deconstruct child_nodes
|
4674
4715
|
|
4675
|
-
def deconstruct_keys(
|
4716
|
+
def deconstruct_keys(_keys)
|
4676
4717
|
{ lbrace: lbrace, assocs: assocs, location: location, comments: comments }
|
4677
4718
|
end
|
4678
4719
|
|
@@ -4741,7 +4782,14 @@ module SyntaxTree
|
|
4741
4782
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
4742
4783
|
attr_reader :comments
|
4743
4784
|
|
4744
|
-
def initialize(
|
4785
|
+
def initialize(
|
4786
|
+
beginning:,
|
4787
|
+
ending: nil,
|
4788
|
+
dedent: 0,
|
4789
|
+
parts: [],
|
4790
|
+
location:,
|
4791
|
+
comments: []
|
4792
|
+
)
|
4745
4793
|
@beginning = beginning
|
4746
4794
|
@ending = ending
|
4747
4795
|
@dedent = dedent
|
@@ -4760,7 +4808,7 @@ module SyntaxTree
|
|
4760
4808
|
|
4761
4809
|
alias deconstruct child_nodes
|
4762
4810
|
|
4763
|
-
def deconstruct_keys(
|
4811
|
+
def deconstruct_keys(_keys)
|
4764
4812
|
{
|
4765
4813
|
beginning: beginning,
|
4766
4814
|
location: location,
|
@@ -4771,13 +4819,9 @@ module SyntaxTree
|
|
4771
4819
|
end
|
4772
4820
|
|
4773
4821
|
def format(q)
|
4774
|
-
# This is a very specific behavior
|
4775
|
-
#
|
4776
|
-
|
4777
|
-
breakable = -> do
|
4778
|
-
q.target <<
|
4779
|
-
PrettyPrint::Breakable.new(" ", 1, indent: false, force: true)
|
4780
|
-
end
|
4822
|
+
# This is a very specific behavior where you want to force a newline, but
|
4823
|
+
# don't want to force the break parent.
|
4824
|
+
breakable = -> { q.breakable(indent: false, force: :skip_break_parent) }
|
4781
4825
|
|
4782
4826
|
q.group do
|
4783
4827
|
q.format(beginning)
|
@@ -4832,7 +4876,7 @@ module SyntaxTree
|
|
4832
4876
|
|
4833
4877
|
alias deconstruct child_nodes
|
4834
4878
|
|
4835
|
-
def deconstruct_keys(
|
4879
|
+
def deconstruct_keys(_keys)
|
4836
4880
|
{ value: value, location: location, comments: comments }
|
4837
4881
|
end
|
4838
4882
|
|
@@ -4849,6 +4893,7 @@ module SyntaxTree
|
|
4849
4893
|
# end
|
4850
4894
|
#
|
4851
4895
|
class HshPtn < Node
|
4896
|
+
# Formats a key-value pair in a hash pattern. The value is optional.
|
4852
4897
|
class KeywordFormatter
|
4853
4898
|
# [Label] the keyword being used
|
4854
4899
|
attr_reader :key
|
@@ -4875,6 +4920,7 @@ module SyntaxTree
|
|
4875
4920
|
end
|
4876
4921
|
end
|
4877
4922
|
|
4923
|
+
# Formats the optional double-splat from the pattern.
|
4878
4924
|
class KeywordRestFormatter
|
4879
4925
|
# [VarField] the parameter that matches the remaining keywords
|
4880
4926
|
attr_reader :keyword_rest
|
@@ -4924,7 +4970,7 @@ module SyntaxTree
|
|
4924
4970
|
|
4925
4971
|
alias deconstruct child_nodes
|
4926
4972
|
|
4927
|
-
def deconstruct_keys(
|
4973
|
+
def deconstruct_keys(_keys)
|
4928
4974
|
{
|
4929
4975
|
constant: constant,
|
4930
4976
|
keywords: keywords,
|
@@ -4938,36 +4984,64 @@ module SyntaxTree
|
|
4938
4984
|
parts = keywords.map { |(key, value)| KeywordFormatter.new(key, value) }
|
4939
4985
|
parts << KeywordRestFormatter.new(keyword_rest) if keyword_rest
|
4940
4986
|
|
4987
|
+
nested = PATTERNS.include?(q.parent.class)
|
4941
4988
|
contents = -> do
|
4942
4989
|
q.group { q.seplist(parts) { |part| q.format(part, stackable: false) } }
|
4943
4990
|
|
4944
4991
|
# If there isn't a constant, and there's a blank keyword_rest, then we
|
4945
4992
|
# have an plain ** that needs to have a `then` after it in order to
|
4946
4993
|
# parse correctly on the next parse.
|
4947
|
-
|
4994
|
+
if !constant && keyword_rest && keyword_rest.value.nil? && !nested
|
4995
|
+
q.text(" then")
|
4996
|
+
end
|
4948
4997
|
end
|
4949
4998
|
|
4999
|
+
# If there is a constant, we're going to format to have the constant name
|
5000
|
+
# first and then use brackets.
|
4950
5001
|
if constant
|
4951
|
-
q.
|
4952
|
-
|
5002
|
+
q.group do
|
5003
|
+
q.format(constant)
|
5004
|
+
q.text("[")
|
5005
|
+
q.indent do
|
5006
|
+
q.breakable("")
|
5007
|
+
contents.call
|
5008
|
+
end
|
5009
|
+
q.breakable("")
|
5010
|
+
q.text("]")
|
5011
|
+
end
|
4953
5012
|
return
|
4954
5013
|
end
|
4955
5014
|
|
5015
|
+
# If there's nothing at all, then we're going to use empty braces.
|
4956
5016
|
if parts.empty?
|
4957
5017
|
q.text("{}")
|
4958
|
-
|
4959
|
-
|
4960
|
-
|
4961
|
-
|
4962
|
-
|
5018
|
+
return
|
5019
|
+
end
|
5020
|
+
|
5021
|
+
# If there's only one pair, then we'll just print the contents provided
|
5022
|
+
# we're not inside another pattern.
|
5023
|
+
if !nested && parts.size == 1
|
4963
5024
|
contents.call
|
5025
|
+
return
|
5026
|
+
end
|
5027
|
+
|
5028
|
+
# Otherwise, we're going to always use braces to make it clear it's a hash
|
5029
|
+
# pattern.
|
5030
|
+
q.group do
|
5031
|
+
q.text("{")
|
5032
|
+
q.indent do
|
5033
|
+
q.breakable
|
5034
|
+
contents.call
|
5035
|
+
end
|
5036
|
+
q.breakable
|
5037
|
+
q.text("}")
|
4964
5038
|
end
|
4965
5039
|
end
|
4966
5040
|
end
|
4967
5041
|
|
4968
5042
|
# The list of nodes that represent patterns inside of pattern matching so that
|
4969
5043
|
# when a pattern is being printed it knows if it's nested.
|
4970
|
-
PATTERNS = [AryPtn, Binary, FndPtn, HshPtn, RAssign]
|
5044
|
+
PATTERNS = [AryPtn, Binary, FndPtn, HshPtn, RAssign].freeze
|
4971
5045
|
|
4972
5046
|
# Ident represents an identifier anywhere in code. It can represent a very
|
4973
5047
|
# large number of things, depending on where it is in the syntax tree.
|
@@ -4997,7 +5071,7 @@ module SyntaxTree
|
|
4997
5071
|
|
4998
5072
|
alias deconstruct child_nodes
|
4999
5073
|
|
5000
|
-
def deconstruct_keys(
|
5074
|
+
def deconstruct_keys(_keys)
|
5001
5075
|
{ value: value, location: location, comments: comments }
|
5002
5076
|
end
|
5003
5077
|
|
@@ -5014,7 +5088,7 @@ module SyntaxTree
|
|
5014
5088
|
def self.call(parent)
|
5015
5089
|
queue = [parent]
|
5016
5090
|
|
5017
|
-
while node = queue.shift
|
5091
|
+
while (node = queue.shift)
|
5018
5092
|
return true if [Assign, MAssign, OpAssign].include?(node.class)
|
5019
5093
|
queue += node.child_nodes
|
5020
5094
|
end
|
@@ -5041,9 +5115,14 @@ module SyntaxTree
|
|
5041
5115
|
else
|
5042
5116
|
# Otherwise, we're going to check the conditional for certain cases.
|
5043
5117
|
case node
|
5044
|
-
in
|
5118
|
+
in predicate: Assign | Command | CommandCall | MAssign | OpAssign
|
5045
5119
|
false
|
5046
|
-
in
|
5120
|
+
in predicate: Not[parentheses: false]
|
5121
|
+
false
|
5122
|
+
in {
|
5123
|
+
statements: { body: [truthy] },
|
5124
|
+
consequent: Else[statements: { body: [falsy] }]
|
5125
|
+
}
|
5047
5126
|
ternaryable?(truthy) && ternaryable?(falsy)
|
5048
5127
|
else
|
5049
5128
|
false
|
@@ -5054,8 +5133,8 @@ module SyntaxTree
|
|
5054
5133
|
private
|
5055
5134
|
|
5056
5135
|
# 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.
|
5136
|
+
# parentheses around them. In this case we say they cannot be ternaried
|
5137
|
+
# and default instead to breaking them into multiple lines.
|
5059
5138
|
def ternaryable?(statement)
|
5060
5139
|
# This is a list of nodes that should not be allowed to be a part of a
|
5061
5140
|
# ternary clause.
|
@@ -5113,13 +5192,15 @@ module SyntaxTree
|
|
5113
5192
|
q.group { format_break(q, force: true) }
|
5114
5193
|
else
|
5115
5194
|
q.group do
|
5116
|
-
q
|
5117
|
-
|
5118
|
-
|
5119
|
-
|
5120
|
-
|
5195
|
+
q
|
5196
|
+
.if_break { format_break(q, force: false) }
|
5197
|
+
.if_flat do
|
5198
|
+
Parentheses.flat(q) do
|
5199
|
+
q.format(node.statements)
|
5200
|
+
q.text(" #{keyword} ")
|
5201
|
+
q.format(node.predicate)
|
5202
|
+
end
|
5121
5203
|
end
|
5122
|
-
end
|
5123
5204
|
end
|
5124
5205
|
end
|
5125
5206
|
end
|
@@ -5148,51 +5229,52 @@ module SyntaxTree
|
|
5148
5229
|
|
5149
5230
|
def format_ternary(q)
|
5150
5231
|
q.group do
|
5151
|
-
q
|
5152
|
-
|
5153
|
-
|
5232
|
+
q
|
5233
|
+
.if_break do
|
5234
|
+
q.text("#{keyword} ")
|
5235
|
+
q.nest(keyword.length + 1) { q.format(node.predicate) }
|
5154
5236
|
|
5155
|
-
q.indent do
|
5156
|
-
q.breakable
|
5157
|
-
q.format(node.statements)
|
5158
|
-
end
|
5159
|
-
|
5160
|
-
q.breakable
|
5161
|
-
q.group do
|
5162
|
-
q.format(node.consequent.keyword)
|
5163
5237
|
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)
|
5238
|
+
q.breakable
|
5239
|
+
q.format(node.statements)
|
5172
5240
|
end
|
5173
|
-
end
|
5174
5241
|
|
5175
|
-
|
5176
|
-
|
5177
|
-
|
5178
|
-
|
5179
|
-
|
5180
|
-
|
5242
|
+
q.breakable
|
5243
|
+
q.group do
|
5244
|
+
q.format(node.consequent.keyword)
|
5245
|
+
q.indent do
|
5246
|
+
# This is a very special case of breakable where we want to
|
5247
|
+
# force it into the output but we _don't_ want to explicitly
|
5248
|
+
# break the parent. If a break-parent shows up in the tree, then
|
5249
|
+
# it's going to force it all the way up to the tree, which is
|
5250
|
+
# going to negate the ternary.
|
5251
|
+
q.breakable(force: :skip_break_parent)
|
5252
|
+
q.format(node.consequent.statements)
|
5253
|
+
end
|
5254
|
+
end
|
5255
|
+
|
5256
|
+
q.breakable
|
5257
|
+
q.text("end")
|
5258
|
+
end
|
5259
|
+
.if_flat do
|
5260
|
+
Parentheses.flat(q) do
|
5261
|
+
q.format(node.predicate)
|
5262
|
+
q.text(" ? ")
|
5181
5263
|
|
5182
|
-
|
5183
|
-
|
5264
|
+
statements = [node.statements, node.consequent.statements]
|
5265
|
+
statements.reverse! if keyword == "unless"
|
5184
5266
|
|
5185
|
-
|
5186
|
-
|
5187
|
-
|
5267
|
+
q.format(statements[0])
|
5268
|
+
q.text(" : ")
|
5269
|
+
q.format(statements[1])
|
5270
|
+
end
|
5188
5271
|
end
|
5189
|
-
end
|
5190
5272
|
end
|
5191
5273
|
end
|
5192
5274
|
|
5193
5275
|
def contains_conditional?
|
5194
5276
|
case node
|
5195
|
-
in
|
5277
|
+
in statements: { body: [If | IfMod | IfOp | Unless | UnlessMod] }
|
5196
5278
|
true
|
5197
5279
|
else
|
5198
5280
|
false
|
@@ -5242,7 +5324,7 @@ module SyntaxTree
|
|
5242
5324
|
|
5243
5325
|
alias deconstruct child_nodes
|
5244
5326
|
|
5245
|
-
def deconstruct_keys(
|
5327
|
+
def deconstruct_keys(_keys)
|
5246
5328
|
{
|
5247
5329
|
predicate: predicate,
|
5248
5330
|
statements: statements,
|
@@ -5292,7 +5374,7 @@ module SyntaxTree
|
|
5292
5374
|
|
5293
5375
|
alias deconstruct child_nodes
|
5294
5376
|
|
5295
|
-
def deconstruct_keys(
|
5377
|
+
def deconstruct_keys(_keys)
|
5296
5378
|
{
|
5297
5379
|
predicate: predicate,
|
5298
5380
|
truthy: truthy,
|
@@ -5310,7 +5392,8 @@ module SyntaxTree
|
|
5310
5392
|
Yield0, ZSuper
|
5311
5393
|
]
|
5312
5394
|
|
5313
|
-
if q.parent.is_a?(Paren) || force_flat.include?(truthy.class) ||
|
5395
|
+
if q.parent.is_a?(Paren) || force_flat.include?(truthy.class) ||
|
5396
|
+
force_flat.include?(falsy.class)
|
5314
5397
|
q.group { format_flat(q) }
|
5315
5398
|
return
|
5316
5399
|
end
|
@@ -5430,7 +5513,7 @@ module SyntaxTree
|
|
5430
5513
|
|
5431
5514
|
alias deconstruct child_nodes
|
5432
5515
|
|
5433
|
-
def deconstruct_keys(
|
5516
|
+
def deconstruct_keys(_keys)
|
5434
5517
|
{
|
5435
5518
|
statement: statement,
|
5436
5519
|
predicate: predicate,
|
@@ -5471,7 +5554,7 @@ module SyntaxTree
|
|
5471
5554
|
|
5472
5555
|
alias deconstruct child_nodes
|
5473
5556
|
|
5474
|
-
def deconstruct_keys(
|
5557
|
+
def deconstruct_keys(_keys)
|
5475
5558
|
{ value: value, location: location, comments: comments }
|
5476
5559
|
end
|
5477
5560
|
|
@@ -5518,7 +5601,7 @@ module SyntaxTree
|
|
5518
5601
|
|
5519
5602
|
alias deconstruct child_nodes
|
5520
5603
|
|
5521
|
-
def deconstruct_keys(
|
5604
|
+
def deconstruct_keys(_keys)
|
5522
5605
|
{
|
5523
5606
|
pattern: pattern,
|
5524
5607
|
statements: statements,
|
@@ -5577,7 +5660,7 @@ module SyntaxTree
|
|
5577
5660
|
|
5578
5661
|
alias deconstruct child_nodes
|
5579
5662
|
|
5580
|
-
def deconstruct_keys(
|
5663
|
+
def deconstruct_keys(_keys)
|
5581
5664
|
{ value: value, location: location, comments: comments }
|
5582
5665
|
end
|
5583
5666
|
|
@@ -5587,7 +5670,7 @@ module SyntaxTree
|
|
5587
5670
|
# the values, then we're going to insert them every 3 characters
|
5588
5671
|
# starting from the right.
|
5589
5672
|
index = (value.length + 2) % 3
|
5590
|
-
q.text(" #{value}"[index
|
5673
|
+
q.text(" #{value}"[index..].scan(/.../).join("_").strip)
|
5591
5674
|
else
|
5592
5675
|
q.text(value)
|
5593
5676
|
end
|
@@ -5621,7 +5704,7 @@ module SyntaxTree
|
|
5621
5704
|
|
5622
5705
|
alias deconstruct child_nodes
|
5623
5706
|
|
5624
|
-
def deconstruct_keys(
|
5707
|
+
def deconstruct_keys(_keys)
|
5625
5708
|
{ value: value, location: location, comments: comments }
|
5626
5709
|
end
|
5627
5710
|
|
@@ -5666,7 +5749,7 @@ module SyntaxTree
|
|
5666
5749
|
|
5667
5750
|
alias deconstruct child_nodes
|
5668
5751
|
|
5669
|
-
def deconstruct_keys(
|
5752
|
+
def deconstruct_keys(_keys)
|
5670
5753
|
{ value: value, location: location, comments: comments }
|
5671
5754
|
end
|
5672
5755
|
|
@@ -5703,7 +5786,7 @@ module SyntaxTree
|
|
5703
5786
|
|
5704
5787
|
alias deconstruct child_nodes
|
5705
5788
|
|
5706
|
-
def deconstruct_keys(
|
5789
|
+
def deconstruct_keys(_keys)
|
5707
5790
|
{ name: name, location: location, comments: comments }
|
5708
5791
|
end
|
5709
5792
|
|
@@ -5749,7 +5832,7 @@ module SyntaxTree
|
|
5749
5832
|
|
5750
5833
|
alias deconstruct child_nodes
|
5751
5834
|
|
5752
|
-
def deconstruct_keys(
|
5835
|
+
def deconstruct_keys(_keys)
|
5753
5836
|
{ value: value, location: location, comments: comments }
|
5754
5837
|
end
|
5755
5838
|
|
@@ -5784,7 +5867,7 @@ module SyntaxTree
|
|
5784
5867
|
|
5785
5868
|
alias deconstruct child_nodes
|
5786
5869
|
|
5787
|
-
def deconstruct_keys(
|
5870
|
+
def deconstruct_keys(_keys)
|
5788
5871
|
{ value: value, location: location }
|
5789
5872
|
end
|
5790
5873
|
end
|
@@ -5820,7 +5903,7 @@ module SyntaxTree
|
|
5820
5903
|
|
5821
5904
|
alias deconstruct child_nodes
|
5822
5905
|
|
5823
|
-
def deconstruct_keys(
|
5906
|
+
def deconstruct_keys(_keys)
|
5824
5907
|
{
|
5825
5908
|
params: params,
|
5826
5909
|
statements: statements,
|
@@ -5842,25 +5925,27 @@ module SyntaxTree
|
|
5842
5925
|
end
|
5843
5926
|
|
5844
5927
|
q.text(" ")
|
5845
|
-
q
|
5846
|
-
|
5847
|
-
|
5848
|
-
|
5928
|
+
q
|
5929
|
+
.if_break do
|
5930
|
+
force_parens =
|
5931
|
+
q.parents.any? do |node|
|
5932
|
+
node.is_a?(Command) || node.is_a?(CommandCall)
|
5933
|
+
end
|
5934
|
+
|
5935
|
+
q.text(force_parens ? "{" : "do")
|
5936
|
+
q.indent do
|
5937
|
+
q.breakable
|
5938
|
+
q.format(statements)
|
5849
5939
|
end
|
5850
5940
|
|
5851
|
-
q.text(force_parens ? "{" : "do")
|
5852
|
-
q.indent do
|
5853
5941
|
q.breakable
|
5942
|
+
q.text(force_parens ? "}" : "end")
|
5943
|
+
end
|
5944
|
+
.if_flat do
|
5945
|
+
q.text("{ ")
|
5854
5946
|
q.format(statements)
|
5947
|
+
q.text(" }")
|
5855
5948
|
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
5949
|
end
|
5865
5950
|
end
|
5866
5951
|
end
|
@@ -5889,7 +5974,7 @@ module SyntaxTree
|
|
5889
5974
|
|
5890
5975
|
alias deconstruct child_nodes
|
5891
5976
|
|
5892
|
-
def deconstruct_keys(
|
5977
|
+
def deconstruct_keys(_keys)
|
5893
5978
|
{ value: value, location: location, comments: comments }
|
5894
5979
|
end
|
5895
5980
|
|
@@ -5922,7 +6007,7 @@ module SyntaxTree
|
|
5922
6007
|
|
5923
6008
|
alias deconstruct child_nodes
|
5924
6009
|
|
5925
|
-
def deconstruct_keys(
|
6010
|
+
def deconstruct_keys(_keys)
|
5926
6011
|
{ value: value, location: location, comments: comments }
|
5927
6012
|
end
|
5928
6013
|
|
@@ -5955,7 +6040,7 @@ module SyntaxTree
|
|
5955
6040
|
|
5956
6041
|
alias deconstruct child_nodes
|
5957
6042
|
|
5958
|
-
def deconstruct_keys(
|
6043
|
+
def deconstruct_keys(_keys)
|
5959
6044
|
{ value: value, location: location, comments: comments }
|
5960
6045
|
end
|
5961
6046
|
|
@@ -6005,7 +6090,7 @@ module SyntaxTree
|
|
6005
6090
|
|
6006
6091
|
alias deconstruct child_nodes
|
6007
6092
|
|
6008
|
-
def deconstruct_keys(
|
6093
|
+
def deconstruct_keys(_keys)
|
6009
6094
|
{ target: target, value: value, location: location, comments: comments }
|
6010
6095
|
end
|
6011
6096
|
|
@@ -6052,7 +6137,7 @@ module SyntaxTree
|
|
6052
6137
|
|
6053
6138
|
alias deconstruct child_nodes
|
6054
6139
|
|
6055
|
-
def deconstruct_keys(
|
6140
|
+
def deconstruct_keys(_keys)
|
6056
6141
|
{ call: call, block: block, location: location, comments: comments }
|
6057
6142
|
end
|
6058
6143
|
|
@@ -6060,8 +6145,13 @@ module SyntaxTree
|
|
6060
6145
|
# If we're at the top of a call chain, then we're going to do some
|
6061
6146
|
# specialized printing in case we can print it nicely. We _only_ do this
|
6062
6147
|
# at the top of the chain to avoid weird recursion issues.
|
6063
|
-
if !CallChainFormatter.chained?(q.parent) &&
|
6064
|
-
|
6148
|
+
if !CallChainFormatter.chained?(q.parent) &&
|
6149
|
+
CallChainFormatter.chained?(call)
|
6150
|
+
q.group do
|
6151
|
+
q
|
6152
|
+
.if_break { CallChainFormatter.new(self).format(q) }
|
6153
|
+
.if_flat { format_contents(q) }
|
6154
|
+
end
|
6065
6155
|
else
|
6066
6156
|
format_contents(q)
|
6067
6157
|
end
|
@@ -6108,7 +6198,7 @@ module SyntaxTree
|
|
6108
6198
|
|
6109
6199
|
alias deconstruct child_nodes
|
6110
6200
|
|
6111
|
-
def deconstruct_keys(
|
6201
|
+
def deconstruct_keys(_keys)
|
6112
6202
|
{ parts: parts, location: location, comma: comma, comments: comments }
|
6113
6203
|
end
|
6114
6204
|
|
@@ -6152,7 +6242,7 @@ module SyntaxTree
|
|
6152
6242
|
|
6153
6243
|
alias deconstruct child_nodes
|
6154
6244
|
|
6155
|
-
def deconstruct_keys(
|
6245
|
+
def deconstruct_keys(_keys)
|
6156
6246
|
{ contents: contents, location: location, comments: comments }
|
6157
6247
|
end
|
6158
6248
|
|
@@ -6208,7 +6298,7 @@ module SyntaxTree
|
|
6208
6298
|
|
6209
6299
|
alias deconstruct child_nodes
|
6210
6300
|
|
6211
|
-
def deconstruct_keys(
|
6301
|
+
def deconstruct_keys(_keys)
|
6212
6302
|
{
|
6213
6303
|
constant: constant,
|
6214
6304
|
bodystmt: bodystmt,
|
@@ -6275,7 +6365,7 @@ module SyntaxTree
|
|
6275
6365
|
|
6276
6366
|
alias deconstruct child_nodes
|
6277
6367
|
|
6278
|
-
def deconstruct_keys(
|
6368
|
+
def deconstruct_keys(_keys)
|
6279
6369
|
{ parts: parts, location: location, comments: comments }
|
6280
6370
|
end
|
6281
6371
|
|
@@ -6324,7 +6414,7 @@ module SyntaxTree
|
|
6324
6414
|
|
6325
6415
|
alias deconstruct child_nodes
|
6326
6416
|
|
6327
|
-
def deconstruct_keys(
|
6417
|
+
def deconstruct_keys(_keys)
|
6328
6418
|
{ arguments: arguments, location: location, comments: comments }
|
6329
6419
|
end
|
6330
6420
|
|
@@ -6361,7 +6451,7 @@ module SyntaxTree
|
|
6361
6451
|
|
6362
6452
|
alias deconstruct child_nodes
|
6363
6453
|
|
6364
|
-
def deconstruct_keys(
|
6454
|
+
def deconstruct_keys(_keys)
|
6365
6455
|
{ value: value, location: location, comments: comments }
|
6366
6456
|
end
|
6367
6457
|
|
@@ -6407,7 +6497,7 @@ module SyntaxTree
|
|
6407
6497
|
|
6408
6498
|
alias deconstruct child_nodes
|
6409
6499
|
|
6410
|
-
def deconstruct_keys(
|
6500
|
+
def deconstruct_keys(_keys)
|
6411
6501
|
{
|
6412
6502
|
target: target,
|
6413
6503
|
operator: operator,
|
@@ -6475,7 +6565,16 @@ module SyntaxTree
|
|
6475
6565
|
# This approach maintains the nice conciseness of the inline version, while
|
6476
6566
|
# keeping the correct semantic meaning.
|
6477
6567
|
module Parentheses
|
6478
|
-
NODES = [
|
6568
|
+
NODES = [
|
6569
|
+
Args,
|
6570
|
+
Assign,
|
6571
|
+
Assoc,
|
6572
|
+
Binary,
|
6573
|
+
Call,
|
6574
|
+
Defined,
|
6575
|
+
MAssign,
|
6576
|
+
OpAssign
|
6577
|
+
].freeze
|
6479
6578
|
|
6480
6579
|
def self.flat(q)
|
6481
6580
|
return yield unless NODES.include?(q.parent.class)
|
@@ -6507,6 +6606,8 @@ module SyntaxTree
|
|
6507
6606
|
# def method(param) end
|
6508
6607
|
#
|
6509
6608
|
class Params < Node
|
6609
|
+
# Formats the optional position of the parameters. This includes the label,
|
6610
|
+
# as well as the default value.
|
6510
6611
|
class OptionalFormatter
|
6511
6612
|
# [Ident] the name of the parameter
|
6512
6613
|
attr_reader :name
|
@@ -6530,6 +6631,8 @@ module SyntaxTree
|
|
6530
6631
|
end
|
6531
6632
|
end
|
6532
6633
|
|
6634
|
+
# Formats the keyword position of the parameters. This includes the label,
|
6635
|
+
# as well as an optional default value.
|
6533
6636
|
class KeywordFormatter
|
6534
6637
|
# [Ident] the name of the parameter
|
6535
6638
|
attr_reader :name
|
@@ -6556,6 +6659,8 @@ module SyntaxTree
|
|
6556
6659
|
end
|
6557
6660
|
end
|
6558
6661
|
|
6662
|
+
# Formats the keyword_rest position of the parameters. This can be the **nil
|
6663
|
+
# syntax, the ... syntax, or the ** syntax.
|
6559
6664
|
class KeywordRestFormatter
|
6560
6665
|
# [:nil | ArgsForward | KwRestParam] the value of the parameter
|
6561
6666
|
attr_reader :value
|
@@ -6569,11 +6674,7 @@ module SyntaxTree
|
|
6569
6674
|
end
|
6570
6675
|
|
6571
6676
|
def format(q)
|
6572
|
-
|
6573
|
-
q.text("**nil")
|
6574
|
-
else
|
6575
|
-
q.format(value)
|
6576
|
-
end
|
6677
|
+
value == :nil ? q.text("**nil") : q.format(value)
|
6577
6678
|
end
|
6578
6679
|
end
|
6579
6680
|
|
@@ -6654,7 +6755,7 @@ module SyntaxTree
|
|
6654
6755
|
|
6655
6756
|
alias deconstruct child_nodes
|
6656
6757
|
|
6657
|
-
def deconstruct_keys(
|
6758
|
+
def deconstruct_keys(_keys)
|
6658
6759
|
{
|
6659
6760
|
location: location,
|
6660
6761
|
requireds: requireds,
|
@@ -6675,18 +6776,17 @@ module SyntaxTree
|
|
6675
6776
|
]
|
6676
6777
|
|
6677
6778
|
parts << rest if rest && !rest.is_a?(ExcessedComma)
|
6678
|
-
parts +=
|
6679
|
-
|
6680
|
-
|
6681
|
-
|
6682
|
-
]
|
6779
|
+
parts += [
|
6780
|
+
*posts,
|
6781
|
+
*keywords.map { |(name, value)| KeywordFormatter.new(name, value) }
|
6782
|
+
]
|
6683
6783
|
|
6684
6784
|
parts << KeywordRestFormatter.new(keyword_rest) if keyword_rest
|
6685
6785
|
parts << block if block
|
6686
6786
|
|
6687
6787
|
contents = -> do
|
6688
6788
|
q.seplist(parts) { |part| q.format(part) }
|
6689
|
-
q.format(rest) if rest
|
6789
|
+
q.format(rest) if rest.is_a?(ExcessedComma)
|
6690
6790
|
end
|
6691
6791
|
|
6692
6792
|
if ![Def, Defs, DefEndless].include?(q.parent.class) || parts.empty?
|
@@ -6736,7 +6836,7 @@ module SyntaxTree
|
|
6736
6836
|
|
6737
6837
|
alias deconstruct child_nodes
|
6738
6838
|
|
6739
|
-
def deconstruct_keys(
|
6839
|
+
def deconstruct_keys(_keys)
|
6740
6840
|
{
|
6741
6841
|
lparen: lparen,
|
6742
6842
|
contents: contents,
|
@@ -6787,7 +6887,7 @@ module SyntaxTree
|
|
6787
6887
|
|
6788
6888
|
alias deconstruct child_nodes
|
6789
6889
|
|
6790
|
-
def deconstruct_keys(
|
6890
|
+
def deconstruct_keys(_keys)
|
6791
6891
|
{ value: value, location: location, comments: comments }
|
6792
6892
|
end
|
6793
6893
|
|
@@ -6820,7 +6920,7 @@ module SyntaxTree
|
|
6820
6920
|
|
6821
6921
|
alias deconstruct child_nodes
|
6822
6922
|
|
6823
|
-
def deconstruct_keys(
|
6923
|
+
def deconstruct_keys(_keys)
|
6824
6924
|
{ statements: statements, location: location, comments: comments }
|
6825
6925
|
end
|
6826
6926
|
|
@@ -6865,7 +6965,7 @@ module SyntaxTree
|
|
6865
6965
|
|
6866
6966
|
alias deconstruct child_nodes
|
6867
6967
|
|
6868
|
-
def deconstruct_keys(
|
6968
|
+
def deconstruct_keys(_keys)
|
6869
6969
|
{
|
6870
6970
|
beginning: beginning,
|
6871
6971
|
elements: elements,
|
@@ -6920,18 +7020,9 @@ module SyntaxTree
|
|
6920
7020
|
|
6921
7021
|
alias deconstruct child_nodes
|
6922
7022
|
|
6923
|
-
def deconstruct_keys(
|
7023
|
+
def deconstruct_keys(_keys)
|
6924
7024
|
{ value: value, location: location }
|
6925
7025
|
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
7026
|
end
|
6936
7027
|
|
6937
7028
|
# QWords represents a string literal array without interpolation.
|
@@ -6965,7 +7056,7 @@ module SyntaxTree
|
|
6965
7056
|
|
6966
7057
|
alias deconstruct child_nodes
|
6967
7058
|
|
6968
|
-
def deconstruct_keys(
|
7059
|
+
def deconstruct_keys(_keys)
|
6969
7060
|
{
|
6970
7061
|
beginning: beginning,
|
6971
7062
|
elements: elements,
|
@@ -7020,7 +7111,7 @@ module SyntaxTree
|
|
7020
7111
|
|
7021
7112
|
alias deconstruct child_nodes
|
7022
7113
|
|
7023
|
-
def deconstruct_keys(
|
7114
|
+
def deconstruct_keys(_keys)
|
7024
7115
|
{ value: value, location: location }
|
7025
7116
|
end
|
7026
7117
|
end
|
@@ -7052,7 +7143,7 @@ module SyntaxTree
|
|
7052
7143
|
|
7053
7144
|
alias deconstruct child_nodes
|
7054
7145
|
|
7055
|
-
def deconstruct_keys(
|
7146
|
+
def deconstruct_keys(_keys)
|
7056
7147
|
{ value: value, location: location, comments: comments }
|
7057
7148
|
end
|
7058
7149
|
|
@@ -7081,7 +7172,7 @@ module SyntaxTree
|
|
7081
7172
|
|
7082
7173
|
alias deconstruct child_nodes
|
7083
7174
|
|
7084
|
-
def deconstruct_keys(
|
7175
|
+
def deconstruct_keys(_keys)
|
7085
7176
|
{ value: value, location: location }
|
7086
7177
|
end
|
7087
7178
|
end
|
@@ -7106,7 +7197,7 @@ module SyntaxTree
|
|
7106
7197
|
|
7107
7198
|
alias deconstruct child_nodes
|
7108
7199
|
|
7109
|
-
def deconstruct_keys(
|
7200
|
+
def deconstruct_keys(_keys)
|
7110
7201
|
{ value: value, location: location }
|
7111
7202
|
end
|
7112
7203
|
end
|
@@ -7138,7 +7229,7 @@ module SyntaxTree
|
|
7138
7229
|
|
7139
7230
|
alias deconstruct child_nodes
|
7140
7231
|
|
7141
|
-
def deconstruct_keys(
|
7232
|
+
def deconstruct_keys(_keys)
|
7142
7233
|
{ value: value, location: location, comments: comments }
|
7143
7234
|
end
|
7144
7235
|
|
@@ -7177,7 +7268,7 @@ module SyntaxTree
|
|
7177
7268
|
|
7178
7269
|
alias deconstruct child_nodes
|
7179
7270
|
|
7180
|
-
def deconstruct_keys(
|
7271
|
+
def deconstruct_keys(_keys)
|
7181
7272
|
{ beginning: beginning, parts: parts, location: location }
|
7182
7273
|
end
|
7183
7274
|
end
|
@@ -7210,7 +7301,7 @@ module SyntaxTree
|
|
7210
7301
|
|
7211
7302
|
alias deconstruct child_nodes
|
7212
7303
|
|
7213
|
-
def deconstruct_keys(
|
7304
|
+
def deconstruct_keys(_keys)
|
7214
7305
|
{ value: value, location: location }
|
7215
7306
|
end
|
7216
7307
|
end
|
@@ -7244,7 +7335,7 @@ module SyntaxTree
|
|
7244
7335
|
|
7245
7336
|
alias deconstruct child_nodes
|
7246
7337
|
|
7247
|
-
def deconstruct_keys(
|
7338
|
+
def deconstruct_keys(_keys)
|
7248
7339
|
{ value: value, location: location }
|
7249
7340
|
end
|
7250
7341
|
end
|
@@ -7285,10 +7376,11 @@ module SyntaxTree
|
|
7285
7376
|
|
7286
7377
|
alias deconstruct child_nodes
|
7287
7378
|
|
7288
|
-
def deconstruct_keys(
|
7379
|
+
def deconstruct_keys(_keys)
|
7289
7380
|
{
|
7290
7381
|
beginning: beginning,
|
7291
7382
|
ending: ending,
|
7383
|
+
options: options,
|
7292
7384
|
parts: parts,
|
7293
7385
|
location: location,
|
7294
7386
|
comments: comments
|
@@ -7296,7 +7388,7 @@ module SyntaxTree
|
|
7296
7388
|
end
|
7297
7389
|
|
7298
7390
|
def format(q)
|
7299
|
-
braces = ambiguous?(q) || include?(%r{
|
7391
|
+
braces = ambiguous?(q) || include?(%r{/})
|
7300
7392
|
|
7301
7393
|
if braces && include?(/[{}]/)
|
7302
7394
|
q.group do
|
@@ -7323,18 +7415,22 @@ module SyntaxTree
|
|
7323
7415
|
end
|
7324
7416
|
|
7325
7417
|
q.text("}")
|
7326
|
-
q.text(
|
7418
|
+
q.text(options)
|
7327
7419
|
end
|
7328
7420
|
else
|
7329
7421
|
q.group do
|
7330
7422
|
q.text("/")
|
7331
7423
|
q.format_each(parts)
|
7332
7424
|
q.text("/")
|
7333
|
-
q.text(
|
7425
|
+
q.text(options)
|
7334
7426
|
end
|
7335
7427
|
end
|
7336
7428
|
end
|
7337
7429
|
|
7430
|
+
def options
|
7431
|
+
ending[1..]
|
7432
|
+
end
|
7433
|
+
|
7338
7434
|
private
|
7339
7435
|
|
7340
7436
|
def include?(pattern)
|
@@ -7390,7 +7486,7 @@ module SyntaxTree
|
|
7390
7486
|
|
7391
7487
|
alias deconstruct child_nodes
|
7392
7488
|
|
7393
|
-
def deconstruct_keys(
|
7489
|
+
def deconstruct_keys(_keys)
|
7394
7490
|
{
|
7395
7491
|
exceptions: exceptions,
|
7396
7492
|
variable: variable,
|
@@ -7465,7 +7561,10 @@ module SyntaxTree
|
|
7465
7561
|
|
7466
7562
|
if consequent
|
7467
7563
|
consequent.bind_end(end_char, end_column)
|
7468
|
-
statements.bind_end(
|
7564
|
+
statements.bind_end(
|
7565
|
+
consequent.location.start_char,
|
7566
|
+
consequent.location.start_column
|
7567
|
+
)
|
7469
7568
|
else
|
7470
7569
|
statements.bind_end(end_char, end_column)
|
7471
7570
|
end
|
@@ -7481,7 +7580,7 @@ module SyntaxTree
|
|
7481
7580
|
|
7482
7581
|
alias deconstruct child_nodes
|
7483
7582
|
|
7484
|
-
def deconstruct_keys(
|
7583
|
+
def deconstruct_keys(_keys)
|
7485
7584
|
{
|
7486
7585
|
keyword: keyword,
|
7487
7586
|
exception: exception,
|
@@ -7548,7 +7647,7 @@ module SyntaxTree
|
|
7548
7647
|
|
7549
7648
|
alias deconstruct child_nodes
|
7550
7649
|
|
7551
|
-
def deconstruct_keys(
|
7650
|
+
def deconstruct_keys(_keys)
|
7552
7651
|
{
|
7553
7652
|
statement: statement,
|
7554
7653
|
value: value,
|
@@ -7602,7 +7701,7 @@ module SyntaxTree
|
|
7602
7701
|
|
7603
7702
|
alias deconstruct child_nodes
|
7604
7703
|
|
7605
|
-
def deconstruct_keys(
|
7704
|
+
def deconstruct_keys(_keys)
|
7606
7705
|
{ name: name, location: location, comments: comments }
|
7607
7706
|
end
|
7608
7707
|
|
@@ -7639,7 +7738,7 @@ module SyntaxTree
|
|
7639
7738
|
|
7640
7739
|
alias deconstruct child_nodes
|
7641
7740
|
|
7642
|
-
def deconstruct_keys(
|
7741
|
+
def deconstruct_keys(_keys)
|
7643
7742
|
{ value: value, location: location, comments: comments }
|
7644
7743
|
end
|
7645
7744
|
|
@@ -7675,7 +7774,7 @@ module SyntaxTree
|
|
7675
7774
|
|
7676
7775
|
alias deconstruct child_nodes
|
7677
7776
|
|
7678
|
-
def deconstruct_keys(
|
7777
|
+
def deconstruct_keys(_keys)
|
7679
7778
|
{ arguments: arguments, location: location, comments: comments }
|
7680
7779
|
end
|
7681
7780
|
|
@@ -7711,7 +7810,7 @@ module SyntaxTree
|
|
7711
7810
|
|
7712
7811
|
alias deconstruct child_nodes
|
7713
7812
|
|
7714
|
-
def deconstruct_keys(
|
7813
|
+
def deconstruct_keys(_keys)
|
7715
7814
|
{ value: value, location: location, comments: comments }
|
7716
7815
|
end
|
7717
7816
|
|
@@ -7740,7 +7839,7 @@ module SyntaxTree
|
|
7740
7839
|
|
7741
7840
|
alias deconstruct child_nodes
|
7742
7841
|
|
7743
|
-
def deconstruct_keys(
|
7842
|
+
def deconstruct_keys(_keys)
|
7744
7843
|
{ value: value, location: location }
|
7745
7844
|
end
|
7746
7845
|
end
|
@@ -7779,7 +7878,7 @@ module SyntaxTree
|
|
7779
7878
|
|
7780
7879
|
alias deconstruct child_nodes
|
7781
7880
|
|
7782
|
-
def deconstruct_keys(
|
7881
|
+
def deconstruct_keys(_keys)
|
7783
7882
|
{
|
7784
7883
|
target: target,
|
7785
7884
|
bodystmt: bodystmt,
|
@@ -7881,7 +7980,7 @@ module SyntaxTree
|
|
7881
7980
|
|
7882
7981
|
alias deconstruct child_nodes
|
7883
7982
|
|
7884
|
-
def deconstruct_keys(
|
7983
|
+
def deconstruct_keys(_keys)
|
7885
7984
|
{ parser: parser, body: body, location: location, comments: comments }
|
7886
7985
|
end
|
7887
7986
|
|
@@ -7951,12 +8050,19 @@ module SyntaxTree
|
|
7951
8050
|
comment = parser_comments[comment_index]
|
7952
8051
|
location = comment.location
|
7953
8052
|
|
7954
|
-
if !comment.inline? && (start_char <= location.start_char) &&
|
7955
|
-
|
8053
|
+
if !comment.inline? && (start_char <= location.start_char) &&
|
8054
|
+
(end_char >= location.end_char) && !comment.ignore?
|
8055
|
+
while (node = body[body_index]) &&
|
8056
|
+
(
|
8057
|
+
node.is_a?(VoidStmt) ||
|
8058
|
+
node.location.start_char < location.start_char
|
8059
|
+
)
|
7956
8060
|
body_index += 1
|
7957
8061
|
end
|
7958
8062
|
|
7959
|
-
if body_index != 0 &&
|
8063
|
+
if body_index != 0 &&
|
8064
|
+
body[body_index - 1].location.start_char < location.start_char &&
|
8065
|
+
body[body_index - 1].location.end_char > location.start_char
|
7960
8066
|
# The previous node entirely encapsules the comment, so we don't
|
7961
8067
|
# want to attach it here since it will get attached normally. This
|
7962
8068
|
# is mostly in the case of hash and array literals.
|
@@ -7996,7 +8102,7 @@ module SyntaxTree
|
|
7996
8102
|
|
7997
8103
|
alias deconstruct child_nodes
|
7998
8104
|
|
7999
|
-
def deconstruct_keys(
|
8105
|
+
def deconstruct_keys(_keys)
|
8000
8106
|
{ parts: parts, location: location }
|
8001
8107
|
end
|
8002
8108
|
end
|
@@ -8034,14 +8140,14 @@ module SyntaxTree
|
|
8034
8140
|
|
8035
8141
|
alias deconstruct child_nodes
|
8036
8142
|
|
8037
|
-
def deconstruct_keys(
|
8143
|
+
def deconstruct_keys(_keys)
|
8038
8144
|
{ left: left, right: right, location: location, comments: comments }
|
8039
8145
|
end
|
8040
8146
|
|
8041
8147
|
def format(q)
|
8042
8148
|
q.group do
|
8043
8149
|
q.format(left)
|
8044
|
-
q.text(
|
8150
|
+
q.text(" \\")
|
8045
8151
|
q.indent do
|
8046
8152
|
q.breakable(force: true)
|
8047
8153
|
q.format(right)
|
@@ -8079,7 +8185,7 @@ module SyntaxTree
|
|
8079
8185
|
|
8080
8186
|
alias deconstruct child_nodes
|
8081
8187
|
|
8082
|
-
def deconstruct_keys(
|
8188
|
+
def deconstruct_keys(_keys)
|
8083
8189
|
{ variable: variable, location: location, comments: comments }
|
8084
8190
|
end
|
8085
8191
|
|
@@ -8119,7 +8225,7 @@ module SyntaxTree
|
|
8119
8225
|
|
8120
8226
|
alias deconstruct child_nodes
|
8121
8227
|
|
8122
|
-
def deconstruct_keys(
|
8228
|
+
def deconstruct_keys(_keys)
|
8123
8229
|
{ statements: statements, location: location, comments: comments }
|
8124
8230
|
end
|
8125
8231
|
|
@@ -8129,8 +8235,7 @@ module SyntaxTree
|
|
8129
8235
|
# same line in the source, then we're going to leave them in place and
|
8130
8236
|
# assume that's the way the developer wanted this expression
|
8131
8237
|
# represented.
|
8132
|
-
|
8133
|
-
RemoveBreaks.call(doc)
|
8238
|
+
q.remove_breaks(q.group(0, '#{', "}") { q.format(statements) })
|
8134
8239
|
else
|
8135
8240
|
q.group do
|
8136
8241
|
q.text('#{')
|
@@ -8177,7 +8282,7 @@ module SyntaxTree
|
|
8177
8282
|
|
8178
8283
|
alias deconstruct child_nodes
|
8179
8284
|
|
8180
|
-
def deconstruct_keys(
|
8285
|
+
def deconstruct_keys(_keys)
|
8181
8286
|
{ parts: parts, quote: quote, location: location, comments: comments }
|
8182
8287
|
end
|
8183
8288
|
|
@@ -8240,7 +8345,7 @@ module SyntaxTree
|
|
8240
8345
|
|
8241
8346
|
alias deconstruct child_nodes
|
8242
8347
|
|
8243
|
-
def deconstruct_keys(
|
8348
|
+
def deconstruct_keys(_keys)
|
8244
8349
|
{ arguments: arguments, location: location, comments: comments }
|
8245
8350
|
end
|
8246
8351
|
|
@@ -8293,7 +8398,7 @@ module SyntaxTree
|
|
8293
8398
|
|
8294
8399
|
alias deconstruct child_nodes
|
8295
8400
|
|
8296
|
-
def deconstruct_keys(
|
8401
|
+
def deconstruct_keys(_keys)
|
8297
8402
|
{ value: value, location: location }
|
8298
8403
|
end
|
8299
8404
|
end
|
@@ -8323,7 +8428,7 @@ module SyntaxTree
|
|
8323
8428
|
|
8324
8429
|
alias deconstruct child_nodes
|
8325
8430
|
|
8326
|
-
def deconstruct_keys(
|
8431
|
+
def deconstruct_keys(_keys)
|
8327
8432
|
{ value: value, location: location }
|
8328
8433
|
end
|
8329
8434
|
end
|
@@ -8357,7 +8462,7 @@ module SyntaxTree
|
|
8357
8462
|
|
8358
8463
|
alias deconstruct child_nodes
|
8359
8464
|
|
8360
|
-
def deconstruct_keys(
|
8465
|
+
def deconstruct_keys(_keys)
|
8361
8466
|
{ value: value, location: location, comments: comments }
|
8362
8467
|
end
|
8363
8468
|
|
@@ -8398,7 +8503,7 @@ module SyntaxTree
|
|
8398
8503
|
|
8399
8504
|
alias deconstruct child_nodes
|
8400
8505
|
|
8401
|
-
def deconstruct_keys(
|
8506
|
+
def deconstruct_keys(_keys)
|
8402
8507
|
{
|
8403
8508
|
beginning: beginning,
|
8404
8509
|
elements: elements,
|
@@ -8454,7 +8559,7 @@ module SyntaxTree
|
|
8454
8559
|
|
8455
8560
|
alias deconstruct child_nodes
|
8456
8561
|
|
8457
|
-
def deconstruct_keys(
|
8562
|
+
def deconstruct_keys(_keys)
|
8458
8563
|
{ value: value, location: location }
|
8459
8564
|
end
|
8460
8565
|
end
|
@@ -8483,7 +8588,7 @@ module SyntaxTree
|
|
8483
8588
|
|
8484
8589
|
alias deconstruct child_nodes
|
8485
8590
|
|
8486
|
-
def deconstruct_keys(
|
8591
|
+
def deconstruct_keys(_keys)
|
8487
8592
|
{ value: value, location: location }
|
8488
8593
|
end
|
8489
8594
|
end
|
@@ -8513,7 +8618,7 @@ module SyntaxTree
|
|
8513
8618
|
|
8514
8619
|
alias deconstruct child_nodes
|
8515
8620
|
|
8516
|
-
def deconstruct_keys(
|
8621
|
+
def deconstruct_keys(_keys)
|
8517
8622
|
{ value: value, location: location }
|
8518
8623
|
end
|
8519
8624
|
end
|
@@ -8547,7 +8652,7 @@ module SyntaxTree
|
|
8547
8652
|
|
8548
8653
|
alias deconstruct child_nodes
|
8549
8654
|
|
8550
|
-
def deconstruct_keys(
|
8655
|
+
def deconstruct_keys(_keys)
|
8551
8656
|
{ constant: constant, location: location, comments: comments }
|
8552
8657
|
end
|
8553
8658
|
|
@@ -8585,7 +8690,7 @@ module SyntaxTree
|
|
8585
8690
|
|
8586
8691
|
alias deconstruct child_nodes
|
8587
8692
|
|
8588
|
-
def deconstruct_keys(
|
8693
|
+
def deconstruct_keys(_keys)
|
8589
8694
|
{ constant: constant, location: location, comments: comments }
|
8590
8695
|
end
|
8591
8696
|
|
@@ -8624,7 +8729,7 @@ module SyntaxTree
|
|
8624
8729
|
|
8625
8730
|
alias deconstruct child_nodes
|
8626
8731
|
|
8627
|
-
def deconstruct_keys(
|
8732
|
+
def deconstruct_keys(_keys)
|
8628
8733
|
{ value: value, location: location }
|
8629
8734
|
end
|
8630
8735
|
end
|
@@ -8664,7 +8769,7 @@ module SyntaxTree
|
|
8664
8769
|
|
8665
8770
|
alias deconstruct child_nodes
|
8666
8771
|
|
8667
|
-
def deconstruct_keys(
|
8772
|
+
def deconstruct_keys(_keys)
|
8668
8773
|
{ value: value, location: location, comments: comments }
|
8669
8774
|
end
|
8670
8775
|
|
@@ -8702,7 +8807,7 @@ module SyntaxTree
|
|
8702
8807
|
|
8703
8808
|
alias deconstruct child_nodes
|
8704
8809
|
|
8705
|
-
def deconstruct_keys(
|
8810
|
+
def deconstruct_keys(_keys)
|
8706
8811
|
{ value: value, location: location }
|
8707
8812
|
end
|
8708
8813
|
end
|
@@ -8738,7 +8843,7 @@ module SyntaxTree
|
|
8738
8843
|
|
8739
8844
|
alias deconstruct child_nodes
|
8740
8845
|
|
8741
|
-
def deconstruct_keys(
|
8846
|
+
def deconstruct_keys(_keys)
|
8742
8847
|
{
|
8743
8848
|
statement: statement,
|
8744
8849
|
parentheses: parentheses,
|
@@ -8749,7 +8854,9 @@ module SyntaxTree
|
|
8749
8854
|
|
8750
8855
|
def format(q)
|
8751
8856
|
parent = q.parents.take(2)[1]
|
8752
|
-
ternary =
|
8857
|
+
ternary =
|
8858
|
+
(parent.is_a?(If) || parent.is_a?(Unless)) &&
|
8859
|
+
Ternaryable.call(q, parent)
|
8753
8860
|
|
8754
8861
|
q.text("not")
|
8755
8862
|
|
@@ -8803,7 +8910,7 @@ module SyntaxTree
|
|
8803
8910
|
|
8804
8911
|
alias deconstruct child_nodes
|
8805
8912
|
|
8806
|
-
def deconstruct_keys(
|
8913
|
+
def deconstruct_keys(_keys)
|
8807
8914
|
{
|
8808
8915
|
operator: operator,
|
8809
8916
|
statement: statement,
|
@@ -8823,6 +8930,9 @@ module SyntaxTree
|
|
8823
8930
|
# undef method
|
8824
8931
|
#
|
8825
8932
|
class Undef < Node
|
8933
|
+
# Undef accepts a variable number of arguments that can be either DynaSymbol
|
8934
|
+
# or SymbolLiteral objects. For SymbolLiteral objects we descend directly
|
8935
|
+
# into the value in order to have it come out as bare words.
|
8826
8936
|
class UndefArgumentFormatter
|
8827
8937
|
# [DynaSymbol | SymbolLiteral] the symbol to undefine
|
8828
8938
|
attr_reader :node
|
@@ -8866,7 +8976,7 @@ module SyntaxTree
|
|
8866
8976
|
|
8867
8977
|
alias deconstruct child_nodes
|
8868
8978
|
|
8869
|
-
def deconstruct_keys(
|
8979
|
+
def deconstruct_keys(_keys)
|
8870
8980
|
{ symbols: symbols, location: location, comments: comments }
|
8871
8981
|
end
|
8872
8982
|
|
@@ -8925,7 +9035,7 @@ module SyntaxTree
|
|
8925
9035
|
|
8926
9036
|
alias deconstruct child_nodes
|
8927
9037
|
|
8928
|
-
def deconstruct_keys(
|
9038
|
+
def deconstruct_keys(_keys)
|
8929
9039
|
{
|
8930
9040
|
predicate: predicate,
|
8931
9041
|
statements: statements,
|
@@ -8971,7 +9081,7 @@ module SyntaxTree
|
|
8971
9081
|
|
8972
9082
|
alias deconstruct child_nodes
|
8973
9083
|
|
8974
|
-
def deconstruct_keys(
|
9084
|
+
def deconstruct_keys(_keys)
|
8975
9085
|
{
|
8976
9086
|
statement: statement,
|
8977
9087
|
predicate: predicate,
|
@@ -9010,13 +9120,15 @@ module SyntaxTree
|
|
9010
9120
|
end
|
9011
9121
|
|
9012
9122
|
q.group do
|
9013
|
-
q
|
9014
|
-
|
9015
|
-
|
9016
|
-
|
9017
|
-
|
9123
|
+
q
|
9124
|
+
.if_break { format_break(q) }
|
9125
|
+
.if_flat do
|
9126
|
+
Parentheses.flat(q) do
|
9127
|
+
q.format(statements)
|
9128
|
+
q.text(" #{keyword} ")
|
9129
|
+
q.format(node.predicate)
|
9130
|
+
end
|
9018
9131
|
end
|
9019
|
-
end
|
9020
9132
|
end
|
9021
9133
|
end
|
9022
9134
|
|
@@ -9066,7 +9178,7 @@ module SyntaxTree
|
|
9066
9178
|
|
9067
9179
|
alias deconstruct child_nodes
|
9068
9180
|
|
9069
|
-
def deconstruct_keys(
|
9181
|
+
def deconstruct_keys(_keys)
|
9070
9182
|
{
|
9071
9183
|
predicate: predicate,
|
9072
9184
|
statements: statements,
|
@@ -9122,7 +9234,7 @@ module SyntaxTree
|
|
9122
9234
|
|
9123
9235
|
alias deconstruct child_nodes
|
9124
9236
|
|
9125
|
-
def deconstruct_keys(
|
9237
|
+
def deconstruct_keys(_keys)
|
9126
9238
|
{
|
9127
9239
|
statement: statement,
|
9128
9240
|
predicate: predicate,
|
@@ -9188,7 +9300,7 @@ module SyntaxTree
|
|
9188
9300
|
|
9189
9301
|
alias deconstruct child_nodes
|
9190
9302
|
|
9191
|
-
def deconstruct_keys(
|
9303
|
+
def deconstruct_keys(_keys)
|
9192
9304
|
{ left: left, right: right, location: location, comments: comments }
|
9193
9305
|
end
|
9194
9306
|
|
@@ -9231,7 +9343,7 @@ module SyntaxTree
|
|
9231
9343
|
|
9232
9344
|
alias deconstruct child_nodes
|
9233
9345
|
|
9234
|
-
def deconstruct_keys(
|
9346
|
+
def deconstruct_keys(_keys)
|
9235
9347
|
{ value: value, location: location, comments: comments }
|
9236
9348
|
end
|
9237
9349
|
|
@@ -9275,7 +9387,7 @@ module SyntaxTree
|
|
9275
9387
|
|
9276
9388
|
alias deconstruct child_nodes
|
9277
9389
|
|
9278
|
-
def deconstruct_keys(
|
9390
|
+
def deconstruct_keys(_keys)
|
9279
9391
|
{ value: value, location: location, comments: comments }
|
9280
9392
|
end
|
9281
9393
|
|
@@ -9316,7 +9428,7 @@ module SyntaxTree
|
|
9316
9428
|
|
9317
9429
|
alias deconstruct child_nodes
|
9318
9430
|
|
9319
|
-
def deconstruct_keys(
|
9431
|
+
def deconstruct_keys(_keys)
|
9320
9432
|
{ value: value, location: location, comments: comments }
|
9321
9433
|
end
|
9322
9434
|
|
@@ -9356,7 +9468,7 @@ module SyntaxTree
|
|
9356
9468
|
|
9357
9469
|
alias deconstruct child_nodes
|
9358
9470
|
|
9359
|
-
def deconstruct_keys(
|
9471
|
+
def deconstruct_keys(_keys)
|
9360
9472
|
{ value: value, location: location, comments: comments }
|
9361
9473
|
end
|
9362
9474
|
|
@@ -9391,7 +9503,7 @@ module SyntaxTree
|
|
9391
9503
|
|
9392
9504
|
alias deconstruct child_nodes
|
9393
9505
|
|
9394
|
-
def deconstruct_keys(
|
9506
|
+
def deconstruct_keys(_keys)
|
9395
9507
|
{ location: location, comments: comments }
|
9396
9508
|
end
|
9397
9509
|
|
@@ -9442,7 +9554,7 @@ module SyntaxTree
|
|
9442
9554
|
|
9443
9555
|
alias deconstruct child_nodes
|
9444
9556
|
|
9445
|
-
def deconstruct_keys(
|
9557
|
+
def deconstruct_keys(_keys)
|
9446
9558
|
{
|
9447
9559
|
arguments: arguments,
|
9448
9560
|
statements: statements,
|
@@ -9523,7 +9635,7 @@ module SyntaxTree
|
|
9523
9635
|
|
9524
9636
|
alias deconstruct child_nodes
|
9525
9637
|
|
9526
|
-
def deconstruct_keys(
|
9638
|
+
def deconstruct_keys(_keys)
|
9527
9639
|
{
|
9528
9640
|
predicate: predicate,
|
9529
9641
|
statements: statements,
|
@@ -9579,7 +9691,7 @@ module SyntaxTree
|
|
9579
9691
|
|
9580
9692
|
alias deconstruct child_nodes
|
9581
9693
|
|
9582
|
-
def deconstruct_keys(
|
9694
|
+
def deconstruct_keys(_keys)
|
9583
9695
|
{
|
9584
9696
|
statement: statement,
|
9585
9697
|
predicate: predicate,
|
@@ -9648,7 +9760,7 @@ module SyntaxTree
|
|
9648
9760
|
|
9649
9761
|
alias deconstruct child_nodes
|
9650
9762
|
|
9651
|
-
def deconstruct_keys(
|
9763
|
+
def deconstruct_keys(_keys)
|
9652
9764
|
{ parts: parts, location: location, comments: comments }
|
9653
9765
|
end
|
9654
9766
|
|
@@ -9688,7 +9800,7 @@ module SyntaxTree
|
|
9688
9800
|
|
9689
9801
|
alias deconstruct child_nodes
|
9690
9802
|
|
9691
|
-
def deconstruct_keys(
|
9803
|
+
def deconstruct_keys(_keys)
|
9692
9804
|
{
|
9693
9805
|
beginning: beginning,
|
9694
9806
|
elements: elements,
|
@@ -9744,7 +9856,7 @@ module SyntaxTree
|
|
9744
9856
|
|
9745
9857
|
alias deconstruct child_nodes
|
9746
9858
|
|
9747
|
-
def deconstruct_keys(
|
9859
|
+
def deconstruct_keys(_keys)
|
9748
9860
|
{ value: value, location: location }
|
9749
9861
|
end
|
9750
9862
|
end
|
@@ -9773,7 +9885,7 @@ module SyntaxTree
|
|
9773
9885
|
|
9774
9886
|
alias deconstruct child_nodes
|
9775
9887
|
|
9776
|
-
def deconstruct_keys(
|
9888
|
+
def deconstruct_keys(_keys)
|
9777
9889
|
{ parts: parts, location: location }
|
9778
9890
|
end
|
9779
9891
|
end
|
@@ -9806,7 +9918,7 @@ module SyntaxTree
|
|
9806
9918
|
|
9807
9919
|
alias deconstruct child_nodes
|
9808
9920
|
|
9809
|
-
def deconstruct_keys(
|
9921
|
+
def deconstruct_keys(_keys)
|
9810
9922
|
{ parts: parts, location: location, comments: comments }
|
9811
9923
|
end
|
9812
9924
|
|
@@ -9844,7 +9956,7 @@ module SyntaxTree
|
|
9844
9956
|
|
9845
9957
|
alias deconstruct child_nodes
|
9846
9958
|
|
9847
|
-
def deconstruct_keys(
|
9959
|
+
def deconstruct_keys(_keys)
|
9848
9960
|
{ arguments: arguments, location: location, comments: comments }
|
9849
9961
|
end
|
9850
9962
|
|
@@ -9894,7 +10006,7 @@ module SyntaxTree
|
|
9894
10006
|
|
9895
10007
|
alias deconstruct child_nodes
|
9896
10008
|
|
9897
|
-
def deconstruct_keys(
|
10009
|
+
def deconstruct_keys(_keys)
|
9898
10010
|
{ value: value, location: location, comments: comments }
|
9899
10011
|
end
|
9900
10012
|
|
@@ -9930,7 +10042,7 @@ module SyntaxTree
|
|
9930
10042
|
|
9931
10043
|
alias deconstruct child_nodes
|
9932
10044
|
|
9933
|
-
def deconstruct_keys(
|
10045
|
+
def deconstruct_keys(_keys)
|
9934
10046
|
{ value: value, location: location, comments: comments }
|
9935
10047
|
end
|
9936
10048
|
|