Alternative NameDescriptor implementation which doesn't require class/module names to be properly capitalized.
Rules:
#foo
: instance method foo
.foo
: method foo
(either singleton or instance)
::foo
: singleton method foo
foo::bar#bar<tt>: instance method bar under
<tt>foo::bar
foo::bar.bar<tt>: either singleton or instance method bar under
<tt>foo::bar
<tt>foo::bar::Baz<tt>: module/class foo:bar::Baz
foo::bar::baz
: singleton method baz
from
foo::bar
other: raise RiError
true and false have the obvious meaning. nil means we don't care
# File lib/fastri/name_descriptor.rb, line 26 def initialize(arg) @class_names = [] @method_name = nil @is_class_method = nil case arg when /((?:[^:]*::)*[^:]*)(#|::|\.)(.*)$/ ns, sep, meth_or_class = $~.captures # optimization attempt: try to guess the real capitalization, # so we get a direct hit @class_names = ns.split(/::/).map{|x| x[0,1] = x[0,1].upcase; x } if %w[# .].include? sep @method_name = meth_or_class @is_class_method = case sep when "#"; false when "."; nil end else if ("A".."Z").include? meth_or_class[0,1] # 1.9 compatibility @class_names << meth_or_class else @method_name = meth_or_class @is_class_method = true end end when /^[^#:.]+/ if ("A".."Z").include? arg[0,1] @class_names = [arg] else @method_name = arg.dup @is_class_method = nil end else raise RiError, "Cannot create NameDescriptor from #{arg}" end end
Return the full class name (with '::' between the components) or “” if there's no class name
# File lib/fastri/name_descriptor.rb, line 66 def full_class_name @class_names.join("::") end