@@ -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" ) ,
@@ -2376,22 +2354,42 @@ def visit_tstring_content(node)
23762354 # Visit a Unary node.
23772355 def visit_unary ( node )
23782356 # 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 ) &&
2357+ if ( paren = node . statement ) . is_a? ( Paren ) &&
2358+ paren . contents . is_a? ( Statements ) &&
2359+ paren . contents . body . length == 1 &&
2360+ ( range = paren . contents . body . first ) . is_a? ( RangeNode ) &&
23832361 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
2362+ s (
2363+ :send ,
2364+ [
2365+ s (
2366+ :begin ,
2367+ [
2368+ s (
2369+ range . operator . value == ".." ? :iflipflop : :eflipflop ,
2370+ visit ( range ) . children ,
2371+ smap_operator (
2372+ srange_node ( range . operator ) ,
2373+ srange_node ( range )
2374+ )
2375+ )
2376+ ] ,
2377+ smap_collection (
2378+ srange_length ( paren . start_char , 1 ) ,
2379+ srange_length ( paren . end_char , -1 ) ,
2380+ srange_node ( paren )
2381+ )
2382+ ) ,
2383+ :!
2384+ ] ,
2385+ smap_send_bare (
2386+ srange_length ( node . start_char , 1 ) ,
2387+ srange_node ( node )
23902388 )
23912389 )
2390+ else
2391+ visit ( canonical_unary ( node ) )
23922392 end
2393-
2394- visit ( canonical_unary ( node ) )
23952393 end
23962394
23972395 # Visit an Undef node.
@@ -2408,31 +2406,13 @@ def visit_undef(node)
24082406
24092407 # Visit an UnlessNode node.
24102408 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-
24332409 s (
24342410 :if ,
2435- [ predicate , visit ( node . consequent ) , visit ( node . statements ) ] ,
2411+ [
2412+ visit_predicate ( node . predicate ) ,
2413+ visit ( node . consequent ) ,
2414+ visit ( node . statements )
2415+ ] ,
24362416 if node . modifier?
24372417 smap_keyword_bare (
24382418 srange_find_between ( node . statements , node . predicate , "unless" ) ,
@@ -3014,6 +2994,31 @@ def srange_node(node)
30142994 location = node . location
30152995 srange ( location . start_char , location . end_char )
30162996 end
2997+
2998+ def visit_predicate ( node )
2999+ case node
3000+ when RangeNode
3001+ s (
3002+ node . operator . value == ".." ? :iflipflop : :eflipflop ,
3003+ visit ( node ) . children ,
3004+ smap_operator ( srange_node ( node . operator ) , srange_node ( node ) )
3005+ )
3006+ when RegexpLiteral
3007+ s ( :match_current_line , [ visit ( node ) ] , smap ( srange_node ( node ) ) )
3008+ when Unary
3009+ if node . operator . value == "!" && node . statement . is_a? ( RegexpLiteral )
3010+ s (
3011+ :send ,
3012+ [ s ( :match_current_line , [ visit ( node . statement ) ] ) , :! ] ,
3013+ smap_send_bare ( srange_node ( node . operator ) , srange_node ( node ) )
3014+ )
3015+ else
3016+ visit ( node )
3017+ end
3018+ else
3019+ visit ( node )
3020+ end
3021+ end
30173022 end
30183023 end
30193024end
0 commit comments