Class: FastRI::NameDescriptor

Inherits:
Object
  • Object
show all
Defined in:
lib/fastri/name_descriptor.rb

Overview

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(arg) ⇒ NameDescriptor

Returns a new instance of NameDescriptor.

[View source]

26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# 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

Instance Attribute Details

#class_namesObject (readonly)

Returns the value of attribute class_names.


20
21
22
# File 'lib/fastri/name_descriptor.rb', line 20

def class_names
  @class_names
end

#is_class_methodObject (readonly)

true and false have the obvious meaning. nil means we don’t care


24
25
26
# File 'lib/fastri/name_descriptor.rb', line 24

def is_class_method
  @is_class_method
end

#method_nameObject (readonly)

Returns the value of attribute method_name.


21
22
23
# File 'lib/fastri/name_descriptor.rb', line 21

def method_name
  @method_name
end

Instance Method Details

#full_class_nameObject

Return the full class name (with ‘::’ between the components) or “” if there’s no class name

[View source]

66
67
68
# File 'lib/fastri/name_descriptor.rb', line 66

def full_class_name
  @class_names.join("::")
end