@@ -336,8 +336,8 @@ def visit_assign(node)
336336 # Visit an Assoc node.
337337 def visit_assoc ( node )
338338 if node . value . nil?
339+ # { foo: }
339340 expression = srange ( node . start_char , node . end_char - 1 )
340-
341341 type , location =
342342 if node . key . value . start_with? ( /[A-Z]/ )
343343 [ :const , smap_constant ( nil , expression , expression ) ]
@@ -356,13 +356,38 @@ def visit_assoc(node)
356356 srange_node ( node )
357357 )
358358 )
359- else
359+ elsif node . key . is_a? ( Label )
360+ # { foo: 1 }
360361 s (
361362 :pair ,
362363 [ visit ( node . key ) , visit ( node . value ) ] ,
363364 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 ) ,
366391 srange_node ( node )
367392 )
368393 )
@@ -769,7 +794,11 @@ def visit_command_call(node)
769794
770795 srange ( node . start_char , end_char )
771796 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
773802 else
774803 srange_node ( node )
775804 end
@@ -1010,6 +1039,21 @@ def visit_else(node)
10101039
10111040 # Visit an Elsif node.
10121041 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+
10131057 else_token =
10141058 case node . consequent
10151059 when Elsif
@@ -1029,7 +1073,7 @@ def visit_elsif(node)
10291073 ] ,
10301074 smap_condition (
10311075 srange_length ( node . start_char , 5 ) ,
1032- nil ,
1076+ begin_token ,
10331077 else_token ,
10341078 nil ,
10351079 expression
@@ -1529,12 +1573,14 @@ def visit_lambda_var(node)
15291573 location =
15301574 if node . start_char == node . end_char
15311575 smap_collection_bare ( nil )
1532- else
1576+ elsif buffer . source [ node . start_char - 1 ] == "("
15331577 smap_collection (
15341578 srange_length ( node . start_char , 1 ) ,
15351579 srange_length ( node . end_char , -1 ) ,
15361580 srange_node ( node )
15371581 )
1582+ else
1583+ smap_collection_bare ( srange_node ( node ) )
15381584 end
15391585
15401586 s ( :args , visit ( node . params ) . children + shadowargs , location )
@@ -1565,7 +1611,7 @@ def visit_method_add_block(node)
15651611 srange_node ( node . block . opening ) ,
15661612 srange_length (
15671613 node . block . end_char ,
1568- node . block . opening . is_a? ( Kw ) ? -3 : -1
1614+ node . block . keywords? ? -3 : -1
15691615 ) ,
15701616 srange_node ( node )
15711617 )
@@ -2244,7 +2290,16 @@ def visit_super(node)
22442290 )
22452291 )
22462292 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+ )
22482303 else
22492304 s (
22502305 :super ,
@@ -2442,10 +2497,15 @@ def visit_unless(node)
24422497 srange_find ( begin_start , begin_end , ";" )
24432498 end
24442499
2500+ else_token =
2501+ if node . consequent
2502+ srange_length ( node . consequent . start_char , 4 )
2503+ end
2504+
24452505 smap_condition (
24462506 srange_length ( node . start_char , 6 ) ,
24472507 begin_token ,
2448- nil ,
2508+ else_token ,
24492509 srange_length ( node . end_char , -3 ) ,
24502510 srange_node ( node )
24512511 )
0 commit comments