+# Use `MClassDef` as anchor for its constructors only
+redef class MClassDef
+ private var target_constructor: nullable MMethodDef = null
+
+ redef fun complete_name
+ do
+ var target_constructor = target_constructor
+ assert target_constructor != null
+
+ var params
+ var mparameters = mclass.mparameters
+ if not mparameters.is_empty then
+ params = "[{mparameters.join(", ")}]"
+ else
+ params = ""
+ end
+
+ if target_constructor.name != "init" and target_constructor.name != "new" then
+ return name + params + "." + target_constructor.name
+ end
+
+ return name + params
+ end
+
+ redef fun complete_mdoc
+ do
+ var target_constructor = target_constructor
+ assert target_constructor != null
+
+ if target_constructor.name != "init" and target_constructor.name != "new" then
+ return target_constructor.mdoc
+ end
+
+ return mdoc
+ end
+end
+
+redef class MClassType
+ redef fun write_extra_doc(view, stream)
+ do
+ # Super classes
+ stream.write line_separator*2
+ stream.write "## Class hierarchy"
+
+ var direct_supers = [for s in mclass.in_hierarchy(view.mainmodule).direct_greaters do s.name]
+ if not direct_supers.is_empty then
+ alpha_comparator.sort direct_supers
+ stream.write line_separator
+ stream.write "* Direct super classes: "
+ stream.write direct_supers.join(", ")
+ end
+
+ var supers = [for s in mclass.in_hierarchy(view.mainmodule).greaters do s.name]
+ supers.remove mclass.name
+ if not supers.is_empty then
+ alpha_comparator.sort supers
+ stream.write line_separator
+ stream.write "* All super classes: "
+ stream.write supers.join(", ")
+ end
+
+ var direct_subs = [for s in mclass.in_hierarchy(view.mainmodule).direct_smallers do s.name]
+ if not direct_subs.is_empty then
+ alpha_comparator.sort direct_subs
+ stream.write line_separator
+ stream.write "* Direct sub classes: "
+ stream.write direct_subs.join(", ")
+ end
+
+ var subs = [for s in mclass.in_hierarchy(view.mainmodule).smallers do s.name]
+ subs.remove mclass.name
+ if not subs.is_empty then
+ alpha_comparator.sort subs
+ stream.write line_separator
+ stream.write "* All sub classes: "
+ stream.write subs.join(", ")
+ end
+
+ # List other properties
+ stream.write line_separator*2
+ stream.write "## Properties"
+ stream.write line_separator
+ var props = mclass.collect_accessible_mproperties(view).to_a
+ alpha_comparator.sort props
+ for prop in props do
+ if mclass.name == "Object" or prop.intro.mclassdef.mclass.name != "Object" then
+ prop.write_synopsis(view.mainmodule, stream)
+ end
+ end
+ end
+
+ redef fun complete_mdoc do return mclass.intro.mdoc
+
+ redef fun write_location(mainmodule, stream)
+ do
+ for i in 2.times do stream.write line_separator
+ stream.write "## Location of introduction and refinements"
+ for c in mclass.mclassdefs do
+ stream.write line_separator
+ stream.write "* {c.location}"
+ end
+ end
+end
+