def process_iter exp
@exp_context.push exp
exp[1] = process exp.block_call
if array_detect_all_literals? exp[1]
return safe_literal(exp.line)
end
@exp_context.pop
env.scope do
call = exp.block_call
block_args = exp.block_args
if call? call and [:each, :map].include? call.method and all_literals? call.target and block_args.length == 2 and block_args.last.is_a? Symbol
local = Sexp.new(:lvar, block_args.last)
env.current[local] = safe_literal(exp.line)
else
block_args.each do |e|
if node_type? e, :lasgn
env.current[Sexp.new(:lvar, e.lhs)] = Sexp.new(:lvar, e.lhs)
elsif node_type? e, :kwarg
env.current[Sexp.new(:lvar, e[1])] = e[2]
elsif node_type? e, :masgn, :shadow
e[1..-1].each do |var|
local = Sexp.new(:lvar, var)
env.current[local] = local
end
elsif e.is_a? Symbol
local = Sexp.new(:lvar, e)
env.current[local] = local
else
raise "Unexpected value in block args: #{e.inspect}"
end
end
end
block = exp.block
if block? block
process_all! block
else
exp[3] = process block
end
end
exp
end