X-Git-Url: http://nitlanguage.org diff --git a/src/doc/doc_phases/doc_structure.nit b/src/doc/doc_phases/doc_structure.nit index 65d9f59..d84a739 100644 --- a/src/doc/doc_phases/doc_structure.nit +++ b/src/doc/doc_phases/doc_structure.nit @@ -49,13 +49,13 @@ redef class OverviewPage redef fun apply_structure(v, doc) do var article = new HomeArticle("home.article", "Home") root.add_child article - # Projects list - var mprojects = doc.model.mprojects.to_a + # Packages list + var mpackages = doc.model.mpackages.to_a var sorter = new MConcernRankSorter - sorter.sort mprojects - var section = new DocSection("projects.section", "Projects") - for mproject in mprojects do - section.add_child new DefinitionArticle("{mproject.nitdoc_id}.definition", mproject) + sorter.sort mpackages + var section = new DocSection("packages.section", "Packages") + for mpackage in mpackages do + section.add_child new DefinitionArticle("{mpackage.nitdoc_id}.definition", null, mpackage) end article.add_child section end @@ -69,32 +69,32 @@ redef class SearchPage v.name_sorter.sort(mclasses) var mprops = doc.mproperties.to_a v.name_sorter.sort(mprops) - root.add_child new IndexArticle("index.article", mmodules, mclasses, mprops) + root.add_child new IndexArticle("index.article", null, mmodules, mclasses, mprops) end end redef class MGroupPage redef fun apply_structure(v, doc) do - var section = new MEntitySection("{mentity.nitdoc_name}.section", mentity) + var section = new MEntitySection("{mentity.nitdoc_name}.section", null, mentity) root.add_child section if mentity.is_root then - section.add_child new IntroArticle("{mentity.mproject.nitdoc_id}.intro", mentity.mproject) + section.add_child new IntroArticle("{mentity.mpackage.nitdoc_id}.intro", null, mentity.mpackage) else - section.add_child new IntroArticle("{mentity.nitdoc_id}.intro", mentity) + section.add_child new IntroArticle("{mentity.nitdoc_id}.intro", null, mentity) end var concerns = self.concerns if concerns == null or concerns.is_empty then return # FIXME avoid diff - mentity.mproject.booster_rank = -1000 + mentity.mpackage.booster_rank = -1000 mentity.booster_rank = -1000 concerns.sort_with(v.concerns_sorter) - mentity.mproject.booster_rank = 0 + mentity.mpackage.booster_rank = 0 mentity.booster_rank = 0 - section.add_child new ConcernsArticle("{mentity.nitdoc_id}.concerns", mentity, concerns) + section.add_child new ConcernsArticle("{mentity.nitdoc_id}.concerns", null, mentity, concerns) for mentity in concerns do - var ssection = new ConcernSection("{mentity.nitdoc_id}.concern", mentity) + var ssection = new ConcernSection("{mentity.nitdoc_id}.concern", null, mentity) if mentity isa MModule then - ssection.add_child new DefinitionArticle("{mentity.nitdoc_id}.definition", mentity) + ssection.add_child new DefinitionArticle("{mentity.nitdoc_id}.definition", null, mentity) end section.add_child ssection end @@ -103,38 +103,38 @@ end redef class MModulePage redef fun apply_structure(v, doc) do - var section = new MEntitySection("{mentity.nitdoc_name}.section", mentity) + var section = new MEntitySection("{mentity.nitdoc_name}.section", null, mentity) root.add_child section - section.add_child new IntroArticle("{mentity.nitdoc_id}.intro", mentity) + section.add_child new IntroArticle("{mentity.nitdoc_id}.intro", null, mentity) var concerns = self.concerns if concerns == null or concerns.is_empty then return # FIXME avoid diff - mentity.mgroup.mproject.booster_rank = -1000 + mentity.mgroup.mpackage.booster_rank = -1000 mentity.mgroup.booster_rank = -1000 mentity.booster_rank = -1000 concerns.sort_with(v.concerns_sorter) - mentity.mgroup.mproject.booster_rank = 0 + mentity.mgroup.mpackage.booster_rank = 0 mentity.mgroup.booster_rank = 0 mentity.booster_rank = 0 - section.add_child new ConcernsArticle("{mentity.nitdoc_id}.concerns", mentity, concerns) + section.add_child new ConcernsArticle("{mentity.nitdoc_id}.concerns", null, mentity, concerns) # reference list for mentity in concerns do - var ssection = new ConcernSection("{mentity.nitdoc_id}.concern", mentity) + var ssection = new ConcernSection("{mentity.nitdoc_id}.concern", null, mentity) if mentity isa MModule then var mclasses = mclasses_for_mmodule(mentity).to_a v.name_sorter.sort(mclasses) for mclass in mclasses do var article = new DefinitionListArticle( - "{mclass.intro.nitdoc_id}.definition-list", mclass) + "{mclass.intro.nitdoc_id}.definition-list", null, mclass) var mclassdefs = mclassdefs_for(mclass).to_a if not mclassdefs.has(mclass.intro) then article.add_child(new DefinitionArticle( - "{mclass.intro.nitdoc_id}.definition", mclass.intro)) + "{mclass.intro.nitdoc_id}.definition", null, mclass.intro)) end doc.mainmodule.linearize_mclassdefs(mclassdefs) for mclassdef in mclassdefs do article.add_child(new DefinitionArticle( - "{mclassdef.nitdoc_id}.definition", mclassdef)) + "{mclassdef.nitdoc_id}.definition", null, mclassdef)) end ssection.add_child article end @@ -147,7 +147,7 @@ redef class MModulePage private fun mclasses_for_mmodule(mmodule: MModule): Set[MClass] do var mclasses = new HashSet[MClass] for mclass in self.mclasses do - if mclass.intro.mmodule == mmodule then + if mclass.intro_mmodule == mmodule then mclasses.add mclass end end @@ -168,29 +168,28 @@ end redef class MClassPage redef fun apply_structure(v, doc) do - var section = new MEntitySection("{mentity.nitdoc_name}.section", mentity) + var section = new MEntitySection("{mentity.nitdoc_name}.section", null, mentity) root.add_child section - section.add_child new IntroArticle("{mentity.nitdoc_id}.intro", mentity) + section.add_child new IntroArticle("{mentity.nitdoc_id}.intro", null, mentity) var concerns = self.concerns if concerns == null or concerns.is_empty then return # FIXME diff hack - mentity.intro_mmodule.mgroup.mproject.booster_rank = -1000 + mentity.intro_mmodule.mgroup.mpackage.booster_rank = -1000 mentity.intro_mmodule.mgroup.booster_rank = -1000 mentity.intro_mmodule.booster_rank = -1000 concerns.sort_with(v.concerns_sorter) - mentity.intro_mmodule.mgroup.mproject.booster_rank = 0 + mentity.intro_mmodule.mgroup.mpackage.booster_rank = 0 mentity.intro_mmodule.mgroup.booster_rank = 0 mentity.intro_mmodule.booster_rank = 0 - var constructors = new ConstructorsSection( - "{mentity.nitdoc_id}.constructors", mentity) + var constructors = new DocSection("{mentity.nitdoc_id}.constructors", "Constructors") var minit = mentity.root_init if minit != null then - constructors.add_child new DefinitionArticle("{minit.nitdoc_id}.definition", minit) + constructors.add_child new DefinitionArticle("{minit.nitdoc_id}.definition", null, minit) end section.add_child constructors - section.add_child new ConcernsArticle("{mentity.nitdoc_id}.concerns", mentity, concerns) + section.add_child new ConcernsArticle("{mentity.nitdoc_id}.concerns", null, mentity, concerns) for mentity in concerns do - var ssection = new ConcernSection("{mentity.nitdoc_id}.concern", mentity) + var ssection = new ConcernSection("{mentity.nitdoc_id}.concern", null, mentity) if mentity isa MModule then var mprops = mproperties_for(mentity) var by_kind = new PropertiesByKind.with_elements(mprops) @@ -201,10 +200,10 @@ redef class MClassPage if mpropdef isa MMethodDef and mpropdef.mproperty.is_init then if mpropdef == minit then continue constructors.add_child new DefinitionArticle( - "{mpropdef.nitdoc_id}.definition", mpropdef) + "{mpropdef.nitdoc_id}.definition", null, mpropdef) else ssection.add_child new DefinitionArticle( - "{mpropdef.nitdoc_id}.definition", mpropdef) + "{mpropdef.nitdoc_id}.definition", null, mpropdef) end end end @@ -244,29 +243,29 @@ end redef class MPropertyPage redef fun apply_structure(v, doc) do - var section = new MEntitySection("{mentity.nitdoc_name}.section", mentity) + var section = new MEntitySection("{mentity.nitdoc_name}.section", null, mentity) root.add_child section - section.add_child new IntroArticle("{mentity.nitdoc_id}.intro", mentity) + section.add_child new IntroArticle("{mentity.nitdoc_id}.intro", null, mentity) var concerns = self.concerns if concerns == null or concerns.is_empty then return # FIXME diff hack - mentity.intro.mclassdef.mmodule.mgroup.mproject.booster_rank = -1000 + mentity.intro.mclassdef.mmodule.mgroup.mpackage.booster_rank = -1000 mentity.intro.mclassdef.mmodule.mgroup.booster_rank = -1000 mentity.intro.mclassdef.mmodule.booster_rank = -1000 concerns.sort_with(v.concerns_sorter) - mentity.intro.mclassdef.mmodule.mgroup.mproject.booster_rank = 0 + mentity.intro.mclassdef.mmodule.mgroup.mpackage.booster_rank = 0 mentity.intro.mclassdef.mmodule.mgroup.booster_rank = 0 mentity.intro.mclassdef.mmodule.booster_rank = 0 - section.add_child new ConcernsArticle("{mentity.nitdoc_id}.concerns", mentity, concerns) + section.add_child new ConcernsArticle("{mentity.nitdoc_id}.concerns", null, mentity, concerns) for mentity in concerns do - var ssection = new ConcernSection("{mentity.nitdoc_id}.concern", mentity) + var ssection = new ConcernSection("{mentity.nitdoc_id}.concern", null, mentity) if mentity isa MModule then # Add mproperties var mpropdefs = mpropdefs_for(mentity).to_a v.name_sorter.sort(mpropdefs) for mpropdef in mpropdefs do ssection.add_child new DefinitionArticle( - "{mpropdef.nitdoc_id}.definition", mpropdef) + "{mpropdef.nitdoc_id}.definition", null, mpropdef) end end section.add_child ssection @@ -307,11 +306,6 @@ class MEntityComposite var mentity: MEntity end -# A list of constructors. -class ConstructorsSection - super MEntitySection -end - # A Section about a Concern. # # Those sections are used to build the page summary. @@ -370,7 +364,7 @@ class ConcernsArticle redef fun is_hidden do return concerns.is_empty end -# An article that displaus a list of definition belonging to a MEntity. +# An article that displays a list of definition belonging to a MEntity. class DefinitionListArticle super TabbedGroup super MEntityArticle @@ -383,7 +377,7 @@ class DefinitionArticle redef var is_hidden = false end -# The main project article. +# The main package article. class HomeArticle super DocArticle end @@ -405,3 +399,75 @@ class IndexArticle return mmodules.is_empty and mclasses.is_empty and mprops.is_empty end end + +# Concerns ranking + +# Sort MConcerns based on the module importation hierarchy ranking +# see also: `MConcern::concern_rank` and `MConcern::booster_rank` +# +# Comparison is made with the formula: +# +# ~~~nitish +# a.concern_rank + a.booster_rank <=> b.concern_rank + b.booster_ran +# ~~~ +# +# If both `a` and `b` have the same ranking, +# ordering is based on lexicographic comparison of `a.name` and `b.name` +class MConcernRankSorter + super Comparator + redef type COMPARED: MConcern + + redef fun compare(a, b) do + if a.concern_rank == b.concern_rank then + return a.name <=> b.name + end + return a.concern_rank + a.booster_rank <=> b.concern_rank + b.booster_rank + end +end + +redef class MConcern + + # Boost a MConcern rank + # see: `MConcernRankSorter` + # Use a positive booster to push down a result in the list + # A negative booster can be used to push up the result + var booster_rank: Int = 0 is writable + + # Concern ranking used for ordering + # see: `MConcernRankSorter` + # Rank can be positive or negative + fun concern_rank: Int is abstract +end + +redef class MPackage + redef var concern_rank is lazy do + var max = 0 + for mgroup in mgroups do + var mmax = mgroup.concern_rank + if mmax > max then max = mmax + end + return max + 1 + end +end + +redef class MGroup + redef var concern_rank is lazy do + var max = 0 + for mmodule in mmodules do + var mmax = mmodule.concern_rank + if mmax > max then max = mmax + end + return max + 1 + end +end + +redef class MModule + redef var concern_rank is lazy do + var max = 0 + for p in in_importation.direct_greaters do + var pmax = p.concern_rank + if pmax > max then max = pmax + end + return max + 1 + end +end