Skip to content

Commit 65be85c

Browse files
Miaaltalk23
authored andcommitted
feature: derived classes list
1 parent 577cdf1 commit 65be85c

File tree

2 files changed

+50
-2
lines changed

2 files changed

+50
-2
lines changed

src/builder/shared.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use super::comment::JSDocComment;
33
use super::namespace::CppItem;
44
use super::traits::{ASTEntry, Access, EntityMethods, Entry, Include};
55
use crate::annotation::Annotations;
6+
use crate::builder::namespace::Namespace;
67
use crate::config::Config;
78
use crate::html::{Html, HtmlElement, HtmlList, HtmlText};
89
use clang::{Accessibility, Entity, EntityKind, Type, TypeKind};
@@ -42,6 +43,10 @@ impl<T, Sep: Fn() -> T> InsertBetween<T, Sep> for Vec<T> {
4243
}
4344
}
4445

46+
fn get_all_classes<'e>(namespace: &'e Namespace<'e>) -> Vec<&'e dyn ASTEntry<'e>> {
47+
namespace.get(&|entry| matches!(entry.category(), "class" | "struct"))
48+
}
49+
4550
fn fmt_type(entity: &Type, builder: &Builder) -> Html {
4651
let base = entity.get_pointee_type().unwrap_or(entity.to_owned());
4752
let decl = base.get_declaration();
@@ -412,6 +417,22 @@ pub fn fmt_base_classes<'e, T: ASTEntry<'e>>(entry: &T, kw: &str, builder: &Buil
412417
.into()
413418
}
414419

420+
pub fn fmt_derived_class(entity: &Entity, builder: &Builder) -> Html {
421+
HtmlElement::new("div")
422+
.with_classes(&["entity", "class"])
423+
.with_child(
424+
HtmlElement::new("a")
425+
.with_attr_opt("href", entity.abs_docs_url(builder.config.clone()))
426+
.with_child(Html::span(&["keyword", "space-after"], "class"))
427+
.with_child(Html::span(
428+
&["name"],
429+
entity.get_name().unwrap_or("_".into()).as_str(),
430+
))
431+
.with_child(Html::span(&["space-before"], "{ ... }")),
432+
)
433+
.into()
434+
}
435+
415436
pub fn output_entity<'e, T: ASTEntry<'e>>(
416437
entry: &T,
417438
builder: &Builder,
@@ -529,6 +550,33 @@ pub fn output_classlike<'e, T: ASTEntry<'e>>(
529550
.collect::<Vec<_>>(),
530551
),
531552
),
553+
(
554+
"derived_classes",
555+
fmt_section("Derived classes", {
556+
let mut derived: Vec<_> = get_all_classes(&builder.root)
557+
.into_iter()
558+
.filter(|potentially_derived| {
559+
potentially_derived
560+
.entity()
561+
.get_children()
562+
.iter()
563+
.any(|child| {
564+
child.get_kind() == EntityKind::BaseSpecifier
565+
&& child
566+
.get_type()
567+
.and_then(|t| t.get_declaration())
568+
.map(|decl| decl.get_usr() == entry.entity().get_usr())
569+
.unwrap_or(false)
570+
})
571+
})
572+
.collect();
573+
derived.sort_by_key(|d| d.entity().get_name().unwrap_or("_".into()));
574+
derived
575+
.into_iter()
576+
.map(|d| fmt_derived_class(d.entity(), builder))
577+
.collect::<Vec<_>>()
578+
}),
579+
),
532580
]);
533581
ent
534582
}

templates/class.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
<h1 class="entity-title">Class <i data-feather="box" class="icon"></i><a href="{page_url}">{name}</a></h1>
32
<div>
43
{header_link}
@@ -14,4 +13,5 @@ <h1 class="entity-title">Class <i data-feather="box" class="icon"></i><a href="{
1413
{public_members}
1514
{protected_member_functions}
1615
{protected_members}
17-
</div>
16+
{derived_classes}
17+
</div>

0 commit comments

Comments
 (0)