@@ -436,30 +436,23 @@ def expression?(sexp)
436
436
#
437
437
# @return [String]
438
438
def process_block ( sexp , level )
439
- result = [ ]
440
- sexp << s ( :nil ) if sexp . empty?
439
+ return process s ( :nil ) if sexp . empty?
441
440
441
+ result = [ ]
442
442
join = ( @scope . class_scope? ? "\n \n #@indent " : "\n #@indent " )
443
443
444
- until sexp . empty?
445
- stmt = sexp . shift
446
-
444
+ sexp . each do |stmt |
447
445
result << fragment ( join , sexp ) unless result . empty?
448
446
449
447
# find any inline yield statements
450
448
if yasgn = find_inline_yield ( stmt )
451
- result << process ( yasgn , level )
452
- result << fragment ( ";" , yasgn )
449
+ result << process ( yasgn , level ) << fragment ( ";" , yasgn )
453
450
end
454
451
455
452
expr = expression? ( stmt ) and LEVEL . index ( level ) < LEVEL . index ( :list )
456
453
457
- code = process ( stmt , level )
458
-
459
- result << code
460
- if expr
461
- result << fragment ( ";" , stmt )
462
- end
454
+ result << process ( stmt , level )
455
+ result << fragment ( ";" , stmt ) if expr
463
456
end
464
457
465
458
result
@@ -515,21 +508,15 @@ def find_inline_yield(stmt)
515
508
end
516
509
517
510
def process_scope ( sexp , level )
518
- stmt = sexp . shift
519
- if stmt
520
- unless @scope . class_scope?
521
- stmt = returns stmt
522
- end
511
+ stmt = sexp [ 0 ] || s ( :nil )
512
+ stmt = returns stmt unless @scope . class_scope?
523
513
524
- process stmt , :stmt
525
- else
526
- fragment ( "nil" , sexp )
527
- end
514
+ process stmt , :stmt
528
515
end
529
516
530
517
# s(:js_return, sexp)
531
518
def process_js_return ( sexp , level )
532
- [ fragment ( "return " , sexp ) , process ( sexp . shift , :expr ) ]
519
+ [ f ( "return " , sexp ) , process ( sexp . shift , :expr ) ]
533
520
end
534
521
535
522
# s(:js_tmp, str)
@@ -557,17 +544,22 @@ def process_sym(sexp, level)
557
544
fragment ( sexp [ 0 ] . to_s . inspect , sexp )
558
545
end
559
546
547
+ # Process integers. Wrap in parens if a receiver of method call
560
548
def process_int ( sexp , level )
561
549
fragment ( ( level == :recv ? "(#{ sexp [ 0 ] } )" : sexp [ 0 ] . to_s ) , sexp )
562
550
end
563
551
552
+ # Floats generated just like integers
564
553
alias_method :process_float , :process_int
565
554
555
+ # Regexp literals. Convert to empty js regexp if empty (not compatible)
566
556
def process_regexp ( sexp , level )
567
557
val = sexp [ 0 ]
568
558
fragment ( ( val == // ? /^/ . inspect : val . inspect ) , sexp )
569
559
end
570
560
561
+ # Dynamic regexps with interpolation
562
+ # s(:dregx, parts...) => new Regexp("...")
571
563
def process_dregx ( sexp , level )
572
564
result = [ ]
573
565
@@ -586,26 +578,29 @@ def process_dregx(sexp, level)
586
578
[ fragment ( "(new RegExp(" , sexp ) , result , fragment ( "))" , sexp ) ]
587
579
end
588
580
581
+ # Exclusive range, uses opal __range helper.
582
+ # s(:dot3, start, end) => __range(start, end, false)
589
583
def process_dot2 ( sexp , level )
590
584
@helpers [ :range ] = true
591
585
592
586
[ f ( "__range(" , sexp ) , process ( sexp [ 0 ] ) , f ( ", " , sexp ) , process ( sexp [ 1 ] ) , f ( ", false)" , sexp ) ]
593
587
end
594
588
589
+ # Inclusive range, uses __range helper
590
+ # s(:dot3, start, end) => __range(start, end, true)
595
591
def process_dot3 ( sexp , level )
596
592
@helpers [ :range ] = true
597
593
598
594
[ f ( "__range(" , sexp ) , process ( sexp [ 0 ] ) , f ( ", " , sexp ) , process ( sexp [ 1 ] ) , f ( ", true)" , sexp ) ]
599
595
end
600
596
601
- # s(:str, "string")
597
+ # Simple strings, no interpolation.
598
+ # s(:str, "string") => "string"
602
599
def process_str ( sexp , level )
603
- str = sexp . shift
604
- @uses_file = true if str == @file
605
-
606
- f ( str . inspect , sexp )
600
+ f sexp [ 0 ] . inspect , sexp
607
601
end
608
602
603
+ # defined?(x) => various
609
604
def process_defined ( sexp , level )
610
605
part = sexp [ 0 ]
611
606
case part [ 0 ]
@@ -641,19 +636,23 @@ def process_defined(sexp, level)
641
636
end
642
637
end
643
638
644
- # s(:not, sexp)
639
+ # not keyword or '!' operand
640
+ # s(:not, value) => (tmp = value, (tmp === nil || tmp === false))
645
641
def process_not ( sexp , level )
646
642
with_temp do |tmp |
647
643
expr = sexp . shift
648
644
[ fragment ( "(#{ tmp } = " , sexp ) , process ( expr , :expr ) , fragment ( ", (#{ tmp } === nil || #{ tmp } === false))" , sexp ) ]
649
645
end
650
646
end
651
647
648
+ # A block pass '&foo' syntax
649
+ # s(:block_pass, value) => value.$to_proc()
652
650
def process_block_pass ( exp , level )
653
651
process ( s ( :call , exp . shift , :to_proc , s ( :arglist ) ) , :expr )
654
652
end
655
653
656
- # s(:iter, call, block_args [, body)
654
+ # A block/iter with embeded call. Compiles into function
655
+ # s(:iter, call, block_args [, body) => (function() { ... })
657
656
def process_iter ( sexp , level )
658
657
call , args , body = sexp
659
658
@@ -742,6 +741,10 @@ def process_iter(sexp, level)
742
741
process call , level
743
742
end
744
743
744
+ # Maps block args into array of jsid. Adds $ suffix to invalid js
745
+ # identifiers.
746
+ #
747
+ # s(:args, parts...) => ["a", "b", "break$"]
745
748
def js_block_args ( sexp )
746
749
sexp . map do |arg |
747
750
a = arg [ 1 ] . to_sym
0 commit comments