def on_assign(name, rhs, line, *junk)
      return unless name =~ /^[A-Z]/ && junk.empty?

      if rhs && :call == rhs[0] && rhs[1] && "#{rhs[1][0]}.#{rhs[2]}" =~ /^(Class|Module|Struct)\.new$/
        kind = $1 == 'Module' ? :module : :class
        superclass = $1 == 'Class' ? rhs[3] : nil
        superclass.flatten! if superclass
        return on_module_or_class(kind, [name, line], superclass, rhs[4])
      end

      namespace = @namespace
      if name.include?('::')
        parts = name.split('::')
        name = parts.pop
        namespace = namespace + parts
      end

      process(rhs)

      emit_tag :constant, line,
        :name => name,
        :full_name => (namespace + [name]).join('::'),
        :class => namespace.join('::')
    end
def on_assign(name, rhs, line, *junk)
      return unless name =~ /^[A-Z]/ && junk.empty?

      if rhs && :call == rhs[0] && rhs[1] && "#{rhs[1][0]}.#{rhs[2]}" =~ /^(Class|Module|Struct)\.new$/
        kind = $1 == 'Module' ? :module : :class
        superclass = $1 == 'Class' ? rhs[3] : nil
        superclass.flatten! if superclass
        return on_module_or_class(kind, [name, line], superclass, rhs[4])
      end

      namespace = @namespace
      if name.include?('::')
        parts = name.split('::')
        name = parts.pop
        namespace = namespace + parts
      end

      process(rhs)

      emit_tag :constant, line,
        :name => name,
        :full_name => (namespace + [name]).join('::'),
        :class => namespace.join('::')
    end
Ripper trips up on keyword arguments in pre-2.1 Ruby and supplies extra
 arguments that we just ignore here