@@ -1287,35 +1287,13 @@ def visit_ident(node)
1287
1287
1288
1288
# Visit an IfNode node.
1289
1289
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
-
1316
1290
s (
1317
1291
:if ,
1318
- [ predicate , visit ( node . statements ) , visit ( node . consequent ) ] ,
1292
+ [
1293
+ visit_predicate ( node . predicate ) ,
1294
+ visit ( node . statements ) ,
1295
+ visit ( node . consequent )
1296
+ ] ,
1319
1297
if node . modifier?
1320
1298
smap_keyword_bare (
1321
1299
srange_find_between ( node . statements , node . predicate , "if" ) ,
@@ -2376,22 +2354,42 @@ def visit_tstring_content(node)
2376
2354
# Visit a Unary node.
2377
2355
def visit_unary ( node )
2378
2356
# 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 ) &&
2383
2361
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 )
2390
2388
)
2391
2389
)
2390
+ else
2391
+ visit ( canonical_unary ( node ) )
2392
2392
end
2393
-
2394
- visit ( canonical_unary ( node ) )
2395
2393
end
2396
2394
2397
2395
# Visit an Undef node.
@@ -2408,31 +2406,13 @@ def visit_undef(node)
2408
2406
2409
2407
# Visit an UnlessNode node.
2410
2408
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
-
2433
2409
s (
2434
2410
:if ,
2435
- [ predicate , visit ( node . consequent ) , visit ( node . statements ) ] ,
2411
+ [
2412
+ visit_predicate ( node . predicate ) ,
2413
+ visit ( node . consequent ) ,
2414
+ visit ( node . statements )
2415
+ ] ,
2436
2416
if node . modifier?
2437
2417
smap_keyword_bare (
2438
2418
srange_find_between ( node . statements , node . predicate , "unless" ) ,
@@ -3014,6 +2994,31 @@ def srange_node(node)
3014
2994
location = node . location
3015
2995
srange ( location . start_char , location . end_char )
3016
2996
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
3017
3022
end
3018
3023
end
3019
3024
end
0 commit comments