Skip to content

Commit dae18e2

Browse files
committedJul 30, 2013
Start documenting some code generator nodes
1 parent 386e98a commit dae18e2

File tree

1 file changed

+33
-30
lines changed

1 file changed

+33
-30
lines changed
 

Diff for: ‎lib/opal/parser.rb

+33-30
Original file line numberDiff line numberDiff line change
@@ -436,30 +436,23 @@ def expression?(sexp)
436436
#
437437
# @return [String]
438438
def process_block(sexp, level)
439-
result = []
440-
sexp << s(:nil) if sexp.empty?
439+
return process s(:nil) if sexp.empty?
441440

441+
result = []
442442
join = (@scope.class_scope? ? "\n\n#@indent" : "\n#@indent")
443443

444-
until sexp.empty?
445-
stmt = sexp.shift
446-
444+
sexp.each do |stmt|
447445
result << fragment(join, sexp) unless result.empty?
448446

449447
# find any inline yield statements
450448
if yasgn = find_inline_yield(stmt)
451-
result << process(yasgn, level)
452-
result << fragment(";", yasgn)
449+
result << process(yasgn, level) << fragment(";", yasgn)
453450
end
454451

455452
expr = expression?(stmt) and LEVEL.index(level) < LEVEL.index(:list)
456453

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
463456
end
464457

465458
result
@@ -515,21 +508,15 @@ def find_inline_yield(stmt)
515508
end
516509

517510
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?
523513

524-
process stmt, :stmt
525-
else
526-
fragment("nil", sexp)
527-
end
514+
process stmt, :stmt
528515
end
529516

530517
# s(:js_return, sexp)
531518
def process_js_return(sexp, level)
532-
[fragment("return ", sexp), process(sexp.shift, :expr)]
519+
[f("return ", sexp), process(sexp.shift, :expr)]
533520
end
534521

535522
# s(:js_tmp, str)
@@ -557,17 +544,22 @@ def process_sym(sexp, level)
557544
fragment(sexp[0].to_s.inspect, sexp)
558545
end
559546

547+
# Process integers. Wrap in parens if a receiver of method call
560548
def process_int(sexp, level)
561549
fragment((level == :recv ? "(#{sexp[0]})" : sexp[0].to_s), sexp)
562550
end
563551

552+
# Floats generated just like integers
564553
alias_method :process_float, :process_int
565554

555+
# Regexp literals. Convert to empty js regexp if empty (not compatible)
566556
def process_regexp(sexp, level)
567557
val = sexp[0]
568558
fragment((val == // ? /^/.inspect : val.inspect), sexp)
569559
end
570560

561+
# Dynamic regexps with interpolation
562+
# s(:dregx, parts...) => new Regexp("...")
571563
def process_dregx(sexp, level)
572564
result = []
573565

@@ -586,26 +578,29 @@ def process_dregx(sexp, level)
586578
[fragment("(new RegExp(", sexp), result, fragment("))", sexp)]
587579
end
588580

581+
# Exclusive range, uses opal __range helper.
582+
# s(:dot3, start, end) => __range(start, end, false)
589583
def process_dot2(sexp, level)
590584
@helpers[:range] = true
591585

592586
[f("__range(", sexp), process(sexp[0]), f(", ", sexp), process(sexp[1]), f(", false)", sexp)]
593587
end
594588

589+
# Inclusive range, uses __range helper
590+
# s(:dot3, start, end) => __range(start, end, true)
595591
def process_dot3(sexp, level)
596592
@helpers[:range] = true
597593

598594
[f("__range(", sexp), process(sexp[0]), f(", ", sexp), process(sexp[1]), f(", true)", sexp)]
599595
end
600596

601-
# s(:str, "string")
597+
# Simple strings, no interpolation.
598+
# s(:str, "string") => "string"
602599
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
607601
end
608602

603+
# defined?(x) => various
609604
def process_defined(sexp, level)
610605
part = sexp[0]
611606
case part[0]
@@ -641,19 +636,23 @@ def process_defined(sexp, level)
641636
end
642637
end
643638

644-
# s(:not, sexp)
639+
# not keyword or '!' operand
640+
# s(:not, value) => (tmp = value, (tmp === nil || tmp === false))
645641
def process_not(sexp, level)
646642
with_temp do |tmp|
647643
expr = sexp.shift
648644
[fragment("(#{tmp} = ", sexp), process(expr, :expr), fragment(", (#{tmp} === nil || #{tmp} === false))", sexp)]
649645
end
650646
end
651647

648+
# A block pass '&foo' syntax
649+
# s(:block_pass, value) => value.$to_proc()
652650
def process_block_pass(exp, level)
653651
process(s(:call, exp.shift, :to_proc, s(:arglist)), :expr)
654652
end
655653

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() { ... })
657656
def process_iter(sexp, level)
658657
call, args, body = sexp
659658

@@ -742,6 +741,10 @@ def process_iter(sexp, level)
742741
process call, level
743742
end
744743

744+
# Maps block args into array of jsid. Adds $ suffix to invalid js
745+
# identifiers.
746+
#
747+
# s(:args, parts...) => ["a", "b", "break$"]
745748
def js_block_args(sexp)
746749
sexp.map do |arg|
747750
a = arg[1].to_sym

0 commit comments

Comments
 (0)
Please sign in to comment.