@@ -1287,35 +1287,13 @@ def visit_ident(node)
12871287
12881288 # Visit an IfNode node.
12891289 def visit_if ( node )
1290- predicate =
1291- case node . predicate
1292- when RangeNode
1293- type =
1294- node . predicate . operator . value == ".." ? :iflipflop : :eflipflop
1295- s ( type , visit ( node . predicate ) . children , nil )
1296- when RegexpLiteral
1297- s ( :match_current_line , [ visit ( node . predicate ) ] , nil )
1298- when Unary
1299- if node . predicate . operator . value == "!" &&
1300- node . predicate . statement . is_a? ( RegexpLiteral )
1301- s (
1302- :send ,
1303- [
1304- s ( :match_current_line , [ visit ( node . predicate . statement ) ] ) ,
1305- :!
1306- ] ,
1307- nil
1308- )
1309- else
1310- visit ( node . predicate )
1311- end
1312- else
1313- visit ( node . predicate )
1314- end
1315-
13161290 s (
13171291 :if ,
1318- [ predicate , visit ( node . statements ) , visit ( node . consequent ) ] ,
1292+ [
1293+ visit_predicate ( node . predicate ) ,
1294+ visit ( node . statements ) ,
1295+ visit ( node . consequent )
1296+ ] ,
13191297 if node . modifier?
13201298 smap_keyword_bare (
13211299 srange_find_between ( node . statements , node . predicate , "if" ) ,
@@ -1577,28 +1555,20 @@ def visit_massign(node)
15771555 # Visit a MethodAddBlock node.
15781556 def visit_method_add_block ( node )
15791557 case node . call
1580- when Break , Next , ReturnNode
1581- type , arguments = block_children ( node . block )
1582- call = visit ( node . call )
1583-
1584- s (
1585- call . type ,
1586- [
1587- s (
1588- type ,
1589- [ *call . children , arguments , visit ( node . block . bodystmt ) ] ,
1590- nil
1591- )
1592- ] ,
1593- nil
1594- )
15951558 when ARef , Super , ZSuper
15961559 type , arguments = block_children ( node . block )
15971560
15981561 s (
15991562 type ,
16001563 [ visit ( node . call ) , arguments , visit ( node . block . bodystmt ) ] ,
1601- nil
1564+ smap_collection (
1565+ srange_node ( node . block . opening ) ,
1566+ srange_length (
1567+ node . block . end_char ,
1568+ node . block . opening . is_a? ( Kw ) ? -3 : -1
1569+ ) ,
1570+ srange_node ( node )
1571+ )
16021572 )
16031573 else
16041574 visit_command_call (
@@ -2376,22 +2346,58 @@ def visit_tstring_content(node)
23762346 # Visit a Unary node.
23772347 def visit_unary ( node )
23782348 # Special handling here for flipflops
2379- if node . statement . is_a? ( Paren ) &&
2380- node . statement . contents . is_a? ( Statements ) &&
2381- node . statement . contents . body . length == 1 &&
2382- ( range = node . statement . contents . body . first ) . is_a? ( RangeNode ) &&
2349+ if ( paren = node . statement ) . is_a? ( Paren ) &&
2350+ paren . contents . is_a? ( Statements ) &&
2351+ paren . contents . body . length == 1 &&
2352+ ( range = paren . contents . body . first ) . is_a? ( RangeNode ) &&
23832353 node . operator == "!"
2384- type = range . operator . value == ".." ? :iflipflop : :eflipflop
2385- return (
2386- s (
2387- :send ,
2388- [ s ( :begin , [ s ( type , visit ( range ) . children , nil ) ] , nil ) , :! ] ,
2389- nil
2354+ s (
2355+ :send ,
2356+ [
2357+ s (
2358+ :begin ,
2359+ [
2360+ s (
2361+ range . operator . value == ".." ? :iflipflop : :eflipflop ,
2362+ visit ( range ) . children ,
2363+ smap_operator (
2364+ srange_node ( range . operator ) ,
2365+ srange_node ( range )
2366+ )
2367+ )
2368+ ] ,
2369+ smap_collection (
2370+ srange_length ( paren . start_char , 1 ) ,
2371+ srange_length ( paren . end_char , -1 ) ,
2372+ srange_node ( paren )
2373+ )
2374+ ) ,
2375+ :!
2376+ ] ,
2377+ smap_send_bare (
2378+ srange_length ( node . start_char , 1 ) ,
2379+ srange_node ( node )
23902380 )
23912381 )
2382+ elsif node . operator == "!" && node . statement . is_a? ( RegexpLiteral )
2383+ s (
2384+ :send ,
2385+ [
2386+ s (
2387+ :match_current_line ,
2388+ [ visit ( node . statement ) ] ,
2389+ smap ( srange_node ( node . statement ) )
2390+ ) ,
2391+ :!
2392+ ] ,
2393+ smap_send_bare (
2394+ srange_length ( node . start_char , 1 ) ,
2395+ srange_node ( node )
2396+ )
2397+ )
2398+ else
2399+ visit ( canonical_unary ( node ) )
23922400 end
2393-
2394- visit ( canonical_unary ( node ) )
23952401 end
23962402
23972403 # Visit an Undef node.
@@ -2408,40 +2414,37 @@ def visit_undef(node)
24082414
24092415 # Visit an UnlessNode node.
24102416 def visit_unless ( node )
2411- predicate =
2412- case node . predicate
2413- when RegexpLiteral
2414- s ( :match_current_line , [ visit ( node . predicate ) ] , nil )
2415- when Unary
2416- if node . predicate . operator . value == "!" &&
2417- node . predicate . statement . is_a? ( RegexpLiteral )
2418- s (
2419- :send ,
2420- [
2421- s ( :match_current_line , [ visit ( node . predicate . statement ) ] ) ,
2422- :!
2423- ] ,
2424- nil
2425- )
2426- else
2427- visit ( node . predicate )
2428- end
2429- else
2430- visit ( node . predicate )
2431- end
2432-
24332417 s (
24342418 :if ,
2435- [ predicate , visit ( node . consequent ) , visit ( node . statements ) ] ,
2419+ [
2420+ visit_predicate ( node . predicate ) ,
2421+ visit ( node . consequent ) ,
2422+ visit ( node . statements )
2423+ ] ,
24362424 if node . modifier?
24372425 smap_keyword_bare (
24382426 srange_find_between ( node . statements , node . predicate , "unless" ) ,
24392427 srange_node ( node )
24402428 )
24412429 else
2430+ begin_start = node . predicate . end_char
2431+ begin_end =
2432+ if node . statements . empty?
2433+ node . statements . end_char
2434+ else
2435+ node . statements . body . first . start_char
2436+ end
2437+
2438+ begin_token =
2439+ if buffer . source [ begin_start ...begin_end ] . include? ( "then" )
2440+ srange_find ( begin_start , begin_end , "then" )
2441+ elsif buffer . source [ begin_start ...begin_end ] . include? ( ";" )
2442+ srange_find ( begin_start , begin_end , ";" )
2443+ end
2444+
24422445 smap_condition (
24432446 srange_length ( node . start_char , 6 ) ,
2444- srange_search_between ( node . predicate , node . statements , "then" ) ,
2447+ begin_token ,
24452448 nil ,
24462449 srange_length ( node . end_char , -3 ) ,
24472450 srange_node ( node )
@@ -3014,6 +3017,31 @@ def srange_node(node)
30143017 location = node . location
30153018 srange ( location . start_char , location . end_char )
30163019 end
3020+
3021+ def visit_predicate ( node )
3022+ case node
3023+ when RangeNode
3024+ s (
3025+ node . operator . value == ".." ? :iflipflop : :eflipflop ,
3026+ visit ( node ) . children ,
3027+ smap_operator ( srange_node ( node . operator ) , srange_node ( node ) )
3028+ )
3029+ when RegexpLiteral
3030+ s ( :match_current_line , [ visit ( node ) ] , smap ( srange_node ( node ) ) )
3031+ when Unary
3032+ if node . operator . value == "!" && node . statement . is_a? ( RegexpLiteral )
3033+ s (
3034+ :send ,
3035+ [ s ( :match_current_line , [ visit ( node . statement ) ] ) , :! ] ,
3036+ smap_send_bare ( srange_node ( node . operator ) , srange_node ( node ) )
3037+ )
3038+ else
3039+ visit ( node )
3040+ end
3041+ else
3042+ visit ( node )
3043+ end
3044+ end
30173045 end
30183046 end
30193047end
0 commit comments