1 | require 'rdoc/ri/ri_descriptions'
|
---|
2 | require 'rdoc/ri/ri_writer'
|
---|
3 | require 'rdoc/markup/simple_markup/to_flow'
|
---|
4 |
|
---|
5 | module RI
|
---|
6 | class RiReader
|
---|
7 |
|
---|
8 | def initialize(ri_cache)
|
---|
9 | @cache = ri_cache
|
---|
10 | end
|
---|
11 |
|
---|
12 | def top_level_namespace
|
---|
13 | [ @cache.toplevel ]
|
---|
14 | end
|
---|
15 |
|
---|
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
|
---|
23 |
|
---|
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
|
---|
33 |
|
---|
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
|
---|
41 |
|
---|
42 | # return the MethodDescription for a given MethodEntry
|
---|
43 | # by deserializing the YAML
|
---|
44 | def get_method(method_entry)
|
---|
45 | path = method_entry.path_name
|
---|
46 | File.open(path) { |f| RI::Description.deserialize(f) }
|
---|
47 | end
|
---|
48 |
|
---|
49 | # Return a class description
|
---|
50 | def get_class(class_entry)
|
---|
51 | result = nil
|
---|
52 | for path in class_entry.path_names
|
---|
53 | path = RiWriter.class_desc_path(path, class_entry)
|
---|
54 | desc = File.open(path) {|f| RI::Description.deserialize(f) }
|
---|
55 | if result
|
---|
56 | result.merge_in(desc)
|
---|
57 | else
|
---|
58 | result = desc
|
---|
59 | end
|
---|
60 | end
|
---|
61 | result
|
---|
62 | end
|
---|
63 |
|
---|
64 | # return the names of all classes and modules
|
---|
65 | def full_class_names
|
---|
66 | res = []
|
---|
67 | find_classes_in(res, @cache.toplevel)
|
---|
68 | end
|
---|
69 |
|
---|
70 | # return a list of all classes, modules, and methods
|
---|
71 | def all_names
|
---|
72 | res = []
|
---|
73 | find_names_in(res, @cache.toplevel)
|
---|
74 | end
|
---|
75 |
|
---|
76 | # ----
|
---|
77 | private
|
---|
78 | # ----
|
---|
79 |
|
---|
80 | def find_classes_in(res, klass)
|
---|
81 | classes = klass.classes_and_modules
|
---|
82 | for c in classes
|
---|
83 | res << c.full_name
|
---|
84 | find_classes_in(res, c)
|
---|
85 | end
|
---|
86 | res
|
---|
87 | end
|
---|
88 |
|
---|
89 | def find_names_in(res, klass)
|
---|
90 | classes = klass.classes_and_modules
|
---|
91 | for c in classes
|
---|
92 | res << c.full_name
|
---|
93 | res.concat c.all_method_names
|
---|
94 | find_names_in(res, c)
|
---|
95 | end
|
---|
96 | res
|
---|
97 | end
|
---|
98 |
|
---|
99 | end
|
---|
100 | end
|
---|