# File lib/brakeman/processors/lib/find_return_value.rb, line 76
  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 #Unlikely?
          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