@@ -3,6 +3,7 @@ use super::comment::JSDocComment;
33use super :: namespace:: CppItem ;
44use super :: traits:: { ASTEntry , Access , EntityMethods , Entry , Include } ;
55use crate :: annotation:: Annotations ;
6+ use crate :: builder:: namespace:: Namespace ;
67use crate :: config:: Config ;
78use crate :: html:: { Html , HtmlElement , HtmlList , HtmlText } ;
89use 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+
4550fn 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+
415436pub 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}
0 commit comments