def last_value exp
case exp.node_type
when :rlist, :block, :scope, Sexp
last_value exp.last
when :if
then_clause = exp.then_clause
else_clause = exp.else_clause
if then_clause.nil? and else_clause.nil?
nil
elsif then_clause.nil?
last_value else_clause
elsif else_clause.nil?
last_value then_clause
else
true_branch = last_value then_clause
false_branch = last_value else_clause
if true_branch and false_branch
value = make_or(true_branch, false_branch)
value.original_line = value.rhs.line
value
else
true_branch or false_branch
end
end
when :lasgn, :iasgn, :op_asgn_or, :attrasgn
last_value exp.rhs
when :rescue
values = []
exp.each_sexp do |e|
if node_type? e, :resbody
if e.last
values << last_value(e.last)
end
elsif sexp? e
values << last_value(e)
end
end
values.reject! do |v|
v.nil? or node_type? v, :nil
end
if values.length > 1
values.inject do |m, v|
make_or(m, v)
end
else
values.first
end
when :return
if exp.value
last_value exp.value
else
nil
end
when :nil
nil
else
exp.original_line = exp.line unless exp.original_line
exp
end
end