#!/usr/local/bin/ruby -w # ver.0.1 Aug.21.2000 create # ver.0.2 Aug.23.2000 adding (class name)[#.] # ver.0.3 Aug.30.2000 regexp support, rewrite # ver.0.4 Sep.20.2000 tree view (require tree2.rb) require 'tree2' def usage print "usage: findmethod.rb [-i include] method ...\n" exit end class MethodTree def initialize @m = Hash.new([]) Object.constants.each do |x| c = nil eval "c = #{x}" t = c.type.to_s if c.is_a?(Module) or c.is_a?(Class) c.instance_methods.each do |m| # @m[m] += [["#{x}##{m} : ", c]] @m[m] += [["##{m}", c]] end c.methods.each do |m| # @m[m] += [["#{x}.#{m} ; ", c]] @m[m] += [[".#{m}", c]] end end end @methodlist = " " + @m.keys.join(" ") + " " end def searchmethod(method) if /\W/ === method || $RE if !$RE && /^\w+\?$/ === method re = false else pre = if /^\^/ === method then ' (' else ' (\\S*' end post = if /\$$/ === method then ') ' else '\\S*) ' end method.sub!(/^\^/, '') method.sub!(/\$$/, '') method.gsub!('\\.', '\\S') begin re = Regexp.new("#{pre}#{method}#{post}") p re if $DEBUG rescue re = false end end end t = Tree.new if re @methodlist.scan(re).sort.each do |n| @m[n[0]].each do |x| t.add(x[1].ancestors.reverse.collect{|i| i.to_s}, x[0]) end end else @m[method].each do |x| t.add(x[1].ancestors.reverse.collect{|i| i.to_s}, x[0]) end end print t end end usage if ARGV.size < 1 $RE = false while ARGV break unless /^-/ === ARGV[0] case ARGV[0] when '-i' break unless ARGV.size > 1 ARGV.shift require ARGV.shift when '-x' ARGV.shift $RE = true end end usage if ARGV.size < 1 mt = MethodTree.new ARGV.each do |x| mt.searchmethod(x) end