X-Git-Url: http://nitlanguage.org diff --git a/src/model/model_collect.nit b/src/model/model_collect.nit index a4f530c..627f982 100644 --- a/src/model/model_collect.nit +++ b/src/model/model_collect.nit @@ -14,18 +14,34 @@ # See the License for the specific language governing permissions and # limitations under the License. -# Collect things from a `Model`. +# Collect things from a `ModelView` +# +# This module introduce several usefull methods to list and count things from a +# ModelView. +# +# First setup you view from a Model: +# +# ~~~nitih +# var view = new ModelView(model) +# ~~~ +# +# Then ask question using the view: +# +# ~~~nitish +# print number of parents for `{my_class}` +# print my_class.collect_parents(view).count +# ~~~ # # **Warning** # # `model_collect` offers a flattened view of the model without considering any # main module. # For this reason, `model_collect` lists all the definitions reachable from all -# modules +# modules. # # This is usefull for tools that need a global view of a model like `nitdoc`, -# `nitx` or `nituml`. -# It shoul not be used for compiling stuffs like computing VFT, where the listed +# `nitx`, `nitmetrics` or `nituml`. +# It should not be used for compiling stuffs like computing VFT, where the listed # entities could not be reachable depending on the modules really imported. module model_collect @@ -33,20 +49,18 @@ import model_views redef class MEntity - # FIXME used to bypass RTA limitation on type resolution. + # FIXME used to bypass RTA limitation on type resolution type MENTITY: SELF - # Collect modifier keywords like `redef`, `private` etc. - fun collect_modifiers: Array[String] do - return new Array[String] - end + # Collect modifier keywords like `redef`, `private` etc + fun collect_modifiers: Array[String] do return new Array[String] - # Collect `self` linearization anchored on `mainmodule`. + # Collect `self` linearization anchored on `mainmodule` fun collect_linearization(mainmodule: MModule): nullable Array[MEntity] do return null end - # Collect `self` ancestors (direct and indirect). + # Collect `self` ancestors (direct and indirect) # # The concept of ancestor is abstract at this stage. fun collect_ancestors(view: ModelView): Set[MENTITY] do @@ -57,24 +71,23 @@ redef class MEntity while todo.not_empty do var mentity = todo.pop if mentity == self or done.has(mentity) then continue - print "{mentity} == {self}" done.add mentity todo.add_all mentity.collect_parents(view) end return done end - # Collect `self` parents (direct ancestors). + # Collect `self` parents (direct ancestors) # # The concept of parent is abstract at this stage. fun collect_parents(view: ModelView): Set[MENTITY] is abstract - # Collect `self` children (direct descendants). + # Collect `self` children (direct descendants) # # The concept of child is abstract at this stage. fun collect_children(view: ModelView): Set[MENTITY] is abstract - # Collect `self` descendants (direct and direct). + # Collect `self` descendants (direct and direct) # # The concept of descendant is abstract at this stage. fun collect_descendants(view: ModelView): Set[MENTITY] do @@ -91,18 +104,18 @@ redef class MEntity return done end - # Build a poset representing `self` in it's own hierarchy. + # Build a poset representing `self` in it's own hierarchy # # The notion of hierarchy depends on the type of MEntity. # # Here a recap: - # * MPackage: package dependencies - # * MGroup: group dependencies - # * MModule: modules imports - # * MClass: class inheritance (all classdefs flattened) - # * MClassDef: classdef inheritance - # * MProperty: property definitions graph (all propdefs flattened) - # * MPropDef: property definitions graph + # * `MPackage`: package dependencies + # * `MGroup`: group dependencies + # * `MModule`: modules imports + # * `MClass`: class inheritance (all classdefs flattened) + # * `MClassDef`: classdef inheritance + # * `MProperty`: property definitions graph (all propdefs flattened) + # * `MPropDef`: property definitions graph fun hierarchy_poset(view: ModelView): POSet[MENTITY] do var done = new HashSet[MENTITY] var mentities = new Array[MENTITY] @@ -126,14 +139,51 @@ redef class MEntity end end -redef class MPackage - redef fun collect_modifiers do - var res = super - res.add "package" +redef class Model + + # Collect all MPackages in `self` + fun collect_mpackages(view: ModelView): HashSet[MPackage] do + var res = new HashSet[MPackage] + for mpackage in mpackages do + if not view.accept_mentity(mpackage) then continue + res.add(mpackage) + end + return res + end + + # Collect all MModules in `self` + fun collect_mmodules(view: ModelView): HashSet[MModule] do + var res = new HashSet[MModule] + for mpackage in collect_mpackages(view) do + res.add_all mpackage.collect_all_mmodules(view) + end return res end - # `MPackage` parents are its direct dependencies. + # Collect all MClasses introduced in `self` + fun collect_intro_mclasses(view: ModelView): HashSet[MClass] do + var res = new HashSet[MClass] + for mpackage in collect_mpackages(view) do + res.add_all mpackage.collect_intro_mclasses(view) + end + return res + end + + # Collect all MProperties introduced in `self` + fun collect_intro_mproperties(view: ModelView): HashSet[MProperty] do + var res = new HashSet[MProperty] + for mpackage in collect_mpackages(view) do + res.add_all mpackage.collect_intro_mproperties(view) + end + return res + end +end + +redef class MPackage + + redef fun collect_modifiers do return super + ["package"] + + # Collect all packages directly imported by `self` redef fun collect_parents(view) do var res = new HashSet[MENTITY] for mgroup in mgroups do @@ -146,7 +196,7 @@ redef class MPackage return res end - # `MPackage` children are packages that directly depends on `self`. + # Collect all packages that directly depends on `self` redef fun collect_children(view) do var res = new HashSet[MENTITY] for mpackage in view.mpackages do @@ -154,16 +204,140 @@ redef class MPackage end return res end -end -redef class MGroup - redef fun collect_modifiers do - var res = super - res.add "group" + # Collect all groups contained in `self` + fun collect_all_mgroups(view: ModelView): HashSet[MGroup] do + var res = new HashSet[MGroup] + for mgroup in mgroups do + if not view.accept_mentity(mgroup) then continue + res.add(mgroup) + end + return res + end + + # Collect only groups contained in `self.root` + fun collect_mgroups(view: ModelView): HashSet[MGroup] do + var res = new HashSet[MGroup] + var root = self.root + if root == null then return res + res.add_all root.collect_mgroups(view) + return res + end + + # Collect all modules contained in `self` + fun collect_all_mmodules(view: ModelView): HashSet[MModule] do + var res = new HashSet[MModule] + for mgroup in collect_mgroups(view) do + res.add_all mgroup.collect_mmodules(view) + end + return res + end + + # Collect only modules contained in `self.root` + fun collect_mmodules(view: ModelView): HashSet[MModule] do + var res = new HashSet[MModule] + var root = self.root + if root == null then return res + res.add_all root.collect_mmodules(view) + return res + end + + # Collect all classes introduced in `self` + fun collect_intro_mclasses(view: ModelView): HashSet[MClass] do + var res = new HashSet[MClass] + for mgroup in mgroups do + for mmodule in collect_all_mmodules(view) do + res.add_all mmodule.collect_intro_mclasses(view) + end + end + return res + end + + # Collect all classes redefined or refined in `self` + fun collect_redef_mclasses(view: ModelView): Set[MClass] do + var res = new HashSet[MClass] + for mgroup in mgroups do + for mmodule in collect_all_mmodules(view) do + res.add_all mmodule.collect_redef_mclasses(view) + end + end + return res + end + + # Collect all properties introduced in `self` + fun collect_intro_mproperties(view: ModelView): HashSet[MProperty] do + var res = new HashSet[MProperty] + for mgroup in mgroups do + for mmodule in collect_all_mmodules(view) do + res.add_all mmodule.collect_intro_mproperties(view) + end + end + return res + end + + # Collect all properties redefined in `self` + fun collect_redef_mproperties(view: ModelView): HashSet[MProperty] do + var res = new HashSet[MProperty] + for mgroup in mgroups do + for mmodule in collect_all_mmodules(view) do + res.add_all mmodule.collect_redef_mproperties(view) + end + end + return res + end + + # Collect all attributes introduced in `self` + fun collect_intro_attributes(view: ModelView): Set[MAttribute] do + var res = new HashSet[MAttribute] + for mgroup in mgroups do + for mmodule in collect_all_mmodules(view) do + res.add_all mmodule.collect_intro_attributes(view) + end + end + return res + end + + # Collect all inits introduced in `self` + fun collect_intro_inits(view: ModelView): Set[MMethod] do + var res = new HashSet[MMethod] + for mgroup in mgroups do + for mmodule in collect_all_mmodules(view) do + res.add_all mmodule.collect_intro_inits(view) + end + end + return res + end + + # Collect all methods introduced in `self` excluding inits + # + # See `collect_intro_inits`. + fun collect_intro_methods(view: ModelView): Set[MMethod] do + var res = new HashSet[MMethod] + for mgroup in mgroups do + for mmodule in collect_all_mmodules(view) do + res.add_all mmodule.collect_intro_methods(view) + end + end + return res + end + + # Collect all virtual types introduced in `self` + fun collect_intro_vts(view: ModelView): Set[MVirtualTypeProp] do + var res = new HashSet[MVirtualTypeProp] + for mgroup in mgroups do + for mmodule in collect_all_mmodules(view) do + res.add_all mmodule.collect_intro_vts(view) + end + end return res end +end + +redef class MGroup + + redef fun collect_modifiers do return super + ["group"] - # `MGroup` parents are its direct dependencies. + # Collect all groups directly import by `self` redef fun collect_parents(view) do var res = new HashSet[MENTITY] for mmodule in mmodules do @@ -177,7 +351,7 @@ redef class MGroup return res end - # `MGroup` children are mgroups that directly depends on `self`. + # Collect all group that directly import `self` redef fun collect_children(view) do var res = new HashSet[MENTITY] for mgroup in view.mgroups do @@ -186,17 +360,33 @@ redef class MGroup end return res end -end -redef class MModule + # Collect all groups contained in `self` + fun collect_mgroups(view: ModelView): HashSet[MENTITY] do + var res = new HashSet[MENTITY] + for mgroup in in_nesting.direct_smallers do + if not view.accept_mentity(mgroup) then continue + res.add(mgroup) + end + return res + end - redef fun collect_modifiers do - var res = super - res.add "module" + # Collect all modules contained in `self` + fun collect_mmodules(view: ModelView): HashSet[MModule] do + var res = new HashSet[MModule] + for mmodule in mmodules do + if not view.accept_mentity(mmodule) then continue + res.add(mmodule) + end return res end +end - # `MModule` ancestors are all its transitive imports. +redef class MModule + + redef fun collect_modifiers do return super + ["module"] + + # Collect all module ancestors of `self` (direct and transitive imports) redef fun collect_ancestors(view) do var res = new HashSet[MENTITY] for mentity in in_importation.greaters do @@ -207,7 +397,7 @@ redef class MModule return res end - # `MModule` parents are all its direct imports. + # Collect all modules directly imported by `self` redef fun collect_parents(view) do var res = new HashSet[MENTITY] for mentity in in_importation.direct_greaters do @@ -218,7 +408,7 @@ redef class MModule return res end - # `MModule` children are modules that directly import `self`. + # Collect all modules that directly import `self` redef fun collect_children(view) do var res = new HashSet[MENTITY] for mentity in in_importation.direct_smallers do @@ -229,7 +419,7 @@ redef class MModule return res end - # `MModule` children are modules that transitively import `self`. + # Collect all module descendants of `self` (direct and transitive imports) redef fun collect_descendants(view) do var res = new HashSet[MENTITY] for mentity in in_importation.smallers do @@ -240,7 +430,7 @@ redef class MModule return res end - # Collect mclassdefs introduced in `self` with `visibility >= to min_visibility`. + # Collect all class definitions introduced in `self` fun collect_intro_mclassdefs(view: ModelView): Set[MClassDef] do var res = new HashSet[MClassDef] for mclassdef in mclassdefs do @@ -251,7 +441,7 @@ redef class MModule return res end - # Collect mclassdefs redefined in `self` with `visibility >= to min_visibility`. + # Collect all class definitions refined in `self` fun collect_redef_mclassdefs(view: ModelView): Set[MClassDef] do var res = new HashSet[MClassDef] for mclassdef in mclassdefs do @@ -262,7 +452,15 @@ redef class MModule return res end - # Collect mclasses introduced in `self` with `visibility >= to min_visibility`. + # Collect all class definitions introduced and refined in `self` + fun collect_local_mclassdefs(view: ModelView): Set[MClassDef] do + var res = new HashSet[MClassDef] + res.add_all collect_intro_mclassdefs(view) + res.add_all collect_redef_mclassdefs(view) + return res + end + + # Collect all classes introduced in `self` fun collect_intro_mclasses(view: ModelView): Set[MClass] do var res = new HashSet[MClass] for mclass in intro_mclasses do @@ -272,15 +470,90 @@ redef class MModule return res end - # Collect mclasses redefined in `self` with `visibility >= to min_visibility`. + # Collect all classes refined in `self` fun collect_redef_mclasses(view: ModelView): Set[MClass] do var mclasses = new HashSet[MClass] for mclassdef in mclassdefs do - if not view.accept_mentity(mclassdef) then continue + if not view.accept_mentity(mclassdef.mclass) then continue if not mclassdef.is_intro then mclasses.add(mclassdef.mclass) end return mclasses end + + # Collect all classes introduced and refined in `self` + fun collect_local_mclasses(view: ModelView): Set[MClass] do + var res = new HashSet[MClass] + res.add_all collect_intro_mclasses(view) + res.add_all collect_redef_mclasses(view) + return res + end + + # Collect all classes imported from `self` parents + fun collect_imported_mclasses(view: ModelView): Set[MClass] do + var res = new HashSet[MClass] + for parent in collect_parents(view) do + res.add_all parent.collect_intro_mclasses(view) + res.add_all parent.collect_redef_mclasses(view) + res.add_all parent.collect_imported_mclasses(view) + end + return res + end + + # Collect all properties introduced in `self` + fun collect_intro_mproperties(view: ModelView): Set[MProperty] do + var res = new HashSet[MProperty] + for mclass in collect_intro_mclasses(view) do + res.add_all mclass.collect_intro_mproperties(view) + end + return res + end + + # Collect properties redefined in `self` + fun collect_redef_mproperties(view: ModelView): Set[MProperty] do + var res = new HashSet[MProperty] + for mclassdef in mclassdefs do + for mpropdef in mclassdef.collect_redef_mpropdefs(view) do + res.add mpropdef.mproperty + end + end + return res + end + + # Collect attributes introduced in `self` + fun collect_intro_attributes(view: ModelView): Set[MAttribute] do + var res = new HashSet[MAttribute] + for mproperty in collect_intro_mproperties(view) do + if mproperty isa MAttribute then res.add(mproperty) + end + return res + end + + # Collect all inits introduced in `self` + fun collect_intro_inits(view: ModelView): Set[MMethod] do + var res = new HashSet[MMethod] + for mproperty in collect_intro_mproperties(view) do + if mproperty isa MMethod and mproperty.is_init then res.add(mproperty) + end + return res + end + + # Collect methods introduced in `self` (without inits) + fun collect_intro_methods(view: ModelView): Set[MMethod] do + var res = new HashSet[MMethod] + for mproperty in collect_intro_mproperties(view) do + if mproperty isa MMethod and not mproperty.is_init then res.add(mproperty) + end + return res + end + + # Collect virtual types introduced in `self` + fun collect_intro_vts(view: ModelView): Set[MVirtualTypeProp] do + var res = new HashSet[MVirtualTypeProp] + for mproperty in collect_intro_mproperties(view) do + if mproperty isa MVirtualTypeProp then res.add(mproperty) + end + return res + end end redef class MClass @@ -293,7 +566,7 @@ redef class MClass return mclassdefs end - # `MClass` parents are the direct parents of `self`. + # Collect all direct parents of `self` # # This method uses a flattened hierarchy containing all the mclassdefs. redef fun collect_parents(view) do @@ -308,7 +581,7 @@ redef class MClass return res end - # Collect all ancestors of `self` with `visibility >= to min_visibility`. + # Collect all ancestors of `self` redef fun collect_ancestors(view) do var res = new HashSet[MENTITY] for mclassdef in mclassdefs do @@ -320,7 +593,7 @@ redef class MClass return res end - # `MClass` parents are the direct parents of `self`. + # Collect all direct children of `self` # # This method uses a flattened hierarchy containing all the mclassdefs. redef fun collect_children(view) do @@ -335,7 +608,30 @@ redef class MClass return res end - # Collect all mproperties introduced in 'self' with `visibility >= min_visibility`. + # Collect all class definitions of `self` + fun collect_mclassdefs(view: ModelView): Set[MClassDef] do + var res = new HashSet[MClassDef] + for mclassdef in mclassdefs do + if not view.accept_mentity(mclassdef) then continue + res.add mclassdef + end + return res + end + + # Collect all property definitions that are introductions in `self` + fun collect_intro_mpropdefs(view: ModelView): Set[MPropDef] do + var set = new HashSet[MPropDef] + for mclassdef in mclassdefs do + for mpropdef in mclassdef.mpropdefs do + if not mpropdef.is_intro then continue + if not view.accept_mentity(mpropdef) then continue + set.add(mpropdef) + end + end + return set + end + + # Collect all properties introduced in `self` fun collect_intro_mproperties(view: ModelView): Set[MProperty] do var set = new HashSet[MProperty] for mclassdef in mclassdefs do @@ -347,7 +643,20 @@ redef class MClass return set end - # Collect all mproperties redefined in 'self' with `visibility >= min_visibility`. + # Collect all propierty definitions that are redefinition in `self` + fun collect_redef_mpropdefs(view: ModelView): Set[MPropDef] do + var set = new HashSet[MPropDef] + for mclassdef in mclassdefs do + for mpropdef in mclassdef.mpropdefs do + if mpropdef.is_intro then continue + if not view.accept_mentity(mpropdef) then continue + set.add(mpropdef) + end + end + return set + end + + # Collect all properties redefined in `self` fun collect_redef_mproperties(view: ModelView): Set[MProperty] do var set = new HashSet[MProperty] for mclassdef in mclassdefs do @@ -360,7 +669,7 @@ redef class MClass return set end - # Collect mproperties introduced and redefined in 'self' with `visibility >= min_visibility`. + # Collect all properties introduced and redefined in `self` fun collect_local_mproperties(view: ModelView): Set[MProperty] do var set = new HashSet[MProperty] set.add_all collect_intro_mproperties(view) @@ -368,7 +677,7 @@ redef class MClass return set end - # Collect all mproperties inehrited by 'self' with `visibility >= min_visibility`. + # Collect all properties inehrited by `self` fun collect_inherited_mproperties(view: ModelView): Set[MProperty] do var set = new HashSet[MProperty] for parent in collect_parents(view) do @@ -378,9 +687,9 @@ redef class MClass return set end - # Collect all mproperties accessible by 'self' with `visibility >= min_visibility`. + # Collect all properties accessible by `self` # - # This include introduced, redefined, inherited mproperties. + # This include introduced, redefined, inherited properties. fun collect_accessible_mproperties(view: ModelView): Set[MProperty] do var set = new HashSet[MProperty] set.add_all(collect_intro_mproperties(view)) @@ -389,7 +698,7 @@ redef class MClass return set end - # Collect mmethods introduced in 'self' with `visibility >= min_visibility`. + # Collect all methods introduced in `self` fun collect_intro_mmethods(view: ModelView): Set[MMethod] do var res = new HashSet[MMethod] for mproperty in collect_intro_mproperties(view) do @@ -398,7 +707,7 @@ redef class MClass return res end - # Collect mmethods redefined in 'self' with `visibility >= min_visibility`. + # Collect all methods redefined in `self` fun collect_redef_mmethods(view: ModelView): Set[MMethod] do var res = new HashSet[MMethod] for mproperty in collect_redef_mproperties(view) do @@ -407,7 +716,7 @@ redef class MClass return res end - # Collect mmethods introduced and redefined in 'self' with `visibility >= min_visibility`. + # Collect all methods introduced and redefined in `self` fun collect_local_mmethods(view: ModelView): Set[MMethod] do var set = new HashSet[MMethod] set.add_all collect_intro_mmethods(view) @@ -415,7 +724,7 @@ redef class MClass return set end - # Collect mmethods inherited by 'self' if accepted by `view`. + # Collect all methods inherited by `self` fun collect_inherited_mmethods(view: ModelView): Set[MMethod] do var res = new HashSet[MMethod] for mproperty in collect_inherited_mproperties(view) do @@ -424,7 +733,18 @@ redef class MClass return res end - # Collect mattributes introduced in 'self' with `visibility >= min_visibility`. + # Collect all methods accessible by `self` + # + # This include introduced, redefined, inherited methods. + fun collect_accessible_mmethods(view: ModelView): Set[MMethod] do + var set = new HashSet[MMethod] + set.add_all(collect_intro_mmethods(view)) + set.add_all(collect_redef_mmethods(view)) + set.add_all(collect_inherited_mmethods(view)) + return set + end + + # Collect all attributes introduced in `self` fun collect_intro_mattributes(view: ModelView): Set[MAttribute] do var res = new HashSet[MAttribute] for mproperty in collect_intro_mproperties(view) do @@ -433,7 +753,7 @@ redef class MClass return res end - # Collect mattributes redefined in 'self' with `visibility >= min_visibility`. + # Collect all attributes redefined in `self` fun collect_redef_mattributes(view: ModelView): Set[MAttribute] do var res = new HashSet[MAttribute] for mproperty in collect_redef_mproperties(view) do @@ -442,7 +762,7 @@ redef class MClass return res end - # Collect mattributes introduced and redefined in 'self' with `visibility >= min_visibility`. + # Collect all attributes introduced and redefined in `self` fun collect_local_mattributes(view: ModelView): Set[MAttribute] do var set = new HashSet[MAttribute] set.add_all collect_intro_mattributes(view) @@ -450,7 +770,7 @@ redef class MClass return set end - # Collect mattributes inherited by 'self' with `visibility >= min_visibility`. + # Collect all attributes inherited by `self` fun collect_inherited_mattributes(view: ModelView): Set[MAttribute] do var res = new HashSet[MAttribute] for mproperty in collect_inherited_mproperties(view) do @@ -459,7 +779,7 @@ redef class MClass return res end - # Collect all mattributes accessible by 'self' with `visibility >= min_visibility`. + # Collect all attributes accessible by `self` # # This include introduced, redefined, inherited mattributes. fun collect_accessible_mattributes(view: ModelView): Set[MAttribute] do @@ -470,7 +790,7 @@ redef class MClass return set end - # Collect init mmethods introduced in 'self' if accepted by `view`. + # Collect all init methods introduced in `self` fun collect_intro_inits(view: ModelView): Set[MMethod] do var res = new HashSet[MMethod] for mproperty in collect_intro_mmethods(view) do @@ -479,7 +799,7 @@ redef class MClass return res end - # Collect init mmethods redefined in 'self' if accepted by `view`. + # Collect all init methods redefined in `self` fun collect_redef_inits(view: ModelView): Set[MMethod] do var res = new HashSet[MMethod] for mproperty in collect_redef_mmethods(view) do @@ -488,7 +808,7 @@ redef class MClass return res end - # Collect init mmethods introduced and redefined in 'self' if accepted by `view`. + # Collect all init methods introduced and redefined in `self` fun collect_local_inits(view: ModelView): Set[MMethod] do var set = new HashSet[MMethod] set.add_all collect_intro_inits(view) @@ -496,7 +816,7 @@ redef class MClass return set end - # Collect init mmethods inherited by 'self' if accepted by `view`. + # Collect all init methods inherited by `self` fun collect_inherited_inits(view: ModelView): Set[MMethod] do var res = new HashSet[MMethod] for mproperty in collect_inherited_mmethods(view) do @@ -505,7 +825,7 @@ redef class MClass return res end - # Collect all init mmethods accessible by 'self' if accepted by `view`. + # Collect all init methods accessible by `self` # # This include introduced, redefined, inherited inits. fun collect_accessible_inits(view: ModelView): Set[MMethod] do @@ -515,10 +835,67 @@ redef class MClass set.add_all(collect_inherited_inits(view)) return set end + + # Collect all virtual types introduced in `self` + fun collect_intro_vts(view: ModelView): Set[MVirtualTypeProp] do + var res = new HashSet[MVirtualTypeProp] + for mproperty in collect_intro_mproperties(view) do + if mproperty isa MVirtualTypeProp then res.add(mproperty) + end + return res + end + + # Collect all virtual types redefined in `self` + fun collect_redef_vts(view: ModelView): Set[MVirtualTypeProp] do + var res = new HashSet[MVirtualTypeProp] + for mproperty in collect_intro_mproperties(view) do + if mproperty isa MVirtualTypeProp then res.add(mproperty) + end + return res + end + + # Collect all virtual types introduced or redefined in `self` + fun collect_local_vts(view: ModelView): Set[MVirtualTypeProp] do + var set = new HashSet[MVirtualTypeProp] + set.add_all collect_intro_vts(view) + set.add_all collect_redef_vts(view) + return set + end + + # Collect all virtual types inherited by `self` + fun collect_inherited_vts(view: ModelView): Set[MVirtualTypeProp] do + var res = new HashSet[MVirtualTypeProp] + for mproperty in collect_inherited_mproperties(view) do + if mproperty isa MVirtualTypeProp then res.add(mproperty) + end + return res + end + + # Collect all virtual types accessible by `self` + # + # This include introduced, redefined, inherited virtual types. + fun collect_accessible_vts(view: ModelView): Set[MVirtualTypeProp] do + var set = new HashSet[MVirtualTypeProp] + for mproperty in collect_accessible_mproperties(view) do + if mproperty isa MVirtualTypeProp then set.add mproperty + end + return set + end end redef class MClassDef + redef fun collect_modifiers do + var res = super + if not is_intro then + res.add "redef" + else + res.add mclass.visibility.to_s + end + res.add mclass.kind.to_s + return res + end + redef fun collect_linearization(mainmodule) do var mclassdefs = new Array[MClassDef] for mclassdef in in_hierarchy.as(not null).greaters do @@ -528,7 +905,6 @@ redef class MClassDef return mclassdefs end - # `MClassDef` ancestors are its direct and transitive super classes. redef fun collect_ancestors(view) do var res = new HashSet[MENTITY] var hierarchy = self.in_hierarchy @@ -540,7 +916,6 @@ redef class MClassDef return res end - # `MClassDef` parents are its direct super classes. redef fun collect_parents(view) do var res = new HashSet[MENTITY] var hierarchy = self.in_hierarchy @@ -552,7 +927,6 @@ redef class MClassDef return res end - # `MClassDef` children are its direct subclasses. redef fun collect_children(view) do var res = new HashSet[MENTITY] var hierarchy = self.in_hierarchy @@ -564,7 +938,7 @@ redef class MClassDef return res end - # Collect mpropdefs in 'self' with `visibility >= min_visibility`. + # Collect all property definitions in `self` fun collect_mpropdefs(view: ModelView): Set[MPropDef] do var res = new HashSet[MPropDef] for mpropdef in mpropdefs do @@ -574,7 +948,37 @@ redef class MClassDef return res end - # Collect mpropdefs introduced in 'self' with `visibility >= min_visibility`. + # Collect all attribute definitions in `self` + fun collect_mattributedefs(view: ModelView): Set[MAttributeDef] do + var res = new HashSet[MAttributeDef] + for mpropdef in collect_mpropdefs(view) do + if not mpropdef isa MAttributeDef then continue + res.add mpropdef + end + return res + end + + # Collect all methods definitions in `self` + fun collect_mmethoddefs(view: ModelView): Set[MMethodDef] do + var res = new HashSet[MMethodDef] + for mpropdef in collect_mpropdefs(view) do + if not mpropdef isa MMethodDef then continue + res.add mpropdef + end + return res + end + + # Collect all virtual types definitions in `self` + fun collect_mtypedefs(view: ModelView): Set[MVirtualTypeDef] do + var res = new HashSet[MVirtualTypeDef] + for mpropdef in collect_mpropdefs(view) do + if not mpropdef isa MVirtualTypeDef then continue + res.add mpropdef + end + return res + end + + # Collect all property definitions that are introduction in `self` fun collect_intro_mpropdefs(view: ModelView): Set[MPropDef] do var res = new HashSet[MPropDef] for mpropdef in mpropdefs do @@ -585,7 +989,7 @@ redef class MClassDef return res end - # Collect mpropdefs redefined in 'self' with `visibility >= min_visibility`. + # Collect all property definitions that are redefinition in `self` fun collect_redef_mpropdefs(view: ModelView): Set[MPropDef] do var res = new HashSet[MPropDef] for mpropdef in mpropdefs do @@ -595,17 +999,6 @@ redef class MClassDef end return res end - - redef fun collect_modifiers do - var res = super - if not is_intro then - res.add "redef" - else - res.add mclass.visibility.to_s - end - res.add mclass.kind.to_s - return res - end end redef class MProperty @@ -617,7 +1010,7 @@ redef class MProperty return mpropdefs end - # Collect mpropdefs in 'self' with `visibility >= min_visibility`. + # Collect all property definitions of `self` fun collect_mpropdefs(view: ModelView): Set[MPropDef] do var res = new HashSet[MPropDef] for mpropdef in mpropdefs do @@ -627,9 +1020,7 @@ redef class MProperty return res end - # `MProperty` parents are all direct super definition of `self`. - # - # This method uses a flattened hierarchy containing all the mpropdefs. + # Collect all direct super definitions of `self` redef fun collect_parents(view) do var res = new HashSet[MENTITY] for mpropdef in mpropdefs do @@ -641,9 +1032,7 @@ redef class MProperty return res end - # `MProperty` parents are all direct sub definition of `self`. - # - # This method uses a flattened hierarchy containing all the mpropdefs. + # Collection all definitions that have `self` as a direct super definition redef fun collect_children(view) do var res = new HashSet[MENTITY] for mpropdef in mpropdefs do @@ -657,6 +1046,7 @@ redef class MProperty end redef class MPropDef + redef fun collect_modifiers do var res = super if not is_intro then @@ -696,7 +1086,7 @@ redef class MPropDef return mpropdefs end - # `MPropDef` parents include only the next definition of `self`. + # Collect only the next definition of `self` redef fun collect_parents(view) do var res = new HashSet[MENTITY] var mpropdef = self @@ -707,7 +1097,7 @@ redef class MPropDef return res end - # `MPropdef` children are definitions that directly depends on `self`. + # Collect all children definitions that directly depend on `self` redef fun collect_children(view) do var res = new HashSet[MENTITY] for mpropdef in mproperty.collect_mpropdefs(view) do