syntax_tree 5.3.0 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +12 -1
- data/CHANGELOG.md +78 -1
- data/Gemfile.lock +7 -7
- data/README.md +33 -9
- data/Rakefile +12 -8
- data/bin/console +1 -0
- data/bin/whitequark +79 -0
- data/doc/changing_structure.md +16 -0
- data/lib/syntax_tree/basic_visitor.rb +44 -5
- data/lib/syntax_tree/cli.rb +2 -2
- data/lib/syntax_tree/dsl.rb +23 -11
- data/lib/syntax_tree/{visitor/field_visitor.rb → field_visitor.rb} +54 -55
- data/lib/syntax_tree/formatter.rb +1 -1
- data/lib/syntax_tree/index.rb +158 -59
- data/lib/syntax_tree/json_visitor.rb +55 -0
- data/lib/syntax_tree/language_server.rb +157 -2
- data/lib/syntax_tree/match_visitor.rb +120 -0
- data/lib/syntax_tree/mermaid.rb +177 -0
- data/lib/syntax_tree/mermaid_visitor.rb +69 -0
- data/lib/syntax_tree/{visitor/mutation_visitor.rb → mutation_visitor.rb} +27 -27
- data/lib/syntax_tree/node.rb +245 -123
- data/lib/syntax_tree/parser.rb +332 -119
- data/lib/syntax_tree/pretty_print_visitor.rb +83 -0
- data/lib/syntax_tree/reflection.rb +241 -0
- data/lib/syntax_tree/translation/parser.rb +3107 -0
- data/lib/syntax_tree/translation/rubocop_ast.rb +21 -0
- data/lib/syntax_tree/translation.rb +28 -0
- data/lib/syntax_tree/version.rb +1 -1
- data/lib/syntax_tree/with_scope.rb +244 -0
- data/lib/syntax_tree/yarv/basic_block.rb +53 -0
- data/lib/syntax_tree/yarv/calldata.rb +91 -0
- data/lib/syntax_tree/yarv/compiler.rb +110 -100
- data/lib/syntax_tree/yarv/control_flow_graph.rb +257 -0
- data/lib/syntax_tree/yarv/data_flow_graph.rb +338 -0
- data/lib/syntax_tree/yarv/decompiler.rb +1 -1
- data/lib/syntax_tree/yarv/disassembler.rb +104 -80
- data/lib/syntax_tree/yarv/instruction_sequence.rb +43 -18
- data/lib/syntax_tree/yarv/instructions.rb +203 -649
- data/lib/syntax_tree/yarv/legacy.rb +12 -24
- data/lib/syntax_tree/yarv/sea_of_nodes.rb +534 -0
- data/lib/syntax_tree/yarv.rb +18 -0
- data/lib/syntax_tree.rb +88 -56
- data/tasks/sorbet.rake +277 -0
- data/tasks/whitequark.rake +87 -0
- metadata +23 -11
- data/.gitmodules +0 -9
- data/lib/syntax_tree/language_server/inlay_hints.rb +0 -159
- data/lib/syntax_tree/visitor/environment.rb +0 -84
- data/lib/syntax_tree/visitor/json_visitor.rb +0 -55
- data/lib/syntax_tree/visitor/match_visitor.rb +0 -122
- data/lib/syntax_tree/visitor/pretty_print_visitor.rb +0 -85
- data/lib/syntax_tree/visitor/with_environment.rb +0 -140
data/lib/syntax_tree/node.rb
CHANGED
|
@@ -126,18 +126,28 @@ module SyntaxTree
|
|
|
126
126
|
raise NotImplementedError
|
|
127
127
|
end
|
|
128
128
|
|
|
129
|
+
def start_char
|
|
130
|
+
location.start_char
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def end_char
|
|
134
|
+
location.end_char
|
|
135
|
+
end
|
|
136
|
+
|
|
129
137
|
def pretty_print(q)
|
|
130
|
-
|
|
131
|
-
visitor.visit(self)
|
|
138
|
+
accept(PrettyPrintVisitor.new(q))
|
|
132
139
|
end
|
|
133
140
|
|
|
134
141
|
def to_json(*opts)
|
|
135
|
-
|
|
136
|
-
|
|
142
|
+
accept(JSONVisitor.new).to_json(*opts)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def to_mermaid
|
|
146
|
+
accept(MermaidVisitor.new)
|
|
137
147
|
end
|
|
138
148
|
|
|
139
149
|
def construct_keys
|
|
140
|
-
PrettierPrint.format(+"") { |q|
|
|
150
|
+
PrettierPrint.format(+"") { |q| accept(MatchVisitor.new(q)) }
|
|
141
151
|
end
|
|
142
152
|
end
|
|
143
153
|
|
|
@@ -555,7 +565,7 @@ module SyntaxTree
|
|
|
555
565
|
# collection[]
|
|
556
566
|
#
|
|
557
567
|
class ARef < Node
|
|
558
|
-
# [
|
|
568
|
+
# [Node] the value being indexed
|
|
559
569
|
attr_reader :collection
|
|
560
570
|
|
|
561
571
|
# [nil | Args] the value being passed within the brackets
|
|
@@ -633,7 +643,7 @@ module SyntaxTree
|
|
|
633
643
|
# collection[index] = value
|
|
634
644
|
#
|
|
635
645
|
class ARefField < Node
|
|
636
|
-
# [
|
|
646
|
+
# [Node] the value being indexed
|
|
637
647
|
attr_reader :collection
|
|
638
648
|
|
|
639
649
|
# [nil | Args] the value being passed within the brackets
|
|
@@ -808,7 +818,7 @@ module SyntaxTree
|
|
|
808
818
|
# method(first, second, third)
|
|
809
819
|
#
|
|
810
820
|
class Args < Node
|
|
811
|
-
# [Array[
|
|
821
|
+
# [Array[ Node ]] the arguments that this node wraps
|
|
812
822
|
attr_reader :parts
|
|
813
823
|
|
|
814
824
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -874,7 +884,7 @@ module SyntaxTree
|
|
|
874
884
|
# method(&expression)
|
|
875
885
|
#
|
|
876
886
|
class ArgBlock < Node
|
|
877
|
-
# [nil |
|
|
887
|
+
# [nil | Node] the expression being turned into a block
|
|
878
888
|
attr_reader :value
|
|
879
889
|
|
|
880
890
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -926,7 +936,7 @@ module SyntaxTree
|
|
|
926
936
|
# method(*arguments)
|
|
927
937
|
#
|
|
928
938
|
class ArgStar < Node
|
|
929
|
-
# [nil |
|
|
939
|
+
# [nil | Node] the expression being splatted
|
|
930
940
|
attr_reader :value
|
|
931
941
|
|
|
932
942
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -1129,7 +1139,8 @@ module SyntaxTree
|
|
|
1129
1139
|
end
|
|
1130
1140
|
end
|
|
1131
1141
|
|
|
1132
|
-
# [LBracket
|
|
1142
|
+
# [nil | LBracket | QSymbolsBeg | QWordsBeg | SymbolsBeg | WordsBeg] the
|
|
1143
|
+
# bracket that opens this array
|
|
1133
1144
|
attr_reader :lbracket
|
|
1134
1145
|
|
|
1135
1146
|
# [nil | Args] the contents of the array
|
|
@@ -1287,7 +1298,7 @@ module SyntaxTree
|
|
|
1287
1298
|
# [nil | VarRef] the optional constant wrapper
|
|
1288
1299
|
attr_reader :constant
|
|
1289
1300
|
|
|
1290
|
-
# [Array[
|
|
1301
|
+
# [Array[ Node ]] the regular positional arguments that this array
|
|
1291
1302
|
# pattern is matching against
|
|
1292
1303
|
attr_reader :requireds
|
|
1293
1304
|
|
|
@@ -1295,7 +1306,7 @@ module SyntaxTree
|
|
|
1295
1306
|
# positional arguments
|
|
1296
1307
|
attr_reader :rest
|
|
1297
1308
|
|
|
1298
|
-
# [Array[
|
|
1309
|
+
# [Array[ Node ]] the list of positional arguments occurring after the
|
|
1299
1310
|
# optional star if there is one
|
|
1300
1311
|
attr_reader :posts
|
|
1301
1312
|
|
|
@@ -1405,7 +1416,7 @@ module SyntaxTree
|
|
|
1405
1416
|
# to assign the result of the expression to
|
|
1406
1417
|
attr_reader :target
|
|
1407
1418
|
|
|
1408
|
-
# [
|
|
1419
|
+
# [Node] the expression to be assigned
|
|
1409
1420
|
attr_reader :value
|
|
1410
1421
|
|
|
1411
1422
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -1480,10 +1491,10 @@ module SyntaxTree
|
|
|
1480
1491
|
#
|
|
1481
1492
|
# In the above example, the would be two Assoc nodes.
|
|
1482
1493
|
class Assoc < Node
|
|
1483
|
-
# [
|
|
1494
|
+
# [Node] the key of this pair
|
|
1484
1495
|
attr_reader :key
|
|
1485
1496
|
|
|
1486
|
-
# [
|
|
1497
|
+
# [nil | Node] the value of this pair
|
|
1487
1498
|
attr_reader :value
|
|
1488
1499
|
|
|
1489
1500
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -1537,7 +1548,7 @@ module SyntaxTree
|
|
|
1537
1548
|
private
|
|
1538
1549
|
|
|
1539
1550
|
def format_contents(q)
|
|
1540
|
-
q.parent.format_key(q, key)
|
|
1551
|
+
(q.parent || HashKeyFormatter::Identity.new).format_key(q, key)
|
|
1541
1552
|
return unless value
|
|
1542
1553
|
|
|
1543
1554
|
if key.comments.empty? && AssignFormatting.skip_indent?(value)
|
|
@@ -1558,7 +1569,7 @@ module SyntaxTree
|
|
|
1558
1569
|
# { **pairs }
|
|
1559
1570
|
#
|
|
1560
1571
|
class AssocSplat < Node
|
|
1561
|
-
# [nil |
|
|
1572
|
+
# [nil | Node] the expression that is being splatted
|
|
1562
1573
|
attr_reader :value
|
|
1563
1574
|
|
|
1564
1575
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -1754,14 +1765,40 @@ module SyntaxTree
|
|
|
1754
1765
|
end
|
|
1755
1766
|
end
|
|
1756
1767
|
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
|
|
1760
|
-
|
|
1768
|
+
# When formatting a single assoc node without the context of the parent
|
|
1769
|
+
# hash, this formatter is used. It uses whatever is present in the node,
|
|
1770
|
+
# because there is nothing to be consistent with.
|
|
1771
|
+
class Identity
|
|
1772
|
+
def format_key(q, key)
|
|
1773
|
+
if key.is_a?(Label)
|
|
1774
|
+
q.format(key)
|
|
1775
|
+
else
|
|
1776
|
+
q.format(key)
|
|
1777
|
+
q.text(" =>")
|
|
1778
|
+
end
|
|
1779
|
+
end
|
|
1780
|
+
end
|
|
1761
1781
|
|
|
1782
|
+
def self.for(container)
|
|
1783
|
+
container.assocs.each do |assoc|
|
|
1784
|
+
if assoc.is_a?(AssocSplat)
|
|
1785
|
+
# Splat nodes do not impact the formatting choice.
|
|
1786
|
+
elsif assoc.value.nil?
|
|
1787
|
+
# If the value is nil, then it has been omitted. In this case we have
|
|
1788
|
+
# to match the existing formatting because standardizing would
|
|
1789
|
+
# potentially break the code. For example:
|
|
1790
|
+
#
|
|
1791
|
+
# { first:, "second" => "value" }
|
|
1792
|
+
#
|
|
1793
|
+
return Identity.new
|
|
1794
|
+
else
|
|
1795
|
+
# Otherwise, we need to check the type of the key. If it's a label or
|
|
1796
|
+
# dynamic symbol, we can use labels. If it's a symbol literal then it
|
|
1797
|
+
# needs to match a certain pattern to be used as a label. If it's
|
|
1798
|
+
# anything else, then we need to use hash rockets.
|
|
1762
1799
|
case assoc.key
|
|
1763
|
-
when Label
|
|
1764
|
-
|
|
1800
|
+
when Label, DynaSymbol
|
|
1801
|
+
# Here labels can be used.
|
|
1765
1802
|
when SymbolLiteral
|
|
1766
1803
|
# When attempting to convert a hash rocket into a hash label,
|
|
1767
1804
|
# you need to take care because only certain patterns are
|
|
@@ -1769,15 +1806,18 @@ module SyntaxTree
|
|
|
1769
1806
|
# arguments to methods, but don't specify what that is. After
|
|
1770
1807
|
# some experimentation, it looks like it's:
|
|
1771
1808
|
value = assoc.key.value.value
|
|
1772
|
-
|
|
1773
|
-
|
|
1774
|
-
|
|
1809
|
+
|
|
1810
|
+
if !value.match?(/^[_A-Za-z]/) || value.end_with?("=")
|
|
1811
|
+
return Rockets.new
|
|
1812
|
+
end
|
|
1775
1813
|
else
|
|
1776
|
-
|
|
1814
|
+
# If the value is anything else, we have to use hash rockets.
|
|
1815
|
+
return Rockets.new
|
|
1777
1816
|
end
|
|
1778
1817
|
end
|
|
1818
|
+
end
|
|
1779
1819
|
|
|
1780
|
-
|
|
1820
|
+
Labels.new
|
|
1781
1821
|
end
|
|
1782
1822
|
end
|
|
1783
1823
|
|
|
@@ -1834,7 +1874,15 @@ module SyntaxTree
|
|
|
1834
1874
|
end
|
|
1835
1875
|
|
|
1836
1876
|
def format_key(q, key)
|
|
1837
|
-
|
|
1877
|
+
@key_formatter ||=
|
|
1878
|
+
case q.parents.take(3).last
|
|
1879
|
+
when Break, Next, ReturnNode
|
|
1880
|
+
HashKeyFormatter::Identity.new
|
|
1881
|
+
else
|
|
1882
|
+
HashKeyFormatter.for(self)
|
|
1883
|
+
end
|
|
1884
|
+
|
|
1885
|
+
@key_formatter.format_key(q, key)
|
|
1838
1886
|
end
|
|
1839
1887
|
end
|
|
1840
1888
|
|
|
@@ -1908,7 +1956,7 @@ module SyntaxTree
|
|
|
1908
1956
|
# end
|
|
1909
1957
|
#
|
|
1910
1958
|
class PinnedBegin < Node
|
|
1911
|
-
# [
|
|
1959
|
+
# [Node] the expression being pinned
|
|
1912
1960
|
attr_reader :statement
|
|
1913
1961
|
|
|
1914
1962
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -1989,13 +2037,13 @@ module SyntaxTree
|
|
|
1989
2037
|
}
|
|
1990
2038
|
end
|
|
1991
2039
|
|
|
1992
|
-
# [
|
|
2040
|
+
# [Node] the left-hand side of the expression
|
|
1993
2041
|
attr_reader :left
|
|
1994
2042
|
|
|
1995
2043
|
# [Symbol] the operator used between the two expressions
|
|
1996
2044
|
attr_reader :operator
|
|
1997
2045
|
|
|
1998
|
-
# [
|
|
2046
|
+
# [Node] the right-hand side of the expression
|
|
1999
2047
|
attr_reader :right
|
|
2000
2048
|
|
|
2001
2049
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -2049,10 +2097,15 @@ module SyntaxTree
|
|
|
2049
2097
|
q.group { q.format(left) }
|
|
2050
2098
|
q.text(" ") unless power
|
|
2051
2099
|
|
|
2052
|
-
if operator
|
|
2053
|
-
q.
|
|
2054
|
-
|
|
2055
|
-
|
|
2100
|
+
if operator != :<<
|
|
2101
|
+
q.group do
|
|
2102
|
+
q.text(operator.name)
|
|
2103
|
+
q.indent do
|
|
2104
|
+
power ? q.breakable_empty : q.breakable_space
|
|
2105
|
+
q.format(right)
|
|
2106
|
+
end
|
|
2107
|
+
end
|
|
2108
|
+
elsif left.is_a?(Binary) && left.operator == :<<
|
|
2056
2109
|
q.group do
|
|
2057
2110
|
q.text(operator.name)
|
|
2058
2111
|
q.indent do
|
|
@@ -2060,6 +2113,9 @@ module SyntaxTree
|
|
|
2060
2113
|
q.format(right)
|
|
2061
2114
|
end
|
|
2062
2115
|
end
|
|
2116
|
+
else
|
|
2117
|
+
q.text("<< ")
|
|
2118
|
+
q.format(right)
|
|
2063
2119
|
end
|
|
2064
2120
|
end
|
|
2065
2121
|
end
|
|
@@ -2149,6 +2205,14 @@ module SyntaxTree
|
|
|
2149
2205
|
other.is_a?(BlockVar) && params === other.params &&
|
|
2150
2206
|
ArrayMatch.call(locals, other.locals)
|
|
2151
2207
|
end
|
|
2208
|
+
|
|
2209
|
+
# When a single required parameter is declared for a block, it gets
|
|
2210
|
+
# automatically expanded if the values being yielded into it are an array.
|
|
2211
|
+
def arg0?
|
|
2212
|
+
params.requireds.length == 1 && params.optionals.empty? &&
|
|
2213
|
+
params.rest.nil? && params.posts.empty? && params.keywords.empty? &&
|
|
2214
|
+
params.keyword_rest.nil? && params.block.nil?
|
|
2215
|
+
end
|
|
2152
2216
|
end
|
|
2153
2217
|
|
|
2154
2218
|
# BlockArg represents declaring a block parameter on a method definition.
|
|
@@ -2242,7 +2306,7 @@ module SyntaxTree
|
|
|
2242
2306
|
@comments = []
|
|
2243
2307
|
end
|
|
2244
2308
|
|
|
2245
|
-
def bind(start_char, start_column, end_char, end_column)
|
|
2309
|
+
def bind(parser, start_char, start_column, end_char, end_column)
|
|
2246
2310
|
@location =
|
|
2247
2311
|
Location.new(
|
|
2248
2312
|
start_line: location.start_line,
|
|
@@ -2256,6 +2320,7 @@ module SyntaxTree
|
|
|
2256
2320
|
# Here we're going to determine the bounds for the statements
|
|
2257
2321
|
consequent = rescue_clause || else_clause || ensure_clause
|
|
2258
2322
|
statements.bind(
|
|
2323
|
+
parser,
|
|
2259
2324
|
start_char,
|
|
2260
2325
|
start_column,
|
|
2261
2326
|
consequent ? consequent.location.start_char : end_char,
|
|
@@ -2646,7 +2711,7 @@ module SyntaxTree
|
|
|
2646
2711
|
# Of course there are a lot of caveats to that, including trailing operators
|
|
2647
2712
|
# when necessary, where comments are places, how blocks are aligned, etc.
|
|
2648
2713
|
class CallChainFormatter
|
|
2649
|
-
# [
|
|
2714
|
+
# [CallNode | MethodAddBlock] the top of the call chain
|
|
2650
2715
|
attr_reader :node
|
|
2651
2716
|
|
|
2652
2717
|
def initialize(node)
|
|
@@ -2867,7 +2932,7 @@ module SyntaxTree
|
|
|
2867
2932
|
# receiver.message
|
|
2868
2933
|
#
|
|
2869
2934
|
class CallNode < Node
|
|
2870
|
-
# [nil |
|
|
2935
|
+
# [nil | Node] the receiver of the method call
|
|
2871
2936
|
attr_reader :receiver
|
|
2872
2937
|
|
|
2873
2938
|
# [nil | :"::" | Op | Period] the operator being used to send the message
|
|
@@ -3043,7 +3108,7 @@ module SyntaxTree
|
|
|
3043
3108
|
# [Kw] the keyword that opens this expression
|
|
3044
3109
|
attr_reader :keyword
|
|
3045
3110
|
|
|
3046
|
-
# [nil |
|
|
3111
|
+
# [nil | Node] optional value being switched on
|
|
3047
3112
|
attr_reader :value
|
|
3048
3113
|
|
|
3049
3114
|
# [In | When] the next clause in the chain
|
|
@@ -3122,14 +3187,14 @@ module SyntaxTree
|
|
|
3122
3187
|
# value => pattern
|
|
3123
3188
|
#
|
|
3124
3189
|
class RAssign < Node
|
|
3125
|
-
# [
|
|
3190
|
+
# [Node] the left-hand expression
|
|
3126
3191
|
attr_reader :value
|
|
3127
3192
|
|
|
3128
3193
|
# [Kw | Op] the operator being used to match against the pattern, which is
|
|
3129
3194
|
# either => or in
|
|
3130
3195
|
attr_reader :operator
|
|
3131
3196
|
|
|
3132
|
-
# [
|
|
3197
|
+
# [Node] the pattern on the right-hand side of the expression
|
|
3133
3198
|
attr_reader :pattern
|
|
3134
3199
|
|
|
3135
3200
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -3240,7 +3305,7 @@ module SyntaxTree
|
|
|
3240
3305
|
# defined
|
|
3241
3306
|
attr_reader :constant
|
|
3242
3307
|
|
|
3243
|
-
# [nil |
|
|
3308
|
+
# [nil | Node] the optional superclass declaration
|
|
3244
3309
|
attr_reader :superclass
|
|
3245
3310
|
|
|
3246
3311
|
# [BodyStmt] the expressions to execute within the context of the class
|
|
@@ -3378,7 +3443,7 @@ module SyntaxTree
|
|
|
3378
3443
|
# [Args] the arguments being sent with the message
|
|
3379
3444
|
attr_reader :arguments
|
|
3380
3445
|
|
|
3381
|
-
# [nil |
|
|
3446
|
+
# [nil | BlockNode] the optional block being passed to the method
|
|
3382
3447
|
attr_reader :block
|
|
3383
3448
|
|
|
3384
3449
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -3484,19 +3549,19 @@ module SyntaxTree
|
|
|
3484
3549
|
# object.method argument
|
|
3485
3550
|
#
|
|
3486
3551
|
class CommandCall < Node
|
|
3487
|
-
# [
|
|
3552
|
+
# [nil | Node] the receiver of the message
|
|
3488
3553
|
attr_reader :receiver
|
|
3489
3554
|
|
|
3490
|
-
# [:"::" | Op | Period] the operator used to send the message
|
|
3555
|
+
# [nil | :"::" | Op | Period] the operator used to send the message
|
|
3491
3556
|
attr_reader :operator
|
|
3492
3557
|
|
|
3493
|
-
# [Const | Ident | Op] the message being send
|
|
3558
|
+
# [:call | Const | Ident | Op] the message being send
|
|
3494
3559
|
attr_reader :message
|
|
3495
3560
|
|
|
3496
|
-
# [nil | Args] the arguments going along with the message
|
|
3561
|
+
# [nil | Args | ArgParen] the arguments going along with the message
|
|
3497
3562
|
attr_reader :arguments
|
|
3498
3563
|
|
|
3499
|
-
# [nil |
|
|
3564
|
+
# [nil | BlockNode] the block associated with this method call
|
|
3500
3565
|
attr_reader :block
|
|
3501
3566
|
|
|
3502
3567
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -3782,7 +3847,7 @@ module SyntaxTree
|
|
|
3782
3847
|
# object::Const = value
|
|
3783
3848
|
#
|
|
3784
3849
|
class ConstPathField < Node
|
|
3785
|
-
# [
|
|
3850
|
+
# [Node] the source of the constant
|
|
3786
3851
|
attr_reader :parent
|
|
3787
3852
|
|
|
3788
3853
|
# [Const] the constant itself
|
|
@@ -3846,7 +3911,7 @@ module SyntaxTree
|
|
|
3846
3911
|
# object::Const
|
|
3847
3912
|
#
|
|
3848
3913
|
class ConstPathRef < Node
|
|
3849
|
-
# [
|
|
3914
|
+
# [Node] the source of the constant
|
|
3850
3915
|
attr_reader :parent
|
|
3851
3916
|
|
|
3852
3917
|
# [Const] the constant itself
|
|
@@ -4015,7 +4080,7 @@ module SyntaxTree
|
|
|
4015
4080
|
# def object.method(param) result end
|
|
4016
4081
|
#
|
|
4017
4082
|
class DefNode < Node
|
|
4018
|
-
# [nil |
|
|
4083
|
+
# [nil | Node] the target where the method is being defined
|
|
4019
4084
|
attr_reader :target
|
|
4020
4085
|
|
|
4021
4086
|
# [nil | Op | Period] the operator being used to declare the method
|
|
@@ -4027,7 +4092,7 @@ module SyntaxTree
|
|
|
4027
4092
|
# [nil | Params | Paren] the parameter declaration for the method
|
|
4028
4093
|
attr_reader :params
|
|
4029
4094
|
|
|
4030
|
-
# [BodyStmt |
|
|
4095
|
+
# [BodyStmt | Node] the expressions to be executed by the method
|
|
4031
4096
|
attr_reader :bodystmt
|
|
4032
4097
|
|
|
4033
4098
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -4090,7 +4155,8 @@ module SyntaxTree
|
|
|
4090
4155
|
def format(q)
|
|
4091
4156
|
q.group do
|
|
4092
4157
|
q.group do
|
|
4093
|
-
q.text("def
|
|
4158
|
+
q.text("def")
|
|
4159
|
+
q.text(" ") if target || name.comments.empty?
|
|
4094
4160
|
|
|
4095
4161
|
if target
|
|
4096
4162
|
q.format(target)
|
|
@@ -4160,7 +4226,7 @@ module SyntaxTree
|
|
|
4160
4226
|
# defined?(variable)
|
|
4161
4227
|
#
|
|
4162
4228
|
class Defined < Node
|
|
4163
|
-
# [
|
|
4229
|
+
# [Node] the value being sent to the keyword
|
|
4164
4230
|
attr_reader :value
|
|
4165
4231
|
|
|
4166
4232
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -4317,7 +4383,7 @@ module SyntaxTree
|
|
|
4317
4383
|
# are no parentheses around the arguments to that command, so we need to
|
|
4318
4384
|
# break the block.
|
|
4319
4385
|
case q.parent
|
|
4320
|
-
when Command, CommandCall
|
|
4386
|
+
when nil, Command, CommandCall
|
|
4321
4387
|
q.break_parent
|
|
4322
4388
|
format_break(q, break_opening, break_closing)
|
|
4323
4389
|
return
|
|
@@ -4371,7 +4437,7 @@ module SyntaxTree
|
|
|
4371
4437
|
# If we're a sibling of a control-flow keyword, then we're going to have to
|
|
4372
4438
|
# use the do..end bounds.
|
|
4373
4439
|
def forced_do_end_bounds?(q)
|
|
4374
|
-
case q.parent
|
|
4440
|
+
case q.parent&.call
|
|
4375
4441
|
when Break, Next, ReturnNode, Super
|
|
4376
4442
|
true
|
|
4377
4443
|
else
|
|
@@ -4451,13 +4517,13 @@ module SyntaxTree
|
|
|
4451
4517
|
#
|
|
4452
4518
|
# One of the sides of the expression may be nil, but not both.
|
|
4453
4519
|
class RangeNode < Node
|
|
4454
|
-
# [nil |
|
|
4520
|
+
# [nil | Node] the left side of the expression
|
|
4455
4521
|
attr_reader :left
|
|
4456
4522
|
|
|
4457
4523
|
# [Op] the operator used for this range
|
|
4458
4524
|
attr_reader :operator
|
|
4459
4525
|
|
|
4460
|
-
# [nil |
|
|
4526
|
+
# [nil | Node] the right side of the expression
|
|
4461
4527
|
attr_reader :right
|
|
4462
4528
|
|
|
4463
4529
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -4578,7 +4644,7 @@ module SyntaxTree
|
|
|
4578
4644
|
# dynamic symbol
|
|
4579
4645
|
attr_reader :parts
|
|
4580
4646
|
|
|
4581
|
-
# [String] the quote used to delimit the dynamic symbol
|
|
4647
|
+
# [nil | String] the quote used to delimit the dynamic symbol
|
|
4582
4648
|
attr_reader :quote
|
|
4583
4649
|
|
|
4584
4650
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -4776,7 +4842,7 @@ module SyntaxTree
|
|
|
4776
4842
|
# end
|
|
4777
4843
|
#
|
|
4778
4844
|
class Elsif < Node
|
|
4779
|
-
# [
|
|
4845
|
+
# [Node] the expression to be checked
|
|
4780
4846
|
attr_reader :predicate
|
|
4781
4847
|
|
|
4782
4848
|
# [Statements] the expressions to be executed
|
|
@@ -4872,6 +4938,25 @@ module SyntaxTree
|
|
|
4872
4938
|
def initialize(value:, location:)
|
|
4873
4939
|
@value = value
|
|
4874
4940
|
@location = location
|
|
4941
|
+
|
|
4942
|
+
@leading = false
|
|
4943
|
+
@trailing = false
|
|
4944
|
+
end
|
|
4945
|
+
|
|
4946
|
+
def leading!
|
|
4947
|
+
@leading = true
|
|
4948
|
+
end
|
|
4949
|
+
|
|
4950
|
+
def leading?
|
|
4951
|
+
@leading
|
|
4952
|
+
end
|
|
4953
|
+
|
|
4954
|
+
def trailing!
|
|
4955
|
+
@trailing = true
|
|
4956
|
+
end
|
|
4957
|
+
|
|
4958
|
+
def trailing?
|
|
4959
|
+
@trailing
|
|
4875
4960
|
end
|
|
4876
4961
|
|
|
4877
4962
|
def inline?
|
|
@@ -4908,7 +4993,13 @@ module SyntaxTree
|
|
|
4908
4993
|
end
|
|
4909
4994
|
|
|
4910
4995
|
def format(q)
|
|
4911
|
-
q.
|
|
4996
|
+
if (q.parent.is_a?(DefNode) && q.parent.endless?) ||
|
|
4997
|
+
q.parent.is_a?(Statements)
|
|
4998
|
+
q.trim
|
|
4999
|
+
else
|
|
5000
|
+
q.breakable_return
|
|
5001
|
+
end
|
|
5002
|
+
|
|
4912
5003
|
q.text(value)
|
|
4913
5004
|
end
|
|
4914
5005
|
|
|
@@ -5177,7 +5268,7 @@ module SyntaxTree
|
|
|
5177
5268
|
# object.variable = value
|
|
5178
5269
|
#
|
|
5179
5270
|
class Field < Node
|
|
5180
|
-
# [
|
|
5271
|
+
# [Node] the parent object that owns the field being assigned
|
|
5181
5272
|
attr_reader :parent
|
|
5182
5273
|
|
|
5183
5274
|
# [:"::" | Op | Period] the operator being used for the assignment
|
|
@@ -5303,13 +5394,13 @@ module SyntaxTree
|
|
|
5303
5394
|
# end
|
|
5304
5395
|
#
|
|
5305
5396
|
class FndPtn < Node
|
|
5306
|
-
# [nil |
|
|
5397
|
+
# [nil | Node] the optional constant wrapper
|
|
5307
5398
|
attr_reader :constant
|
|
5308
5399
|
|
|
5309
5400
|
# [VarField] the splat on the left-hand side
|
|
5310
5401
|
attr_reader :left
|
|
5311
5402
|
|
|
5312
|
-
# [Array[
|
|
5403
|
+
# [Array[ Node ]] the list of positional expressions in the pattern that
|
|
5313
5404
|
# are being matched
|
|
5314
5405
|
attr_reader :values
|
|
5315
5406
|
|
|
@@ -5405,7 +5496,7 @@ module SyntaxTree
|
|
|
5405
5496
|
# pull values out of the object being enumerated
|
|
5406
5497
|
attr_reader :index
|
|
5407
5498
|
|
|
5408
|
-
# [
|
|
5499
|
+
# [Node] the object being enumerated in the loop
|
|
5409
5500
|
attr_reader :collection
|
|
5410
5501
|
|
|
5411
5502
|
# [Statements] the statements to be executed
|
|
@@ -5884,7 +5975,7 @@ module SyntaxTree
|
|
|
5884
5975
|
# [Label] the keyword being used
|
|
5885
5976
|
attr_reader :key
|
|
5886
5977
|
|
|
5887
|
-
# [
|
|
5978
|
+
# [Node] the optional value for the keyword
|
|
5888
5979
|
attr_reader :value
|
|
5889
5980
|
|
|
5890
5981
|
def initialize(key, value)
|
|
@@ -5897,7 +5988,7 @@ module SyntaxTree
|
|
|
5897
5988
|
end
|
|
5898
5989
|
|
|
5899
5990
|
def format(q)
|
|
5900
|
-
|
|
5991
|
+
HashKeyFormatter::Labels.new.format_key(q, key)
|
|
5901
5992
|
|
|
5902
5993
|
if value
|
|
5903
5994
|
q.text(" ")
|
|
@@ -5925,11 +6016,11 @@ module SyntaxTree
|
|
|
5925
6016
|
end
|
|
5926
6017
|
end
|
|
5927
6018
|
|
|
5928
|
-
# [nil |
|
|
6019
|
+
# [nil | Node] the optional constant wrapper
|
|
5929
6020
|
attr_reader :constant
|
|
5930
6021
|
|
|
5931
|
-
# [Array[ [Label,
|
|
5932
|
-
# that should be matched against in the pattern
|
|
6022
|
+
# [Array[ [DynaSymbol | Label, nil | Node] ]] the set of tuples
|
|
6023
|
+
# representing the keywords that should be matched against in the pattern
|
|
5933
6024
|
attr_reader :keywords
|
|
5934
6025
|
|
|
5935
6026
|
# [nil | VarField] an optional parameter to gather up all remaining keywords
|
|
@@ -6354,7 +6445,7 @@ module SyntaxTree
|
|
|
6354
6445
|
# end
|
|
6355
6446
|
#
|
|
6356
6447
|
class IfNode < Node
|
|
6357
|
-
# [
|
|
6448
|
+
# [Node] the expression to be checked
|
|
6358
6449
|
attr_reader :predicate
|
|
6359
6450
|
|
|
6360
6451
|
# [Statements] the expressions to be executed
|
|
@@ -6427,13 +6518,13 @@ module SyntaxTree
|
|
|
6427
6518
|
# predicate ? truthy : falsy
|
|
6428
6519
|
#
|
|
6429
6520
|
class IfOp < Node
|
|
6430
|
-
# [
|
|
6521
|
+
# [Node] the expression to be checked
|
|
6431
6522
|
attr_reader :predicate
|
|
6432
6523
|
|
|
6433
|
-
# [
|
|
6524
|
+
# [Node] the expression to be executed if the predicate is truthy
|
|
6434
6525
|
attr_reader :truthy
|
|
6435
6526
|
|
|
6436
|
-
# [
|
|
6527
|
+
# [Node] the expression to be executed if the predicate is falsy
|
|
6437
6528
|
attr_reader :falsy
|
|
6438
6529
|
|
|
6439
6530
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -6617,7 +6708,7 @@ module SyntaxTree
|
|
|
6617
6708
|
# end
|
|
6618
6709
|
#
|
|
6619
6710
|
class In < Node
|
|
6620
|
-
# [
|
|
6711
|
+
# [Node] the pattern to check against
|
|
6621
6712
|
attr_reader :pattern
|
|
6622
6713
|
|
|
6623
6714
|
# [Statements] the expressions to execute if the pattern matched
|
|
@@ -7400,7 +7491,7 @@ module SyntaxTree
|
|
|
7400
7491
|
# [MLHS | MLHSParen] the target of the multiple assignment
|
|
7401
7492
|
attr_reader :target
|
|
7402
7493
|
|
|
7403
|
-
# [
|
|
7494
|
+
# [Node] the value being assigned
|
|
7404
7495
|
attr_reader :value
|
|
7405
7496
|
|
|
7406
7497
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -7460,10 +7551,10 @@ module SyntaxTree
|
|
|
7460
7551
|
# method {}
|
|
7461
7552
|
#
|
|
7462
7553
|
class MethodAddBlock < Node
|
|
7463
|
-
# [
|
|
7554
|
+
# [ARef | CallNode | Command | CommandCall | Super | ZSuper] the method call
|
|
7464
7555
|
attr_reader :call
|
|
7465
7556
|
|
|
7466
|
-
# [
|
|
7557
|
+
# [BlockNode] the block being sent with the method call
|
|
7467
7558
|
attr_reader :block
|
|
7468
7559
|
|
|
7469
7560
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -7535,8 +7626,12 @@ module SyntaxTree
|
|
|
7535
7626
|
# first, second, third = value
|
|
7536
7627
|
#
|
|
7537
7628
|
class MLHS < Node
|
|
7538
|
-
#
|
|
7539
|
-
#
|
|
7629
|
+
# [
|
|
7630
|
+
# Array[
|
|
7631
|
+
# ARefField | ArgStar | ConstPathField | Field | Ident | MLHSParen |
|
|
7632
|
+
# TopConstField | VarField
|
|
7633
|
+
# ]
|
|
7634
|
+
# ] the parts of the left-hand side of a multiple assignment
|
|
7540
7635
|
attr_reader :parts
|
|
7541
7636
|
|
|
7542
7637
|
# [boolean] whether or not there is a trailing comma at the end of this
|
|
@@ -7762,7 +7857,7 @@ module SyntaxTree
|
|
|
7762
7857
|
# values = first, second, third
|
|
7763
7858
|
#
|
|
7764
7859
|
class MRHS < Node
|
|
7765
|
-
# Array[
|
|
7860
|
+
# [Array[Node]] the parts that are being assigned
|
|
7766
7861
|
attr_reader :parts
|
|
7767
7862
|
|
|
7768
7863
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -7938,7 +8033,7 @@ module SyntaxTree
|
|
|
7938
8033
|
# [Op] the operator being used for the assignment
|
|
7939
8034
|
attr_reader :operator
|
|
7940
8035
|
|
|
7941
|
-
# [
|
|
8036
|
+
# [Node] the expression to be assigned
|
|
7942
8037
|
attr_reader :value
|
|
7943
8038
|
|
|
7944
8039
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -8095,7 +8190,7 @@ module SyntaxTree
|
|
|
8095
8190
|
# [Ident] the name of the parameter
|
|
8096
8191
|
attr_reader :name
|
|
8097
8192
|
|
|
8098
|
-
# [
|
|
8193
|
+
# [Node] the value of the parameter
|
|
8099
8194
|
attr_reader :value
|
|
8100
8195
|
|
|
8101
8196
|
def initialize(name, value)
|
|
@@ -8120,7 +8215,7 @@ module SyntaxTree
|
|
|
8120
8215
|
# [Ident] the name of the parameter
|
|
8121
8216
|
attr_reader :name
|
|
8122
8217
|
|
|
8123
|
-
# [nil |
|
|
8218
|
+
# [nil | Node] the value of the parameter
|
|
8124
8219
|
attr_reader :value
|
|
8125
8220
|
|
|
8126
8221
|
def initialize(name, value)
|
|
@@ -8161,10 +8256,10 @@ module SyntaxTree
|
|
|
8161
8256
|
end
|
|
8162
8257
|
end
|
|
8163
8258
|
|
|
8164
|
-
# [Array[ Ident ]] any required parameters
|
|
8259
|
+
# [Array[ Ident | MLHSParen ]] any required parameters
|
|
8165
8260
|
attr_reader :requireds
|
|
8166
8261
|
|
|
8167
|
-
# [Array[ [ Ident,
|
|
8262
|
+
# [Array[ [ Ident, Node ] ]] any optional parameters and their default
|
|
8168
8263
|
# values
|
|
8169
8264
|
attr_reader :optionals
|
|
8170
8265
|
|
|
@@ -8176,11 +8271,12 @@ module SyntaxTree
|
|
|
8176
8271
|
# parameter
|
|
8177
8272
|
attr_reader :posts
|
|
8178
8273
|
|
|
8179
|
-
# [Array[ [
|
|
8274
|
+
# [Array[ [ Label, nil | Node ] ]] any keyword parameters and their
|
|
8180
8275
|
# optional default values
|
|
8181
8276
|
attr_reader :keywords
|
|
8182
8277
|
|
|
8183
|
-
# [nil | :nil | KwRestParam] the optional keyword rest
|
|
8278
|
+
# [nil | :nil | ArgsForward | KwRestParam] the optional keyword rest
|
|
8279
|
+
# parameter
|
|
8184
8280
|
attr_reader :keyword_rest
|
|
8185
8281
|
|
|
8186
8282
|
# [nil | BlockArg] the optional block parameter
|
|
@@ -8369,7 +8465,7 @@ module SyntaxTree
|
|
|
8369
8465
|
# [LParen] the left parenthesis that opened this statement
|
|
8370
8466
|
attr_reader :lparen
|
|
8371
8467
|
|
|
8372
|
-
# [nil |
|
|
8468
|
+
# [nil | Node] the expression inside the parentheses
|
|
8373
8469
|
attr_reader :contents
|
|
8374
8470
|
|
|
8375
8471
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -9218,7 +9314,7 @@ module SyntaxTree
|
|
|
9218
9314
|
# end
|
|
9219
9315
|
#
|
|
9220
9316
|
class RescueEx < Node
|
|
9221
|
-
# [
|
|
9317
|
+
# [nil | Node] the list of exceptions being rescued
|
|
9222
9318
|
attr_reader :exceptions
|
|
9223
9319
|
|
|
9224
9320
|
# [nil | Field | VarField] the expression being used to capture the raised
|
|
@@ -9296,7 +9392,7 @@ module SyntaxTree
|
|
|
9296
9392
|
# [Kw] the rescue keyword
|
|
9297
9393
|
attr_reader :keyword
|
|
9298
9394
|
|
|
9299
|
-
# [RescueEx] the exceptions being rescued
|
|
9395
|
+
# [nil | RescueEx] the exceptions being rescued
|
|
9300
9396
|
attr_reader :exception
|
|
9301
9397
|
|
|
9302
9398
|
# [Statements] the expressions to evaluate when an error is rescued
|
|
@@ -9416,10 +9512,10 @@ module SyntaxTree
|
|
|
9416
9512
|
# expression rescue value
|
|
9417
9513
|
#
|
|
9418
9514
|
class RescueMod < Node
|
|
9419
|
-
# [
|
|
9515
|
+
# [Node] the expression to execute
|
|
9420
9516
|
attr_reader :statement
|
|
9421
9517
|
|
|
9422
|
-
# [
|
|
9518
|
+
# [Node] the value to use if the executed expression raises an error
|
|
9423
9519
|
attr_reader :value
|
|
9424
9520
|
|
|
9425
9521
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -9678,7 +9774,7 @@ module SyntaxTree
|
|
|
9678
9774
|
# end
|
|
9679
9775
|
#
|
|
9680
9776
|
class SClass < Node
|
|
9681
|
-
# [
|
|
9777
|
+
# [Node] the target of the singleton class to enter
|
|
9682
9778
|
attr_reader :target
|
|
9683
9779
|
|
|
9684
9780
|
# [BodyStmt] the expressions to be executed
|
|
@@ -9752,23 +9848,19 @@ module SyntaxTree
|
|
|
9752
9848
|
# propagate that onto void_stmt nodes inside the stmts in order to make sure
|
|
9753
9849
|
# all comments get printed appropriately.
|
|
9754
9850
|
class Statements < Node
|
|
9755
|
-
# [
|
|
9756
|
-
attr_reader :parser
|
|
9757
|
-
|
|
9758
|
-
# [Array[ untyped ]] the list of expressions contained within this node
|
|
9851
|
+
# [Array[ Node ]] the list of expressions contained within this node
|
|
9759
9852
|
attr_reader :body
|
|
9760
9853
|
|
|
9761
9854
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
9762
9855
|
attr_reader :comments
|
|
9763
9856
|
|
|
9764
|
-
def initialize(
|
|
9765
|
-
@parser = parser
|
|
9857
|
+
def initialize(body:, location:)
|
|
9766
9858
|
@body = body
|
|
9767
9859
|
@location = location
|
|
9768
9860
|
@comments = []
|
|
9769
9861
|
end
|
|
9770
9862
|
|
|
9771
|
-
def bind(start_char, start_column, end_char, end_column)
|
|
9863
|
+
def bind(parser, start_char, start_column, end_char, end_column)
|
|
9772
9864
|
@location =
|
|
9773
9865
|
Location.new(
|
|
9774
9866
|
start_line: location.start_line,
|
|
@@ -9794,7 +9886,7 @@ module SyntaxTree
|
|
|
9794
9886
|
body[0] = VoidStmt.new(location: location)
|
|
9795
9887
|
end
|
|
9796
9888
|
|
|
9797
|
-
attach_comments(start_char, end_char)
|
|
9889
|
+
attach_comments(parser, start_char, end_char)
|
|
9798
9890
|
end
|
|
9799
9891
|
|
|
9800
9892
|
def bind_end(end_char, end_column)
|
|
@@ -9826,7 +9918,6 @@ module SyntaxTree
|
|
|
9826
9918
|
def copy(body: nil, location: nil)
|
|
9827
9919
|
node =
|
|
9828
9920
|
Statements.new(
|
|
9829
|
-
parser,
|
|
9830
9921
|
body: body || self.body,
|
|
9831
9922
|
location: location || self.location
|
|
9832
9923
|
)
|
|
@@ -9838,7 +9929,7 @@ module SyntaxTree
|
|
|
9838
9929
|
alias deconstruct child_nodes
|
|
9839
9930
|
|
|
9840
9931
|
def deconstruct_keys(_keys)
|
|
9841
|
-
{
|
|
9932
|
+
{ body: body, location: location, comments: comments }
|
|
9842
9933
|
end
|
|
9843
9934
|
|
|
9844
9935
|
def format(q)
|
|
@@ -9898,7 +9989,7 @@ module SyntaxTree
|
|
|
9898
9989
|
# As efficiently as possible, gather up all of the comments that have been
|
|
9899
9990
|
# found while this statements list was being parsed and add them into the
|
|
9900
9991
|
# body.
|
|
9901
|
-
def attach_comments(start_char, end_char)
|
|
9992
|
+
def attach_comments(parser, start_char, end_char)
|
|
9902
9993
|
parser_comments = parser.comments
|
|
9903
9994
|
|
|
9904
9995
|
comment_index = 0
|
|
@@ -9945,9 +10036,13 @@ module SyntaxTree
|
|
|
9945
10036
|
# string
|
|
9946
10037
|
attr_reader :parts
|
|
9947
10038
|
|
|
10039
|
+
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
10040
|
+
attr_reader :comments
|
|
10041
|
+
|
|
9948
10042
|
def initialize(parts:, location:)
|
|
9949
10043
|
@parts = parts
|
|
9950
10044
|
@location = location
|
|
10045
|
+
@comments = []
|
|
9951
10046
|
end
|
|
9952
10047
|
|
|
9953
10048
|
def accept(visitor)
|
|
@@ -9974,6 +10069,33 @@ module SyntaxTree
|
|
|
9974
10069
|
def ===(other)
|
|
9975
10070
|
other.is_a?(StringContent) && ArrayMatch.call(parts, other.parts)
|
|
9976
10071
|
end
|
|
10072
|
+
|
|
10073
|
+
def format(q)
|
|
10074
|
+
q.text(q.quote)
|
|
10075
|
+
q.group do
|
|
10076
|
+
parts.each do |part|
|
|
10077
|
+
if part.is_a?(TStringContent)
|
|
10078
|
+
value = Quotes.normalize(part.value, q.quote)
|
|
10079
|
+
first = true
|
|
10080
|
+
|
|
10081
|
+
value.each_line(chomp: true) do |line|
|
|
10082
|
+
if first
|
|
10083
|
+
first = false
|
|
10084
|
+
else
|
|
10085
|
+
q.breakable_return
|
|
10086
|
+
end
|
|
10087
|
+
|
|
10088
|
+
q.text(line)
|
|
10089
|
+
end
|
|
10090
|
+
|
|
10091
|
+
q.breakable_return if value.end_with?("\n")
|
|
10092
|
+
else
|
|
10093
|
+
q.format(part)
|
|
10094
|
+
end
|
|
10095
|
+
end
|
|
10096
|
+
end
|
|
10097
|
+
q.text(q.quote)
|
|
10098
|
+
end
|
|
9977
10099
|
end
|
|
9978
10100
|
|
|
9979
10101
|
# StringConcat represents concatenating two strings together using a backward
|
|
@@ -9983,7 +10105,8 @@ module SyntaxTree
|
|
|
9983
10105
|
# "second"
|
|
9984
10106
|
#
|
|
9985
10107
|
class StringConcat < Node
|
|
9986
|
-
# [StringConcat | StringLiteral] the left side of the
|
|
10108
|
+
# [Heredoc | StringConcat | StringLiteral] the left side of the
|
|
10109
|
+
# concatenation
|
|
9987
10110
|
attr_reader :left
|
|
9988
10111
|
|
|
9989
10112
|
# [StringLiteral] the right side of the concatenation
|
|
@@ -10180,7 +10303,7 @@ module SyntaxTree
|
|
|
10180
10303
|
# string literal
|
|
10181
10304
|
attr_reader :parts
|
|
10182
10305
|
|
|
10183
|
-
# [String] which quote was used by the string literal
|
|
10306
|
+
# [nil | String] which quote was used by the string literal
|
|
10184
10307
|
attr_reader :quote
|
|
10185
10308
|
|
|
10186
10309
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -10425,8 +10548,8 @@ module SyntaxTree
|
|
|
10425
10548
|
# :symbol
|
|
10426
10549
|
#
|
|
10427
10550
|
class SymbolLiteral < Node
|
|
10428
|
-
# [Backtick | Const | CVar | GVar | Ident | IVar | Kw | Op
|
|
10429
|
-
# symbol
|
|
10551
|
+
# [Backtick | Const | CVar | GVar | Ident | IVar | Kw | Op | TStringContent]
|
|
10552
|
+
# the value of the symbol
|
|
10430
10553
|
attr_reader :value
|
|
10431
10554
|
|
|
10432
10555
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -10465,6 +10588,7 @@ module SyntaxTree
|
|
|
10465
10588
|
|
|
10466
10589
|
def format(q)
|
|
10467
10590
|
q.text(":")
|
|
10591
|
+
q.text("\\") if value.comments.any?
|
|
10468
10592
|
q.format(value)
|
|
10469
10593
|
end
|
|
10470
10594
|
|
|
@@ -10934,7 +11058,7 @@ module SyntaxTree
|
|
|
10934
11058
|
# not value
|
|
10935
11059
|
#
|
|
10936
11060
|
class Not < Node
|
|
10937
|
-
# [nil |
|
|
11061
|
+
# [nil | Node] the statement on which to operate
|
|
10938
11062
|
attr_reader :statement
|
|
10939
11063
|
|
|
10940
11064
|
# [boolean] whether or not parentheses were used
|
|
@@ -11021,7 +11145,7 @@ module SyntaxTree
|
|
|
11021
11145
|
# [String] the operator being used
|
|
11022
11146
|
attr_reader :operator
|
|
11023
11147
|
|
|
11024
|
-
# [
|
|
11148
|
+
# [Node] the statement on which to operate
|
|
11025
11149
|
attr_reader :statement
|
|
11026
11150
|
|
|
11027
11151
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -11165,7 +11289,7 @@ module SyntaxTree
|
|
|
11165
11289
|
# end
|
|
11166
11290
|
#
|
|
11167
11291
|
class UnlessNode < Node
|
|
11168
|
-
# [
|
|
11292
|
+
# [Node] the expression to be checked
|
|
11169
11293
|
attr_reader :predicate
|
|
11170
11294
|
|
|
11171
11295
|
# [Statements] the expressions to be executed
|
|
@@ -11311,7 +11435,7 @@ module SyntaxTree
|
|
|
11311
11435
|
# end
|
|
11312
11436
|
#
|
|
11313
11437
|
class UntilNode < Node
|
|
11314
|
-
# [
|
|
11438
|
+
# [Node] the expression to be checked
|
|
11315
11439
|
attr_reader :predicate
|
|
11316
11440
|
|
|
11317
11441
|
# [Statements] the expressions to be executed
|
|
@@ -11379,7 +11503,7 @@ module SyntaxTree
|
|
|
11379
11503
|
#
|
|
11380
11504
|
# In the example above, the VarField node represents the +variable+ token.
|
|
11381
11505
|
class VarField < Node
|
|
11382
|
-
# [nil | Const | CVar | GVar | Ident | IVar] the target of this node
|
|
11506
|
+
# [nil | :nil | Const | CVar | GVar | Ident | IVar] the target of this node
|
|
11383
11507
|
attr_reader :value
|
|
11384
11508
|
|
|
11385
11509
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -11490,8 +11614,9 @@ module SyntaxTree
|
|
|
11490
11614
|
#
|
|
11491
11615
|
# To be clear, this method should just not exist. It's not good. It's a
|
|
11492
11616
|
# place of shame. But it's necessary for now, so I'm keeping it.
|
|
11493
|
-
def pin(parent)
|
|
11494
|
-
replace =
|
|
11617
|
+
def pin(parent, pin)
|
|
11618
|
+
replace =
|
|
11619
|
+
PinnedVarRef.new(value: value, location: pin.location.to(location))
|
|
11495
11620
|
|
|
11496
11621
|
parent
|
|
11497
11622
|
.deconstruct_keys([])
|
|
@@ -11517,7 +11642,7 @@ module SyntaxTree
|
|
|
11517
11642
|
# This can be a plain local variable like the example above. It can also be a
|
|
11518
11643
|
# a class variable, a global variable, or an instance variable.
|
|
11519
11644
|
class PinnedVarRef < Node
|
|
11520
|
-
# [
|
|
11645
|
+
# [Const | CVar | GVar | Ident | IVar] the value of this node
|
|
11521
11646
|
attr_reader :value
|
|
11522
11647
|
|
|
11523
11648
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
@@ -11631,9 +11756,6 @@ module SyntaxTree
|
|
|
11631
11756
|
# ;;
|
|
11632
11757
|
#
|
|
11633
11758
|
class VoidStmt < Node
|
|
11634
|
-
# [Location] the location of this node
|
|
11635
|
-
attr_reader :location
|
|
11636
|
-
|
|
11637
11759
|
# [Array[ Comment | EmbDoc ]] the comments attached to this node
|
|
11638
11760
|
attr_reader :comments
|
|
11639
11761
|
|
|
@@ -11794,7 +11916,7 @@ module SyntaxTree
|
|
|
11794
11916
|
# end
|
|
11795
11917
|
#
|
|
11796
11918
|
class WhileNode < Node
|
|
11797
|
-
# [
|
|
11919
|
+
# [Node] the expression to be checked
|
|
11798
11920
|
attr_reader :predicate
|
|
11799
11921
|
|
|
11800
11922
|
# [Statements] the expressions to be executed
|