syntax_tree 2.3.1 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/main.yml +20 -1
- data/.rubocop.yml +80 -0
- data/CHANGELOG.md +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
|
|