Re-enable spec/library for full CI runs.
[rbx.git] / lib / rdoc / ri / util.rb
blob34277f2594cfbad92d8b11994d1d9ef6a76fbddf
1 require 'rdoc/ri'
3 class RDoc::RI::Error < RuntimeError; end
5 ##
6 # Break argument into its constituent class or module names, an
7 # optional method type, and a method name
9 class RDoc::RI::NameDescriptor
11   attr_reader :class_names
12   attr_reader :method_name
14   ##
15   # true and false have the obvious meaning. nil means we don't care
17   attr_reader :is_class_method
19   ##
20   # +arg+ may be
21   #
22   # 1. A class or module name (optionally qualified with other class or module
23   #    names (Kernel, File::Stat etc)
24   # 2. A method name
25   # 3. A method name qualified by a optionally fully qualified class or module
26   #    name
27   #
28   # We're fairly casual about delimiters: folks can say Kernel::puts,
29   # Kernel.puts, or Kernel\#puts for example. There's one exception: if you
30   # say IO::read, we look for a class method, but if you say IO.read, we look
31   # for an instance method
33   def initialize(arg)
34     @class_names = []
35     separator = nil
37     tokens = arg.split(/(\.|::|#)/)
39     # Skip leading '::', '#' or '.', but remember it might
40     # be a method name qualifier
41     separator = tokens.shift if tokens[0] =~ /^(\.|::|#)/
43     # Skip leading '::', but remember we potentially have an inst
45     # leading stuff must be class names
47     while tokens[0] =~ /^[A-Z]/
48       @class_names << tokens.shift
49       unless tokens.empty?
50         separator = tokens.shift
51         break unless separator == "::"
52       end
53     end
55     # Now must have a single token, the method name, or an empty array
56     unless tokens.empty?
57       @method_name = tokens.shift
58       # We may now have a trailing !, ?, or = to roll into
59       # the method name
60       if !tokens.empty? && tokens[0] =~ /^[!?=]$/
61         @method_name << tokens.shift
62       end
64       if @method_name =~ /::|\.|#/ or !tokens.empty?
65         raise RDoc::RI::Error.new("Bad argument: #{arg}") 
66       end
67       if separator && separator != '.'
68         @is_class_method = separator == "::"
69       end
70     end
71   end
73   # Return the full class name (with '::' between the components) or "" if
74   # there's no class name
76   def full_class_name
77     @class_names.join("::")
78   end
80 end