From: Jean Privat Date: Wed, 25 Jun 2014 23:49:29 +0000 (-0400) Subject: Merge: Model utils X-Git-Tag: v0.6.6~16 X-Git-Url: http://nitlanguage.org?hp=ae43f2efd62c6f12ee2bba9ded45117131b79e98 Merge: Model utils This pull request needs #522 to be merged. Introduce some usefull services in model_utils for further uses in documentation tools. Pull-Request: #523 Reviewed-by: Jean Privat Reviewed-by: Lucas Bajolet Reviewed-by: Alexis Laferrière --- diff --git a/src/model_utils.nit b/src/model_utils.nit index b2c741b..be3fd4d 100644 --- a/src/model_utils.nit +++ b/src/model_utils.nit @@ -19,6 +19,50 @@ module model_utils import modelbuilder +redef class MGroup + fun in_nesting_intro_mclasses(min_visibility: MVisibility): Set[MClass] do + var res = new HashSet[MClass] + var lst = in_nesting.direct_smallers + for mmodule in mmodules do res.add_all mmodule.filter_intro_mclasses(min_visibility) + for mgrp in lst do res.add_all mgrp.in_nesting_intro_mclasses(min_visibility) + return res + end + + fun in_nesting_redef_mclasses(min_visibility: MVisibility): Set[MClass] do + var res = new HashSet[MClass] + var lst = in_nesting.direct_smallers + for mmodule in mmodules do res.add_all mmodule.filter_redef_mclasses(min_visibility) + for mgrp in lst do res.add_all mgrp.in_nesting_redef_mclasses(min_visibility) + return res + end + + fun in_nesting_intro_mclassdefs(min_visibility: MVisibility): Set[MClassDef] do + var res = new HashSet[MClassDef] + var lst = in_nesting.direct_smallers + for mmodule in mmodules do res.add_all mmodule.intro_mclassdefs(min_visibility) + for mgrp in lst do res.add_all mgrp.in_nesting_intro_mclassdefs(min_visibility) + return res + end + + fun in_nesting_redef_mclassdefs(min_visibility: MVisibility): Set[MClassDef] do + var res = new HashSet[MClassDef] + var lst = in_nesting.direct_smallers + for mmodule in mmodules do res.add_all mmodule.redef_mclassdefs(min_visibility) + for mgrp in lst do res.add_all mgrp.in_nesting_redef_mclassdefs(min_visibility) + return res + end + + # Collect nested modules + fun collect_mmodules: Set[MModule] do + var res = new HashSet[MModule] + res.add_all mmodules + for mgroup in in_nesting.direct_smallers do + res.add_all mgroup.collect_mmodules + end + return res + end +end + redef class MModule # The list of intro mclassdef in the module. @@ -45,6 +89,17 @@ redef class MModule return res end + # The list of intro mclass in the module. + # with visibility >= to min_visibility + fun filter_intro_mclasses(min_visibility: MVisibility): Set[MClass] do + var res = new HashSet[MClass] + for mclass in intro_mclasses do + if mclass.visibility < min_visibility then continue + res.add mclass + end + return res + end + # Get the list of mclasses refined in 'self'. fun redef_mclasses: Set[MClass] do var mclasses = new HashSet[MClass] @@ -54,6 +109,16 @@ redef class MModule return mclasses end + # Get the list of mclasses refined in 'self'. + fun filter_redef_mclasses(min_visibility: MVisibility): Set[MClass] do + var mclasses = new HashSet[MClass] + for c in mclassdefs do + if c.mclass.visibility < min_visibility then continue + if not c.is_intro then mclasses.add(c.mclass) + end + return mclasses + end + # Get the list of all mclasses imported by 'self'. fun imported_mclasses: Set[MClass] do var mclasses = new HashSet[MClass] @@ -67,7 +132,7 @@ redef class MModule fun in_nesting_intro_mclasses(min_visibility: MVisibility): Set[MClass] do var res = new HashSet[MClass] for mmodule in in_nesting.greaters do - for mclass in mmodule.intro_mclasses do + for mclass in mmodule.filter_intro_mclasses(min_visibility) do if mclass.visibility < min_visibility then continue res.add mclass end @@ -78,7 +143,7 @@ redef class MModule fun in_nesting_redef_mclasses(min_visibility: MVisibility): Set[MClass] do var res = new HashSet[MClass] for mmodule in self.in_nesting.greaters do - for mclass in mmodule.redef_mclasses do + for mclass in mmodule.filter_redef_mclasses(min_visibility) do if mclass.visibility < min_visibility then continue res.add mclass end