syntax_tree 4.3.0 → 5.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitattributes +1 -0
- data/.rubocop.yml +1 -1
- data/CHANGELOG.md +26 -1
- data/Gemfile.lock +4 -4
- data/README.md +111 -12
- data/lib/syntax_tree/cli.rb +57 -25
- data/lib/syntax_tree/formatter.rb +56 -20
- data/lib/syntax_tree/node.rb +3119 -1409
- data/lib/syntax_tree/parser.rb +118 -92
- data/lib/syntax_tree/pattern.rb +3 -3
- data/lib/syntax_tree/plugin/single_quotes.rb +5 -1
- data/lib/syntax_tree/plugin/trailing_comma.rb +5 -1
- data/lib/syntax_tree/version.rb +1 -1
- data/lib/syntax_tree/visitor/environment.rb +7 -4
- data/lib/syntax_tree/visitor/field_visitor.rb +23 -117
- data/lib/syntax_tree/visitor/mutation_visitor.rb +924 -0
- data/lib/syntax_tree/visitor/with_environment.rb +0 -8
- data/lib/syntax_tree/visitor.rb +12 -48
- data/lib/syntax_tree.rb +14 -2
- data/syntax_tree.gemspec +1 -1
- metadata +6 -4
data/lib/syntax_tree/parser.rb
CHANGED
@@ -421,11 +421,11 @@ module SyntaxTree
|
|
421
421
|
# on_alias: (
|
422
422
|
# (DynaSymbol | SymbolLiteral) left,
|
423
423
|
# (DynaSymbol | SymbolLiteral) right
|
424
|
-
# ) ->
|
424
|
+
# ) -> AliasNode
|
425
425
|
def on_alias(left, right)
|
426
426
|
keyword = consume_keyword(:alias)
|
427
427
|
|
428
|
-
|
428
|
+
AliasNode.new(
|
429
429
|
left: left,
|
430
430
|
right: right,
|
431
431
|
location: keyword.location.to(right.location)
|
@@ -575,7 +575,7 @@ module SyntaxTree
|
|
575
575
|
def on_args_forward
|
576
576
|
op = consume_operator(:"...")
|
577
577
|
|
578
|
-
ArgsForward.new(
|
578
|
+
ArgsForward.new(location: op.location)
|
579
579
|
end
|
580
580
|
|
581
581
|
# :call-seq:
|
@@ -920,7 +920,7 @@ module SyntaxTree
|
|
920
920
|
# on_brace_block: (
|
921
921
|
# (nil | BlockVar) block_var,
|
922
922
|
# Statements statements
|
923
|
-
# ) ->
|
923
|
+
# ) -> BlockNode
|
924
924
|
def on_brace_block(block_var, statements)
|
925
925
|
lbrace = consume_token(LBrace)
|
926
926
|
rbrace = consume_token(RBrace)
|
@@ -947,10 +947,10 @@ module SyntaxTree
|
|
947
947
|
end_column: rbrace.location.end_column
|
948
948
|
)
|
949
949
|
|
950
|
-
|
951
|
-
|
950
|
+
BlockNode.new(
|
951
|
+
opening: lbrace,
|
952
952
|
block_var: block_var,
|
953
|
-
|
953
|
+
bodystmt: statements,
|
954
954
|
location: location
|
955
955
|
)
|
956
956
|
end
|
@@ -971,7 +971,7 @@ module SyntaxTree
|
|
971
971
|
# untyped receiver,
|
972
972
|
# (:"::" | Op | Period) operator,
|
973
973
|
# (:call | Backtick | Const | Ident | Op) message
|
974
|
-
# ) ->
|
974
|
+
# ) -> CallNode
|
975
975
|
def on_call(receiver, operator, message)
|
976
976
|
ending =
|
977
977
|
if message != :call
|
@@ -982,7 +982,7 @@ module SyntaxTree
|
|
982
982
|
receiver
|
983
983
|
end
|
984
984
|
|
985
|
-
|
985
|
+
CallNode.new(
|
986
986
|
receiver: receiver,
|
987
987
|
operator: operator,
|
988
988
|
message: message,
|
@@ -1076,6 +1076,7 @@ module SyntaxTree
|
|
1076
1076
|
Command.new(
|
1077
1077
|
message: message,
|
1078
1078
|
arguments: arguments,
|
1079
|
+
block: nil,
|
1079
1080
|
location: message.location.to(arguments.location)
|
1080
1081
|
)
|
1081
1082
|
end
|
@@ -1095,6 +1096,7 @@ module SyntaxTree
|
|
1095
1096
|
operator: operator,
|
1096
1097
|
message: message,
|
1097
1098
|
arguments: arguments,
|
1099
|
+
block: nil,
|
1098
1100
|
location: receiver.location.to(ending.location)
|
1099
1101
|
)
|
1100
1102
|
end
|
@@ -1181,7 +1183,7 @@ module SyntaxTree
|
|
1181
1183
|
# (Backtick | Const | Ident | Kw | Op) name,
|
1182
1184
|
# (nil | Params | Paren) params,
|
1183
1185
|
# untyped bodystmt
|
1184
|
-
# ) ->
|
1186
|
+
# ) -> DefNode
|
1185
1187
|
def on_def(name, params, bodystmt)
|
1186
1188
|
# Make sure to delete this token in case you're defining something like
|
1187
1189
|
# def class which would lead to this being a kw and causing all kinds of
|
@@ -1223,7 +1225,9 @@ module SyntaxTree
|
|
1223
1225
|
ending.location.start_column
|
1224
1226
|
)
|
1225
1227
|
|
1226
|
-
|
1228
|
+
DefNode.new(
|
1229
|
+
target: nil,
|
1230
|
+
operator: nil,
|
1227
1231
|
name: name,
|
1228
1232
|
params: params,
|
1229
1233
|
bodystmt: bodystmt,
|
@@ -1234,12 +1238,12 @@ module SyntaxTree
|
|
1234
1238
|
# the statements list. Before, it was just the individual statement.
|
1235
1239
|
statement = bodystmt.is_a?(BodyStmt) ? bodystmt.statements : bodystmt
|
1236
1240
|
|
1237
|
-
|
1241
|
+
DefNode.new(
|
1238
1242
|
target: nil,
|
1239
1243
|
operator: nil,
|
1240
1244
|
name: name,
|
1241
|
-
|
1242
|
-
|
1245
|
+
params: params,
|
1246
|
+
bodystmt: statement,
|
1243
1247
|
location: beginning.location.to(bodystmt.location)
|
1244
1248
|
)
|
1245
1249
|
end
|
@@ -1270,7 +1274,7 @@ module SyntaxTree
|
|
1270
1274
|
# (Backtick | Const | Ident | Kw | Op) name,
|
1271
1275
|
# (Params | Paren) params,
|
1272
1276
|
# BodyStmt bodystmt
|
1273
|
-
# ) ->
|
1277
|
+
# ) -> DefNode
|
1274
1278
|
def on_defs(target, operator, name, params, bodystmt)
|
1275
1279
|
# Make sure to delete this token in case you're defining something
|
1276
1280
|
# like def class which would lead to this being a kw and causing all kinds
|
@@ -1309,7 +1313,7 @@ module SyntaxTree
|
|
1309
1313
|
ending.location.start_column
|
1310
1314
|
)
|
1311
1315
|
|
1312
|
-
|
1316
|
+
DefNode.new(
|
1313
1317
|
target: target,
|
1314
1318
|
operator: operator,
|
1315
1319
|
name: name,
|
@@ -1322,19 +1326,19 @@ module SyntaxTree
|
|
1322
1326
|
# the statements list. Before, it was just the individual statement.
|
1323
1327
|
statement = bodystmt.is_a?(BodyStmt) ? bodystmt.statements : bodystmt
|
1324
1328
|
|
1325
|
-
|
1329
|
+
DefNode.new(
|
1326
1330
|
target: target,
|
1327
1331
|
operator: operator,
|
1328
1332
|
name: name,
|
1329
|
-
|
1330
|
-
|
1333
|
+
params: params,
|
1334
|
+
bodystmt: statement,
|
1331
1335
|
location: beginning.location.to(bodystmt.location)
|
1332
1336
|
)
|
1333
1337
|
end
|
1334
1338
|
end
|
1335
1339
|
|
1336
1340
|
# :call-seq:
|
1337
|
-
# on_do_block: (BlockVar block_var, BodyStmt bodystmt) ->
|
1341
|
+
# on_do_block: (BlockVar block_var, BodyStmt bodystmt) -> BlockNode
|
1338
1342
|
def on_do_block(block_var, bodystmt)
|
1339
1343
|
beginning = consume_keyword(:do)
|
1340
1344
|
ending = consume_keyword(:end)
|
@@ -1348,8 +1352,8 @@ module SyntaxTree
|
|
1348
1352
|
ending.location.start_column
|
1349
1353
|
)
|
1350
1354
|
|
1351
|
-
|
1352
|
-
|
1355
|
+
BlockNode.new(
|
1356
|
+
opening: beginning,
|
1353
1357
|
block_var: block_var,
|
1354
1358
|
bodystmt: bodystmt,
|
1355
1359
|
location: beginning.location.to(ending.location)
|
@@ -1357,30 +1361,32 @@ module SyntaxTree
|
|
1357
1361
|
end
|
1358
1362
|
|
1359
1363
|
# :call-seq:
|
1360
|
-
# on_dot2: ((nil | untyped) left, (nil | untyped) right) ->
|
1364
|
+
# on_dot2: ((nil | untyped) left, (nil | untyped) right) -> RangeNode
|
1361
1365
|
def on_dot2(left, right)
|
1362
1366
|
operator = consume_operator(:"..")
|
1363
1367
|
|
1364
1368
|
beginning = left || operator
|
1365
1369
|
ending = right || operator
|
1366
1370
|
|
1367
|
-
|
1371
|
+
RangeNode.new(
|
1368
1372
|
left: left,
|
1373
|
+
operator: operator,
|
1369
1374
|
right: right,
|
1370
1375
|
location: beginning.location.to(ending.location)
|
1371
1376
|
)
|
1372
1377
|
end
|
1373
1378
|
|
1374
1379
|
# :call-seq:
|
1375
|
-
# on_dot3: ((nil | untyped) left, (nil | untyped) right) ->
|
1380
|
+
# on_dot3: ((nil | untyped) left, (nil | untyped) right) -> RangeNode
|
1376
1381
|
def on_dot3(left, right)
|
1377
1382
|
operator = consume_operator(:"...")
|
1378
1383
|
|
1379
1384
|
beginning = left || operator
|
1380
1385
|
ending = right || operator
|
1381
1386
|
|
1382
|
-
|
1387
|
+
RangeNode.new(
|
1383
1388
|
left: left,
|
1389
|
+
operator: operator,
|
1384
1390
|
right: right,
|
1385
1391
|
location: beginning.location.to(ending.location)
|
1386
1392
|
)
|
@@ -1608,9 +1614,15 @@ module SyntaxTree
|
|
1608
1614
|
end
|
1609
1615
|
|
1610
1616
|
# :call-seq:
|
1611
|
-
# on_fcall: ((Const | Ident) value) ->
|
1617
|
+
# on_fcall: ((Const | Ident) value) -> CallNode
|
1612
1618
|
def on_fcall(value)
|
1613
|
-
|
1619
|
+
CallNode.new(
|
1620
|
+
receiver: nil,
|
1621
|
+
operator: nil,
|
1622
|
+
message: value,
|
1623
|
+
arguments: nil,
|
1624
|
+
location: value.location
|
1625
|
+
)
|
1614
1626
|
end
|
1615
1627
|
|
1616
1628
|
# :call-seq:
|
@@ -1878,7 +1890,7 @@ module SyntaxTree
|
|
1878
1890
|
# untyped predicate,
|
1879
1891
|
# Statements statements,
|
1880
1892
|
# (nil | Elsif | Else) consequent
|
1881
|
-
# ) ->
|
1893
|
+
# ) -> IfNode
|
1882
1894
|
def on_if(predicate, statements, consequent)
|
1883
1895
|
beginning = consume_keyword(:if)
|
1884
1896
|
ending = consequent || consume_keyword(:end)
|
@@ -1891,7 +1903,7 @@ module SyntaxTree
|
|
1891
1903
|
ending.location.start_column
|
1892
1904
|
)
|
1893
1905
|
|
1894
|
-
|
1906
|
+
IfNode.new(
|
1895
1907
|
predicate: predicate,
|
1896
1908
|
statements: statements,
|
1897
1909
|
consequent: consequent,
|
@@ -1911,13 +1923,15 @@ module SyntaxTree
|
|
1911
1923
|
end
|
1912
1924
|
|
1913
1925
|
# :call-seq:
|
1914
|
-
# on_if_mod: (untyped predicate, untyped statement) ->
|
1926
|
+
# on_if_mod: (untyped predicate, untyped statement) -> IfNode
|
1915
1927
|
def on_if_mod(predicate, statement)
|
1916
1928
|
consume_keyword(:if)
|
1917
1929
|
|
1918
|
-
|
1919
|
-
statement: statement,
|
1930
|
+
IfNode.new(
|
1920
1931
|
predicate: predicate,
|
1932
|
+
statements:
|
1933
|
+
Statements.new(self, body: [statement], location: statement.location),
|
1934
|
+
consequent: nil,
|
1921
1935
|
location: statement.location.to(predicate.location)
|
1922
1936
|
)
|
1923
1937
|
end
|
@@ -2104,17 +2118,20 @@ module SyntaxTree
|
|
2104
2118
|
location = params.contents.location
|
2105
2119
|
location = location.to(locals.last.location) if locals.any?
|
2106
2120
|
|
2107
|
-
|
2108
|
-
|
2109
|
-
|
2110
|
-
|
2111
|
-
|
2112
|
-
|
2113
|
-
|
2114
|
-
|
2115
|
-
|
2116
|
-
|
2117
|
-
|
2121
|
+
node =
|
2122
|
+
Paren.new(
|
2123
|
+
lparen: params.lparen,
|
2124
|
+
contents:
|
2125
|
+
LambdaVar.new(
|
2126
|
+
params: params.contents,
|
2127
|
+
locals: locals,
|
2128
|
+
location: location
|
2129
|
+
),
|
2130
|
+
location: params.location
|
2131
|
+
)
|
2132
|
+
|
2133
|
+
node.comments.concat(params.comments)
|
2134
|
+
node
|
2118
2135
|
when Params
|
2119
2136
|
# In this case we've gotten to the <3.2 plain set of parameters. In
|
2120
2137
|
# this case there cannot be lambda locals, so we will wrap the
|
@@ -2302,37 +2319,42 @@ module SyntaxTree
|
|
2302
2319
|
|
2303
2320
|
# :call-seq:
|
2304
2321
|
# on_method_add_arg: (
|
2305
|
-
#
|
2322
|
+
# CallNode call,
|
2306
2323
|
# (ArgParen | Args) arguments
|
2307
|
-
# ) ->
|
2324
|
+
# ) -> CallNode
|
2308
2325
|
def on_method_add_arg(call, arguments)
|
2309
2326
|
location = call.location
|
2310
2327
|
location = location.to(arguments.location) if arguments.is_a?(ArgParen)
|
2311
2328
|
|
2312
|
-
|
2313
|
-
|
2314
|
-
|
2315
|
-
|
2316
|
-
|
2317
|
-
|
2318
|
-
|
2319
|
-
arguments: arguments,
|
2320
|
-
location: location
|
2321
|
-
)
|
2322
|
-
end
|
2329
|
+
CallNode.new(
|
2330
|
+
receiver: call.receiver,
|
2331
|
+
operator: call.operator,
|
2332
|
+
message: call.message,
|
2333
|
+
arguments: arguments,
|
2334
|
+
location: location
|
2335
|
+
)
|
2323
2336
|
end
|
2324
2337
|
|
2325
2338
|
# :call-seq:
|
2326
2339
|
# on_method_add_block: (
|
2327
|
-
# (Call | Command | CommandCall
|
2328
|
-
#
|
2340
|
+
# (Call | Command | CommandCall) call,
|
2341
|
+
# Block block
|
2329
2342
|
# ) -> MethodAddBlock
|
2330
2343
|
def on_method_add_block(call, block)
|
2331
|
-
|
2332
|
-
|
2333
|
-
|
2334
|
-
|
2335
|
-
|
2344
|
+
location = call.location.to(block.location)
|
2345
|
+
|
2346
|
+
case call
|
2347
|
+
when Command, CommandCall
|
2348
|
+
node = call.copy(block: block, location: location)
|
2349
|
+
node.comments.concat(call.comments)
|
2350
|
+
node
|
2351
|
+
else
|
2352
|
+
MethodAddBlock.new(
|
2353
|
+
call: call,
|
2354
|
+
block: block,
|
2355
|
+
location: call.location.to(block.location)
|
2356
|
+
)
|
2357
|
+
end
|
2336
2358
|
end
|
2337
2359
|
|
2338
2360
|
# :call-seq:
|
@@ -2900,7 +2922,7 @@ module SyntaxTree
|
|
2900
2922
|
def on_redo
|
2901
2923
|
keyword = consume_keyword(:redo)
|
2902
2924
|
|
2903
|
-
Redo.new(
|
2925
|
+
Redo.new(location: keyword.location)
|
2904
2926
|
end
|
2905
2927
|
|
2906
2928
|
# :call-seq:
|
@@ -3066,26 +3088,26 @@ module SyntaxTree
|
|
3066
3088
|
def on_retry
|
3067
3089
|
keyword = consume_keyword(:retry)
|
3068
3090
|
|
3069
|
-
Retry.new(
|
3091
|
+
Retry.new(location: keyword.location)
|
3070
3092
|
end
|
3071
3093
|
|
3072
3094
|
# :call-seq:
|
3073
|
-
# on_return: (Args arguments) ->
|
3095
|
+
# on_return: (Args arguments) -> ReturnNode
|
3074
3096
|
def on_return(arguments)
|
3075
3097
|
keyword = consume_keyword(:return)
|
3076
3098
|
|
3077
|
-
|
3099
|
+
ReturnNode.new(
|
3078
3100
|
arguments: arguments,
|
3079
3101
|
location: keyword.location.to(arguments.location)
|
3080
3102
|
)
|
3081
3103
|
end
|
3082
3104
|
|
3083
3105
|
# :call-seq:
|
3084
|
-
# on_return0: () ->
|
3106
|
+
# on_return0: () -> ReturnNode
|
3085
3107
|
def on_return0
|
3086
3108
|
keyword = consume_keyword(:return)
|
3087
3109
|
|
3088
|
-
|
3110
|
+
ReturnNode.new(arguments: nil, location: keyword.location)
|
3089
3111
|
end
|
3090
3112
|
|
3091
3113
|
# :call-seq:
|
@@ -3562,7 +3584,7 @@ module SyntaxTree
|
|
3562
3584
|
# untyped predicate,
|
3563
3585
|
# Statements statements,
|
3564
3586
|
# ((nil | Elsif | Else) consequent)
|
3565
|
-
# ) ->
|
3587
|
+
# ) -> UnlessNode
|
3566
3588
|
def on_unless(predicate, statements, consequent)
|
3567
3589
|
beginning = consume_keyword(:unless)
|
3568
3590
|
ending = consequent || consume_keyword(:end)
|
@@ -3575,7 +3597,7 @@ module SyntaxTree
|
|
3575
3597
|
ending.location.start_column
|
3576
3598
|
)
|
3577
3599
|
|
3578
|
-
|
3600
|
+
UnlessNode.new(
|
3579
3601
|
predicate: predicate,
|
3580
3602
|
statements: statements,
|
3581
3603
|
consequent: consequent,
|
@@ -3584,19 +3606,21 @@ module SyntaxTree
|
|
3584
3606
|
end
|
3585
3607
|
|
3586
3608
|
# :call-seq:
|
3587
|
-
# on_unless_mod: (untyped predicate, untyped statement) ->
|
3609
|
+
# on_unless_mod: (untyped predicate, untyped statement) -> UnlessNode
|
3588
3610
|
def on_unless_mod(predicate, statement)
|
3589
3611
|
consume_keyword(:unless)
|
3590
3612
|
|
3591
|
-
|
3592
|
-
statement: statement,
|
3613
|
+
UnlessNode.new(
|
3593
3614
|
predicate: predicate,
|
3615
|
+
statements:
|
3616
|
+
Statements.new(self, body: [statement], location: statement.location),
|
3617
|
+
consequent: nil,
|
3594
3618
|
location: statement.location.to(predicate.location)
|
3595
3619
|
)
|
3596
3620
|
end
|
3597
3621
|
|
3598
3622
|
# :call-seq:
|
3599
|
-
# on_until: (untyped predicate, Statements statements) ->
|
3623
|
+
# on_until: (untyped predicate, Statements statements) -> UntilNode
|
3600
3624
|
def on_until(predicate, statements)
|
3601
3625
|
beginning = consume_keyword(:until)
|
3602
3626
|
ending = consume_keyword(:end)
|
@@ -3618,7 +3642,7 @@ module SyntaxTree
|
|
3618
3642
|
ending.location.start_column
|
3619
3643
|
)
|
3620
3644
|
|
3621
|
-
|
3645
|
+
UntilNode.new(
|
3622
3646
|
predicate: predicate,
|
3623
3647
|
statements: statements,
|
3624
3648
|
location: beginning.location.to(ending.location)
|
@@ -3626,23 +3650,24 @@ module SyntaxTree
|
|
3626
3650
|
end
|
3627
3651
|
|
3628
3652
|
# :call-seq:
|
3629
|
-
# on_until_mod: (untyped predicate, untyped statement) ->
|
3653
|
+
# on_until_mod: (untyped predicate, untyped statement) -> UntilNode
|
3630
3654
|
def on_until_mod(predicate, statement)
|
3631
3655
|
consume_keyword(:until)
|
3632
3656
|
|
3633
|
-
|
3634
|
-
statement: statement,
|
3657
|
+
UntilNode.new(
|
3635
3658
|
predicate: predicate,
|
3659
|
+
statements:
|
3660
|
+
Statements.new(self, body: [statement], location: statement.location),
|
3636
3661
|
location: statement.location.to(predicate.location)
|
3637
3662
|
)
|
3638
3663
|
end
|
3639
3664
|
|
3640
3665
|
# :call-seq:
|
3641
|
-
# on_var_alias: (GVar left, (Backref | GVar) right) ->
|
3666
|
+
# on_var_alias: (GVar left, (Backref | GVar) right) -> AliasNode
|
3642
3667
|
def on_var_alias(left, right)
|
3643
3668
|
keyword = consume_keyword(:alias)
|
3644
3669
|
|
3645
|
-
|
3670
|
+
AliasNode.new(
|
3646
3671
|
left: left,
|
3647
3672
|
right: right,
|
3648
3673
|
location: keyword.location.to(right.location)
|
@@ -3722,7 +3747,7 @@ module SyntaxTree
|
|
3722
3747
|
end
|
3723
3748
|
|
3724
3749
|
# :call-seq:
|
3725
|
-
# on_while: (untyped predicate, Statements statements) ->
|
3750
|
+
# on_while: (untyped predicate, Statements statements) -> WhileNode
|
3726
3751
|
def on_while(predicate, statements)
|
3727
3752
|
beginning = consume_keyword(:while)
|
3728
3753
|
ending = consume_keyword(:end)
|
@@ -3744,7 +3769,7 @@ module SyntaxTree
|
|
3744
3769
|
ending.location.start_column
|
3745
3770
|
)
|
3746
3771
|
|
3747
|
-
|
3772
|
+
WhileNode.new(
|
3748
3773
|
predicate: predicate,
|
3749
3774
|
statements: statements,
|
3750
3775
|
location: beginning.location.to(ending.location)
|
@@ -3752,13 +3777,14 @@ module SyntaxTree
|
|
3752
3777
|
end
|
3753
3778
|
|
3754
3779
|
# :call-seq:
|
3755
|
-
# on_while_mod: (untyped predicate, untyped statement) ->
|
3780
|
+
# on_while_mod: (untyped predicate, untyped statement) -> WhileNode
|
3756
3781
|
def on_while_mod(predicate, statement)
|
3757
3782
|
consume_keyword(:while)
|
3758
3783
|
|
3759
|
-
|
3760
|
-
statement: statement,
|
3784
|
+
WhileNode.new(
|
3761
3785
|
predicate: predicate,
|
3786
|
+
statements:
|
3787
|
+
Statements.new(self, body: [statement], location: statement.location),
|
3762
3788
|
location: statement.location.to(predicate.location)
|
3763
3789
|
)
|
3764
3790
|
end
|
@@ -3881,22 +3907,22 @@ module SyntaxTree
|
|
3881
3907
|
end
|
3882
3908
|
|
3883
3909
|
# :call-seq:
|
3884
|
-
# on_yield: ((Args | Paren) arguments) ->
|
3910
|
+
# on_yield: ((Args | Paren) arguments) -> YieldNode
|
3885
3911
|
def on_yield(arguments)
|
3886
3912
|
keyword = consume_keyword(:yield)
|
3887
3913
|
|
3888
|
-
|
3914
|
+
YieldNode.new(
|
3889
3915
|
arguments: arguments,
|
3890
3916
|
location: keyword.location.to(arguments.location)
|
3891
3917
|
)
|
3892
3918
|
end
|
3893
3919
|
|
3894
3920
|
# :call-seq:
|
3895
|
-
# on_yield0: () ->
|
3921
|
+
# on_yield0: () -> YieldNode
|
3896
3922
|
def on_yield0
|
3897
3923
|
keyword = consume_keyword(:yield)
|
3898
3924
|
|
3899
|
-
|
3925
|
+
YieldNode.new(arguments: nil, location: keyword.location)
|
3900
3926
|
end
|
3901
3927
|
|
3902
3928
|
# :call-seq:
|
@@ -3904,7 +3930,7 @@ module SyntaxTree
|
|
3904
3930
|
def on_zsuper
|
3905
3931
|
keyword = consume_keyword(:super)
|
3906
3932
|
|
3907
|
-
ZSuper.new(
|
3933
|
+
ZSuper.new(location: keyword.location)
|
3908
3934
|
end
|
3909
3935
|
end
|
3910
3936
|
end
|
data/lib/syntax_tree/pattern.rb
CHANGED
@@ -142,11 +142,11 @@ module SyntaxTree
|
|
142
142
|
def compile_const(node)
|
143
143
|
value = node.value
|
144
144
|
|
145
|
-
if SyntaxTree.const_defined?(value)
|
145
|
+
if SyntaxTree.const_defined?(value, false)
|
146
146
|
clazz = SyntaxTree.const_get(value)
|
147
147
|
|
148
148
|
->(other) { clazz === other }
|
149
|
-
elsif Object.const_defined?(value)
|
149
|
+
elsif Object.const_defined?(value, false)
|
150
150
|
clazz = Object.const_get(value)
|
151
151
|
|
152
152
|
->(other) { clazz === other }
|
@@ -179,7 +179,7 @@ module SyntaxTree
|
|
179
179
|
|
180
180
|
->(other) { symbol === other }
|
181
181
|
else
|
182
|
-
compile_error(
|
182
|
+
compile_error(node)
|
183
183
|
end
|
184
184
|
end
|
185
185
|
|
data/lib/syntax_tree/version.rb
CHANGED
@@ -4,10 +4,6 @@ module SyntaxTree
|
|
4
4
|
# The environment class is used to keep track of local variables and arguments
|
5
5
|
# inside a particular scope
|
6
6
|
class Environment
|
7
|
-
# [Array[Local]] The local variables and arguments defined in this
|
8
|
-
# environment
|
9
|
-
attr_reader :locals
|
10
|
-
|
11
7
|
# This class tracks the occurrences of a local variable or argument
|
12
8
|
class Local
|
13
9
|
# [Symbol] The type of the local (e.g. :argument, :variable)
|
@@ -38,6 +34,13 @@ module SyntaxTree
|
|
38
34
|
end
|
39
35
|
end
|
40
36
|
|
37
|
+
# [Array[Local]] The local variables and arguments defined in this
|
38
|
+
# environment
|
39
|
+
attr_reader :locals
|
40
|
+
|
41
|
+
# [Environment | nil] The parent environment
|
42
|
+
attr_reader :parent
|
43
|
+
|
41
44
|
# initialize: (Environment | nil parent) -> void
|
42
45
|
def initialize(parent = nil)
|
43
46
|
@locals = {}
|