Skip to content

Commit a7331c8

Browse files
committed
List all class ancestors
1 parent 7fb0e50 commit a7331c8

File tree

3 files changed

+58
-7
lines changed

3 files changed

+58
-7
lines changed

lib/rdoc/code_object/class_module.rb

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -711,6 +711,20 @@ def superclass=(superclass)
711711
@superclass = superclass
712712
end
713713

714+
##
715+
# Get all super classes of this class in an array. The last element might be
716+
# a string if the name is unknown.
717+
718+
def super_classes
719+
result = []
720+
parent = self
721+
while parent = parent.superclass
722+
result << parent
723+
return result if parent.is_a?(String)
724+
end
725+
result
726+
end
727+
714728
def to_s # :nodoc:
715729
if is_alias_for then
716730
"#{self.class.name} #{self.full_name} -> #{is_alias_for}"
Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,42 @@
1-
<%- if klass.type == 'class' then %>
1+
<%- if klass.type == 'class' && (ancestors = klass.super_classes).any? then %>
22
<div id="parent-class-section" class="nav-section">
3-
<h3>Parent</h3>
3+
<h3>Ancestors</h3>
4+
<% if ancestors.size > 1 %>
5+
<% parent = ancestors.shift %>
6+
<ul>
7+
<li>
8+
<details>
9+
<summary>
10+
<% if parent.is_a?(RDoc::NormalClass) %>
11+
<a href="<%= klass.aref_to parent.path -%>"><%= parent.full_name -%></a>
12+
<% else %>
13+
<%= parent -%>
14+
<% end %>
15+
</summary>
416

5-
<%- if klass.superclass and not String === klass.superclass then -%>
6-
<p class="link"><a href="<%= klass.aref_to klass.superclass.path %>"><%= klass.superclass.full_name %></a>
7-
<%- else -%>
8-
<p class="link"><%= klass.superclass %>
9-
<%- end -%>
17+
<% for ancestor in ancestors %>
18+
<ul>
19+
<li>
20+
<% if ancestor.is_a?(RDoc::NormalClass) %>
21+
<a href="<%= klass.aref_to ancestor.path -%>"><%= ancestor.full_name -%></a>
22+
<% else %>
23+
<%= ancestor -%>
24+
<% end %>
25+
<% end %>
26+
27+
<% for ancestor in ancestors # Sorry, templates cannot be recursive %>
28+
</li>
29+
</ul>
30+
<% end %>
31+
</details>
32+
</li>
33+
</ul>
34+
<% else %>
35+
<%- if klass.superclass and not String === klass.superclass then -%>
36+
<p class="link"><a href="<%= klass.aref_to klass.superclass.path %>"><%= klass.superclass.full_name %></a>
37+
<%- else -%>
38+
<p class="link"><%= klass.superclass %>
39+
<%- end -%>
40+
<% end %>
1041
</div>
1142
<%- end -%>

test/rdoc/test_rdoc_class_module.rb

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1279,6 +1279,12 @@ def test_superclass
12791279
assert_equal @c3_h1, @c3_h2.superclass
12801280
end
12811281

1282+
def test_super_classes
1283+
rdoc_c3_h1 = @xref_data.find_module_named('C3::H1')
1284+
rdoc_object = @xref_data.find_module_named('Object')
1285+
assert_equal [rdoc_c3_h1, rdoc_object, "BasicObject"], @c3_h2.super_classes
1286+
end
1287+
12821288
def test_update_aliases_class
12831289
n1 = @xref_data.add_module RDoc::NormalClass, 'N1'
12841290
n1_k2 = n1.add_module RDoc::NormalClass, 'N2'

0 commit comments

Comments
 (0)