#!/usr/bin/env ruby
require "optparse"
require "bitclust"

reverse = false
db_path = ""

opt = OptionParser.new
opt.on("-r") { reverse = true }
opt.on("-d PATH") {|path| db_path = path}

opt.parse!(ARGV)

db = BitClust::MethodDatabase.new(db_path)

def normalize_typemark(typemark)
  (typemark == ".#") ? "." : typemark
end

if reverse
  rev_table = Hash.new{|h,k| h[k] = Array.new}
  db.classes.each do |c|
    c.entries.each do |m|
      typemark = normalize_typemark(m.typemark)
      next unless typemark == "." || typemark == "#"
      m.names.each do |name|
        rev_table[name] << "#{c.name}#{typemark}#{name}"
      end
    end
  end
  rev_table.sort_by{|key,val| key}.each{|key, val| puts(key + "\t" + val.join("\t"))}
else
  all_entries = []
  db.classes.sort_by{|c| c.name}.each do |c|
    c.entries.sort_by{|m| m.name}.each do |m|
      typemark = m.typemark
      typemark = "." if typemark == ".#"
      next unless typemark == "." || typemark == "#"
      m.names.each do |name|
        spec = "#{c.name}#{typemark}#{name}"
        params = []
        m.source.each_line do |line|
          if /\A--- #{Regexp.quote(name)}[^a-zA-Z_\[\]=]/ =~ line
            line.chomp!
            line.gsub!(/\A--- #{Regexp.quote(name)}/, "")
            line.gsub!(/\t/, "")
            line.gsub!(/ +/, "")
            line.gsub!(/->nil\Z/, "")
            line.gsub!(/->\(\)\Z/, "")
            params << line
          end
        end

        table_entry = spec + "\t" + params.join("\t")
        all_entries << table_entry
      end
    end
  end

  puts all_entries.sort_by{|ent| ent.split(/\t/)[0]}
end
