Fix up Rubinius specific library specs.
[rbx.git] / lib / rdoc / ri / reader.rb
blob986bb75954f0c4f11b225628912c71913f797eb0
1 require 'rdoc/ri'
2 require 'rdoc/ri/descriptions'
3 require 'rdoc/ri/writer'
4 require 'rdoc/markup/to_flow'
6 class RDoc::RI::Reader
8   def initialize(ri_cache)
9     @cache = ri_cache
10   end
12   def top_level_namespace
13     [ @cache.toplevel ]
14   end
16   def lookup_namespace_in(target, namespaces)
17     result = []
18     for n in namespaces
19       result.concat(n.contained_modules_matching(target))
20     end
21     result
22   end
24   def find_class_by_name(full_name)
25     names = full_name.split(/::/)
26     ns = @cache.toplevel
27     for name in names
28       ns = ns.contained_class_named(name)
29       return nil if ns.nil?
30     end
31     get_class(ns)
32   end
34   def find_methods(name, is_class_method, namespaces)
35     result = []
36     namespaces.each do |ns|
37       result.concat ns.methods_matching(name, is_class_method)
38     end
39     result
40   end
42   ##
43   # Return the MethodDescription for a given MethodEntry by deserializing the
44   # YAML
46   def get_method(method_entry)
47     path = method_entry.path_name
48     File.open(path) { |f| RI::Description.deserialize(f) }
49   end
51   ##
52   # Return a class description
54   def get_class(class_entry)
55     result = nil
56     for path in class_entry.path_names
57       path = RiWriter.class_desc_path(path, class_entry)
58       desc = File.open(path) {|f| RI::Description.deserialize(f) }
59       if result
60         result.merge_in(desc)
61       else
62         result = desc
63       end
64     end
65     result
66   end
68   ##
69   # Return the names of all classes and modules
71   def full_class_names
72     res = []
73     find_classes_in(res, @cache.toplevel)
74   end
76   ##
77   # Return a list of all classes, modules, and methods
79   def all_names
80     res = []
81     find_names_in(res, @cache.toplevel)
82   end
84   private
86   def find_classes_in(res, klass)
87     classes = klass.classes_and_modules
88     for c in classes
89       res << c.full_name
90       find_classes_in(res, c)
91     end
92     res
93   end
95   def find_names_in(res, klass)
96     classes = klass.classes_and_modules
97     for c in classes
98       res << c.full_name
99       res.concat c.all_method_names
100       find_names_in(res, c)
101     end
102     res
103   end