@@ -336,8 +336,8 @@ def visit_assign(node)
336
336
# Visit an Assoc node.
337
337
def visit_assoc ( node )
338
338
if node . value . nil?
339
+ # { foo: }
339
340
expression = srange ( node . start_char , node . end_char - 1 )
340
-
341
341
type , location =
342
342
if node . key . value . start_with? ( /[A-Z]/ )
343
343
[ :const , smap_constant ( nil , expression , expression ) ]
@@ -356,13 +356,38 @@ def visit_assoc(node)
356
356
srange_node ( node )
357
357
)
358
358
)
359
- else
359
+ elsif node . key . is_a? ( Label )
360
+ # { foo: 1 }
360
361
s (
361
362
:pair ,
362
363
[ visit ( node . key ) , visit ( node . value ) ] ,
363
364
smap_operator (
364
- srange_search_between ( node . key , node . value , "=>" ) ||
365
- srange_length ( node . key . end_char , -1 ) ,
365
+ srange_length ( node . key . end_char , -1 ) ,
366
+ srange_node ( node )
367
+ )
368
+ )
369
+ elsif ( operator = srange_search_between ( node . key , node . value , "=>" ) )
370
+ # { :foo => 1 }
371
+ s (
372
+ :pair ,
373
+ [ visit ( node . key ) , visit ( node . value ) ] ,
374
+ smap_operator ( operator , srange_node ( node ) )
375
+ )
376
+ else
377
+ # { "foo": 1 }
378
+ key = visit ( node . key )
379
+ key_location =
380
+ smap_collection (
381
+ key . location . begin ,
382
+ srange_length ( node . key . end_char - 2 , 1 ) ,
383
+ srange ( node . key . start_char , node . key . end_char - 1 )
384
+ )
385
+
386
+ s (
387
+ :pair ,
388
+ [ s ( key . type , key . children , key_location ) , visit ( node . value ) ] ,
389
+ smap_operator (
390
+ srange_length ( node . key . end_char , -1 ) ,
366
391
srange_node ( node )
367
392
)
368
393
)
@@ -769,7 +794,11 @@ def visit_command_call(node)
769
794
770
795
srange ( node . start_char , end_char )
771
796
elsif node . block
772
- srange_node ( node . message )
797
+ if node . receiver
798
+ srange ( node . receiver . start_char , node . message . end_char )
799
+ else
800
+ srange_node ( node . message )
801
+ end
773
802
else
774
803
srange_node ( node )
775
804
end
@@ -1010,6 +1039,21 @@ def visit_else(node)
1010
1039
1011
1040
# Visit an Elsif node.
1012
1041
def visit_elsif ( node )
1042
+ begin_start = node . predicate . end_char
1043
+ begin_end =
1044
+ if node . statements . empty?
1045
+ node . statements . end_char
1046
+ else
1047
+ node . statements . body . first . start_char
1048
+ end
1049
+
1050
+ begin_token =
1051
+ if buffer . source [ begin_start ...begin_end ] . include? ( "then" )
1052
+ srange_find ( begin_start , begin_end , "then" )
1053
+ elsif buffer . source [ begin_start ...begin_end ] . include? ( ";" )
1054
+ srange_find ( begin_start , begin_end , ";" )
1055
+ end
1056
+
1013
1057
else_token =
1014
1058
case node . consequent
1015
1059
when Elsif
@@ -1029,7 +1073,7 @@ def visit_elsif(node)
1029
1073
] ,
1030
1074
smap_condition (
1031
1075
srange_length ( node . start_char , 5 ) ,
1032
- nil ,
1076
+ begin_token ,
1033
1077
else_token ,
1034
1078
nil ,
1035
1079
expression
@@ -1529,12 +1573,14 @@ def visit_lambda_var(node)
1529
1573
location =
1530
1574
if node . start_char == node . end_char
1531
1575
smap_collection_bare ( nil )
1532
- else
1576
+ elsif buffer . source [ node . start_char - 1 ] == "("
1533
1577
smap_collection (
1534
1578
srange_length ( node . start_char , 1 ) ,
1535
1579
srange_length ( node . end_char , -1 ) ,
1536
1580
srange_node ( node )
1537
1581
)
1582
+ else
1583
+ smap_collection_bare ( srange_node ( node ) )
1538
1584
end
1539
1585
1540
1586
s ( :args , visit ( node . params ) . children + shadowargs , location )
@@ -1565,7 +1611,7 @@ def visit_method_add_block(node)
1565
1611
srange_node ( node . block . opening ) ,
1566
1612
srange_length (
1567
1613
node . block . end_char ,
1568
- node . block . opening . is_a? ( Kw ) ? -3 : -1
1614
+ node . block . keywords? ? -3 : -1
1569
1615
) ,
1570
1616
srange_node ( node )
1571
1617
)
@@ -2244,7 +2290,16 @@ def visit_super(node)
2244
2290
)
2245
2291
)
2246
2292
when ArgsForward
2247
- s ( :super , [ visit ( node . arguments . arguments ) ] , nil )
2293
+ s (
2294
+ :super ,
2295
+ [ visit ( node . arguments . arguments ) ] ,
2296
+ smap_keyword (
2297
+ srange_length ( node . start_char , 5 ) ,
2298
+ srange_find ( node . start_char + 5 , node . end_char , "(" ) ,
2299
+ srange_length ( node . end_char , -1 ) ,
2300
+ srange_node ( node )
2301
+ )
2302
+ )
2248
2303
else
2249
2304
s (
2250
2305
:super ,
@@ -2442,10 +2497,15 @@ def visit_unless(node)
2442
2497
srange_find ( begin_start , begin_end , ";" )
2443
2498
end
2444
2499
2500
+ else_token =
2501
+ if node . consequent
2502
+ srange_length ( node . consequent . start_char , 4 )
2503
+ end
2504
+
2445
2505
smap_condition (
2446
2506
srange_length ( node . start_char , 6 ) ,
2447
2507
begin_token ,
2448
- nil ,
2508
+ else_token ,
2449
2509
srange_length ( node . end_char , -3 ) ,
2450
2510
srange_node ( node )
2451
2511
)
0 commit comments