This module introduce several usefull methods to list and count things from a Model.
print number of parents for `{my_class}`
print my_class.collect_parents.count
Collect methods can also be used with a ModelFilter:
var filter = new ModelFilter(min_visibility = private_visibility)
print my_class.collect_parents(filter).count
Warning
model_collect offers a flattened filter of the model without considering any
main module.
For this reason, model_collect lists all the definitions reachable from all
modules.
This is usefull for tools that need a global filter of a model like nitdoc,
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.
nitc :: model_collect $ MClassDef
A definition (an introduction or a refinement) of a class in a modulenitc :: model_collect $ MEntity
A named and possibly documented entity in the model.nitc :: model_collect $ MModule
A Nit module is usually associated with a Nit source file.nitc :: model_collect $ MPropDef
A definition of a property (local property)nitc :: model_collect $ MProperty
A service (global property) that generalize method, attribute, etc.nitc :: model_collect $ MClassDef
A definition (an introduction or a refinement) of a class in a modulenitc :: model_collect $ MEntity
A named and possibly documented entity in the model.nitc :: model_collect $ MModule
A Nit module is usually associated with a Nit source file.nitc :: model_collect $ MPropDef
A definition of a property (local property)nitc :: model_collect $ MProperty
A service (global property) that generalize method, attribute, etc.Serializable::inspect to show more useful information
nitc :: modelbuilder
more_collections :: more_collections
Highly specific, but useful, collections-related classes.serialization :: serialization_core
Abstract services to serialize Nit objects to different formatsnitc :: toolcontext
Common command-line tool infrastructure than handle options and error messagescore :: union_find
union–find algorithm using an efficient disjoint-set data structurenitc :: api_metrics
nitc :: commands_ini
nitc :: nitmetrics
A program that collects various metrics on nit programs and librariesnitc :: uml_module
Services for generation of a UML package diagram based on aModel
# Collect things from the model.
#
# This module introduce several usefull methods to list and count things from a
# Model.
#
# ~~~nitish
# print number of parents for `{my_class}`
# print my_class.collect_parents.count
# ~~~
#
# Collect methods can also be used with a ModelFilter:
# ~~~nitish
# var filter = new ModelFilter(min_visibility = private_visibility)
# print my_class.collect_parents(filter).count
# ~~~
#
# **Warning**
#
# `model_collect` offers a flattened filter of the model without considering any
# main module.
# For this reason, `model_collect` lists all the definitions reachable from all
# modules.
#
# This is usefull for tools that need a global filter of a model like `nitdoc`,
# `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
import model_filters
redef class MEntity
# 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]
# Collect `self` linearization anchored on `mainmodule`
fun collect_linearization(mainmodule: MModule): nullable Array[MEntity] do
return null
end
# Collect `self` ancestors (direct and indirect)
#
# The concept of ancestor is abstract at this stage.
fun collect_ancestors(mainmodule: MModule, filter: nullable ModelFilter): Set[MENTITY] do
var done = new HashSet[MENTITY]
var todo = new Array[MENTITY]
todo.add_all collect_parents(mainmodule, filter)
while todo.not_empty do
var mentity = todo.pop
if mentity == self or done.has(mentity) then continue
done.add mentity
todo.add_all mentity.collect_parents(mainmodule, filter)
end
return done
end
# Collect `self` parents (direct ancestors)
#
# The concept of parent is abstract at this stage.
fun collect_parents(mainmodule: MModule, filter: nullable ModelFilter): Set[MENTITY] is abstract
# Collect `self` children (direct descendants)
#
# The concept of child is abstract at this stage.
fun collect_children(mainmodule: MModule, filter: nullable ModelFilter): Set[MENTITY] is abstract
# Collect `self` descendants (direct and direct)
#
# The concept of descendant is abstract at this stage.
fun collect_descendants(mainmodule: MModule, filter: nullable ModelFilter): Set[MENTITY] do
var done = new HashSet[MENTITY]
var todo = new Array[MENTITY]
todo.add_all collect_children(mainmodule, filter)
while todo.not_empty do
var mentity = todo.pop
if mentity == self or done.has(mentity) then continue
done.add mentity
todo.add_all mentity.collect_children(mainmodule, filter)
end
return done
end
# 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
fun hierarchy_poset(mainmodule: MModule, filter: nullable ModelFilter): POSet[MENTITY] do
var poset = new POSet[MENTITY]
var parents_done = new HashSet[MENTITY]
var parents = new Array[MENTITY]
parents.add self
while parents.not_empty do
var mentity = parents.pop
if parents_done.has(mentity) then continue
parents_done.add mentity
poset.add_node mentity
for parent in mentity.collect_parents(mainmodule, filter) do
poset.add_edge(mentity, parent)
parents.add parent
end
end
var children_done = new HashSet[MEntity]
var children = new Array[MEntity]
children.add self
while children.not_empty do
var mentity = children.pop
if children_done.has(mentity) then continue
children_done.add mentity
for child in mentity.collect_children(mainmodule, filter) do
poset.add_edge(child, mentity)
children.add child
end
end
return poset
end
end
redef class Model
# Collect all MPackages in `self`
fun collect_mpackages(filter: nullable ModelFilter): HashSet[MPackage] do
var res = new HashSet[MPackage]
for mpackage in mpackages do
if filter == null or filter.accept_mentity(mpackage) then res.add(mpackage)
end
return res
end
# Collect all MGroups in `self`
fun collect_mgroups(filter: nullable ModelFilter): HashSet[MGroup] do
var res = new HashSet[MGroup]
for mpackage in collect_mpackages(filter) do
res.add_all mpackage.collect_all_mgroups(filter)
end
return res
end
# Collect all MModules in `self`
fun collect_mmodules(filter: nullable ModelFilter): HashSet[MModule] do
var res = new HashSet[MModule]
for mpackage in collect_mpackages(filter) do
res.add_all mpackage.collect_all_mmodules(filter)
end
return res
end
# Collect all MClasses in `self`
fun collect_mclasses(filter: nullable ModelFilter): HashSet[MClass] do
var res = new HashSet[MClass]
for mclass in mclasses do
if filter == null or filter.accept_mentity(mclass) then res.add mclass
end
return res
end
# Collect all MClasses introduced in `self`
fun collect_intro_mclasses(filter: nullable ModelFilter): HashSet[MClass] do
var res = new HashSet[MClass]
for mpackage in collect_mpackages(filter) do
res.add_all mpackage.collect_intro_mclasses(filter)
end
return res
end
# Collect all MClassDefs in `self`
fun collect_mclassdefs(filter: nullable ModelFilter): HashSet[MClassDef] do
var res = new HashSet[MClassDef]
for mclass in collect_mclasses(filter) do
res.add_all mclass.collect_mclassdefs(filter)
end
return res
end
# Collect all MProperties introduced in `self`
fun collect_intro_mproperties(filter: nullable ModelFilter): HashSet[MProperty] do
var res = new HashSet[MProperty]
for mpackage in collect_mpackages(filter) do
res.add_all mpackage.collect_intro_mproperties(filter)
end
return res
end
# Collect all MProperties in `self`
fun collect_mproperties(filter: nullable ModelFilter): HashSet[MProperty] do
var res = new HashSet[MProperty]
for mproperty in mproperties do
if filter == null or filter.accept_mentity(mproperty) then res.add mproperty
end
return res
end
# Collect all MPropDefs in `self`
fun collect_mpropdefs(filter: nullable ModelFilter): HashSet[MPropDef] do
var res = new HashSet[MPropDef]
for mproperty in collect_mproperties(filter) do
for mpropdef in mproperty.mpropdefs do
if filter == null or filter.accept_mentity(mpropdef) then res.add mpropdef
end
end
return res
end
# Collect all MEntities in `self`
fun collect_mentities(filter: nullable ModelFilter): HashSet[MEntity] do
var res = new HashSet[MEntity]
res.add_all collect_mpackages(filter)
res.add_all collect_mgroups(filter)
res.add_all collect_mmodules(filter)
res.add_all collect_mclasses(filter)
res.add_all collect_mclassdefs(filter)
res.add_all collect_mproperties(filter)
res.add_all collect_mpropdefs(filter)
return res
end
# Searches the MEntity that matches `full_name`.
fun mentity_by_full_name(full_name: String, filter: nullable ModelFilter): nullable MEntity do
for mentity in collect_mentities(filter) do
if filter != null and not filter.accept_mentity(mentity) then continue
if mentity.full_name == full_name then return mentity
end
return null
end
# Searches the MEntities that matches `full_name`.
fun mentities_by_name(name: String, filter: nullable ModelFilter): Array[MEntity] do
var res = new Array[MEntity]
for mentity in collect_mentities(filter) do
if filter != null and not filter.accept_mentity(mentity) then continue
if mentity.name == name then res.add mentity
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(mainmodule, filter) do
var res = new HashSet[MENTITY]
for mgroup in mgroups do
for parent in mgroup.collect_parents(mainmodule, filter) do
var mpackage = parent.mpackage
if mpackage == self then continue
if filter == null or filter.accept_mentity(mpackage) then res.add(mpackage)
end
end
return res
end
# Collect all packages that directly depends on `self`
redef fun collect_children(mainmodule, filter) do
var res = new HashSet[MENTITY]
for mpackage in model.collect_mpackages(filter) do
if mpackage.collect_parents(mainmodule, filter).has(self) then res.add mpackage
end
return res
end
# Collect all groups contained in `self`
fun collect_all_mgroups(filter: nullable ModelFilter): HashSet[MGroup] do
var res = new HashSet[MGroup]
for mgroup in mgroups do
if filter == null or filter.accept_mentity(mgroup) then res.add(mgroup)
end
return res
end
# Collect only groups contained in `self.root`
fun collect_mgroups(filter: nullable ModelFilter): HashSet[MGroup] do
var res = new HashSet[MGroup]
var root = self.root
if root == null then return res
res.add_all root.collect_mgroups(filter)
return res
end
# Collect all modules contained in `self`
fun collect_all_mmodules(filter: nullable ModelFilter): HashSet[MModule] do
var res = new HashSet[MModule]
for mgroup in collect_all_mgroups(filter) do
res.add_all mgroup.collect_mmodules(filter)
end
return res
end
# Collect only modules contained in `self.root`
fun collect_mmodules(filter: nullable ModelFilter): HashSet[MModule] do
var res = new HashSet[MModule]
var root = self.root
if root == null then return res
res.add_all root.collect_mmodules(filter)
return res
end
# Collect all classes introduced in `self`
fun collect_intro_mclasses(filter: nullable ModelFilter): HashSet[MClass] do
var res = new HashSet[MClass]
for mgroup in mgroups do
for mmodule in collect_all_mmodules(filter) do
res.add_all mmodule.collect_intro_mclasses(filter)
end
end
return res
end
# Collect all classes redefined or refined in `self`
fun collect_redef_mclasses(filter: nullable ModelFilter): Set[MClass] do
var res = new HashSet[MClass]
for mgroup in mgroups do
for mmodule in collect_all_mmodules(filter) do
res.add_all mmodule.collect_redef_mclasses(filter)
end
end
return res
end
# Collect all properties introduced in `self`
fun collect_intro_mproperties(filter: nullable ModelFilter): HashSet[MProperty] do
var res = new HashSet[MProperty]
for mgroup in mgroups do
for mmodule in collect_all_mmodules(filter) do
res.add_all mmodule.collect_intro_mproperties(filter)
end
end
return res
end
# Collect all properties redefined in `self`
fun collect_redef_mproperties(filter: nullable ModelFilter): HashSet[MProperty] do
var res = new HashSet[MProperty]
for mgroup in mgroups do
for mmodule in collect_all_mmodules(filter) do
res.add_all mmodule.collect_redef_mproperties(filter)
end
end
return res
end
# Collect all attributes introduced in `self`
fun collect_intro_attributes(filter: nullable ModelFilter): Set[MAttribute] do
var res = new HashSet[MAttribute]
for mgroup in mgroups do
for mmodule in collect_all_mmodules(filter) do
res.add_all mmodule.collect_intro_attributes(filter)
end
end
return res
end
# Collect all inits introduced in `self`
fun collect_intro_inits(filter: nullable ModelFilter): Set[MMethod] do
var res = new HashSet[MMethod]
for mgroup in mgroups do
for mmodule in collect_all_mmodules(filter) do
res.add_all mmodule.collect_intro_inits(filter)
end
end
return res
end
# Collect all methods introduced in `self` excluding inits
#
# See `collect_intro_inits`.
fun collect_intro_methods(filter: nullable ModelFilter): Set[MMethod] do
var res = new HashSet[MMethod]
for mgroup in mgroups do
for mmodule in collect_all_mmodules(filter) do
res.add_all mmodule.collect_intro_methods(filter)
end
end
return res
end
# Collect all virtual types introduced in `self`
fun collect_intro_vts(filter: nullable ModelFilter): Set[MVirtualTypeProp] do
var res = new HashSet[MVirtualTypeProp]
for mgroup in mgroups do
for mmodule in collect_all_mmodules(filter) do
res.add_all mmodule.collect_intro_vts(filter)
end
end
return res
end
end
redef class MGroup
redef fun collect_modifiers do return super + ["group"]
# Collect all groups directly import by `self`
redef fun collect_parents(mainmodule, filter) do
var res = new HashSet[MENTITY]
for mmodule in mmodules do
for parent in mmodule.collect_parents(mainmodule, filter) do
var mgroup = parent.mgroup
if mgroup == null or mgroup == self then continue
if filter == null or filter.accept_mentity(mgroup) then res.add(mgroup)
end
end
return res
end
# Collect all group that directly import `self`
redef fun collect_children(mainmodule, filter) do
var res = new HashSet[MENTITY]
for mgroup in model.collect_mgroups(filter) do
if mgroup == self then continue
if filter != null and not filter.accept_mentity(mgroup) then continue
if mgroup.collect_parents(mainmodule, filter).has(self) then res.add mgroup
end
return res
end
# Collect all groups contained in `self`
fun collect_mgroups(filter: nullable ModelFilter): HashSet[MENTITY] do
var res = new HashSet[MENTITY]
for mgroup in in_nesting.direct_smallers do
if filter == null or filter.accept_mentity(mgroup) then res.add(mgroup)
end
return res
end
# Collect all modules contained in `self`
fun collect_all_mmodules(filter: nullable ModelFilter): HashSet[MModule] do
var res = new HashSet[MModule]
for mgroup in collect_mgroups(filter) do
res.add_all mgroup.collect_all_mmodules(filter)
end
return res
end
# Collect all modules contained in `self`
fun collect_mmodules(filter: nullable ModelFilter): HashSet[MModule] do
var res = new HashSet[MModule]
for mmodule in mmodules do
if filter == null or filter.accept_mentity(mmodule) then res.add(mmodule)
end
return res
end
end
redef class MModule
redef fun collect_modifiers do return super + ["module"]
# Collect all modules directly imported by `self`
redef fun collect_ancestors(mainmodule, filter) do
var res = new HashSet[MENTITY]
for mentity in in_importation.greaters do
if mentity == self then continue
if filter == null or filter.accept_mentity(mentity) then res.add mentity
end
return res
end
# Collect all modules directly imported by `self`
redef fun collect_parents(mainmodule, filter) do
var res = new HashSet[MENTITY]
for mentity in in_importation.direct_greaters do
if mentity == self then continue
if filter == null or filter.accept_mentity(mentity) then res.add mentity
end
return res
end
# Collect all modules that directly import `self`
redef fun collect_children(mainmodule, filter) do
var res = new HashSet[MENTITY]
for mentity in in_importation.direct_smallers do
if mentity == self then continue
if filter == null or filter.accept_mentity(mentity) then res.add mentity
end
return res
end
# Collect all module descendants of `self` (direct and transitive imports)
redef fun collect_descendants(mainmodule, filter) do
var res = new HashSet[MENTITY]
for mentity in in_importation.smallers do
if mentity == self then continue
if filter == null or filter.accept_mentity(mentity) then res.add mentity
end
return res
end
# Collect all class definitions introduced in `self`
fun collect_intro_mclassdefs(filter: nullable ModelFilter): Set[MClassDef] do
var res = new HashSet[MClassDef]
for mclassdef in mclassdefs do
if not mclassdef.is_intro then continue
if filter == null or filter.accept_mentity(mclassdef) then res.add mclassdef
end
return res
end
# Collect all class definitions refined in `self`
fun collect_redef_mclassdefs(filter: nullable ModelFilter): Set[MClassDef] do
var res = new HashSet[MClassDef]
for mclassdef in mclassdefs do
if mclassdef.is_intro then continue
if filter == null or filter.accept_mentity(mclassdef) then res.add mclassdef
end
return res
end
# Collect all class definitions introduced and refined in `self`
fun collect_local_mclassdefs(filter: nullable ModelFilter): Set[MClassDef] do
var res = new HashSet[MClassDef]
res.add_all collect_intro_mclassdefs(filter)
res.add_all collect_redef_mclassdefs(filter)
return res
end
# Collect all classes introduced in `self`
fun collect_intro_mclasses(filter: nullable ModelFilter): Set[MClass] do
var res = new HashSet[MClass]
for mclass in intro_mclasses do
if filter == null or filter.accept_mentity(mclass) then res.add mclass
end
return res
end
# Collect all classes refined in `self`
fun collect_redef_mclasses(filter: nullable ModelFilter): Set[MClass] do
var mclasses = new HashSet[MClass]
for mclassdef in mclassdefs do
if filter != null and not filter.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(filter: nullable ModelFilter): Set[MClass] do
var res = new HashSet[MClass]
res.add_all collect_intro_mclasses(filter)
res.add_all collect_redef_mclasses(filter)
return res
end
# Collect all classes imported from `self` parents
fun collect_imported_mclasses(mainmodule: MModule, filter: nullable ModelFilter): Set[MClass] do
var res = new HashSet[MClass]
for parent in collect_parents(mainmodule, filter) do
res.add_all parent.collect_intro_mclasses(filter)
res.add_all parent.collect_redef_mclasses(filter)
res.add_all parent.collect_imported_mclasses(mainmodule, filter)
end
return res
end
# Collect all properties introduced in `self`
fun collect_intro_mproperties(filter: nullable ModelFilter): Set[MProperty] do
var res = new HashSet[MProperty]
for mclass in collect_intro_mclasses(filter) do
res.add_all mclass.collect_intro_mproperties(filter)
end
return res
end
# Collect properties redefined in `self`
fun collect_redef_mproperties(filter: nullable ModelFilter): Set[MProperty] do
var res = new HashSet[MProperty]
for mclassdef in mclassdefs do
for mpropdef in mclassdef.collect_redef_mpropdefs(filter) do
res.add mpropdef.mproperty
end
end
return res
end
# Collect attributes introduced in `self`
fun collect_intro_attributes(filter: nullable ModelFilter): Set[MAttribute] do
var res = new HashSet[MAttribute]
for mproperty in collect_intro_mproperties(filter) do
if mproperty isa MAttribute then res.add(mproperty)
end
return res
end
# Collect all inits introduced in `self`
fun collect_intro_inits(filter: nullable ModelFilter): Set[MMethod] do
var res = new HashSet[MMethod]
for mproperty in collect_intro_mproperties(filter) 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(filter: nullable ModelFilter): Set[MMethod] do
var res = new HashSet[MMethod]
for mproperty in collect_intro_mproperties(filter) 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(filter: nullable ModelFilter): Set[MVirtualTypeProp] do
var res = new HashSet[MVirtualTypeProp]
for mproperty in collect_intro_mproperties(filter) do
if mproperty isa MVirtualTypeProp then res.add(mproperty)
end
return res
end
end
redef class MClass
redef fun collect_modifiers do return intro.collect_modifiers
redef fun collect_linearization(mainmodule) do
var mclassdefs = self.mclassdefs.to_a
mainmodule.linearize_mclassdefs(mclassdefs)
return mclassdefs
end
# Collect all ancestors of `self`
redef fun collect_ancestors(mainmodule, filter) do
var res = new HashSet[MENTITY]
if not mainmodule.flatten_mclass_hierarchy.has(self) then return res
for mclass in in_hierarchy(mainmodule).greaters do
if mclass == self then continue
if filter == null or filter.accept_mentity(mclass) then res.add mclass
end
return res
end
# Collect all direct parents of `self`
redef fun collect_parents(mainmodule, filter) do
var res = new HashSet[MENTITY]
if not mainmodule.flatten_mclass_hierarchy.has(self) then return res
for mclass in in_hierarchy(mainmodule).direct_greaters do
if mclass == self then continue
if filter == null or filter.accept_mentity(mclass) then res.add mclass
end
return res
end
# Collect all direct children of `self`
redef fun collect_children(mainmodule, filter) do
var res = new HashSet[MENTITY]
if not mainmodule.flatten_mclass_hierarchy.has(self) then return res
for mclass in in_hierarchy(mainmodule).direct_smallers do
if mclass == self then continue
if filter == null or filter.accept_mentity(mclass) then res.add mclass
end
return res
end
# Collect all descendants of `self`
redef fun collect_descendants(mainmodule, filter) do
var res = new HashSet[MENTITY]
if not mainmodule.flatten_mclass_hierarchy.has(self) then return res
for mclass in in_hierarchy(mainmodule).smallers do
if mclass == self then continue
if filter == null or filter.accept_mentity(mclass) then res.add mclass
end
return res
end
# Collect all class definitions of `self`
fun collect_mclassdefs(filter: nullable ModelFilter): Set[MClassDef] do
var res = new HashSet[MClassDef]
for mclassdef in mclassdefs do
if filter == null or filter.accept_mentity(mclassdef) then res.add mclassdef
end
return res
end
# Collect all property definitions that are introductions in `self`
fun collect_intro_mpropdefs(filter: nullable ModelFilter): 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 filter == null or filter.accept_mentity(mpropdef) then set.add(mpropdef)
end
end
return set
end
# Collect all properties introduced in `self`
fun collect_intro_mproperties(filter: nullable ModelFilter): Set[MProperty] do
var set = new HashSet[MProperty]
for mclassdef in mclassdefs do
for mprop in mclassdef.intro_mproperties do
if filter == null or filter.accept_mentity(mprop) then set.add(mprop)
end
end
return set
end
# Collect all propierty definitions that are redefinition in `self`
fun collect_redef_mpropdefs(filter: nullable ModelFilter): 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 filter == null or filter.accept_mentity(mpropdef) then set.add(mpropdef)
end
end
return set
end
# Collect all properties redefined in `self`
fun collect_redef_mproperties(filter: nullable ModelFilter): Set[MProperty] do
var set = new HashSet[MProperty]
for mclassdef in mclassdefs do
for mpropdef in mclassdef.mpropdefs do
if mpropdef.mproperty.intro_mclassdef.mclass == self then continue
if filter == null or filter.accept_mentity(mpropdef) then
set.add(mpropdef.mproperty)
end
end
end
return set
end
# Collect all properties introduced and redefined in `self`
fun collect_local_mproperties(filter: nullable ModelFilter): Set[MProperty] do
var set = new HashSet[MProperty]
set.add_all collect_intro_mproperties(filter)
set.add_all collect_redef_mproperties(filter)
return set
end
# Collect all properties inehrited by `self`
fun collect_inherited_mproperties(mainmodule: MModule, filter: nullable ModelFilter): Set[MProperty] do
var set = new HashSet[MProperty]
for parent in collect_parents(mainmodule, filter) do
set.add_all(parent.collect_intro_mproperties(filter))
set.add_all(parent.collect_inherited_mproperties(mainmodule, filter))
end
return set
end
# Collect all properties accessible by `self`
#
# This include introduced, redefined, inherited properties.
fun collect_accessible_mproperties(mainmodule: MModule, filter: nullable ModelFilter): Set[MProperty] do
var set = new HashSet[MProperty]
set.add_all(collect_intro_mproperties(filter))
set.add_all(collect_redef_mproperties(filter))
set.add_all(collect_inherited_mproperties(mainmodule, filter))
return set
end
# Collect all methods introduced in `self`
fun collect_intro_mmethods(filter: nullable ModelFilter): Set[MMethod] do
var res = new HashSet[MMethod]
for mproperty in collect_intro_mproperties(filter) do
if mproperty isa MMethod then res.add(mproperty)
end
return res
end
# Collect all methods redefined in `self`
fun collect_redef_mmethods(filter: nullable ModelFilter): Set[MMethod] do
var res = new HashSet[MMethod]
for mproperty in collect_redef_mproperties(filter) do
if mproperty isa MMethod then res.add(mproperty)
end
return res
end
# Collect all methods introduced and redefined in `self`
fun collect_local_mmethods(filter: nullable ModelFilter): Set[MMethod] do
var set = new HashSet[MMethod]
set.add_all collect_intro_mmethods(filter)
set.add_all collect_redef_mmethods(filter)
return set
end
# Collect all methods inherited by `self`
fun collect_inherited_mmethods(mainmodule: MModule, filter: nullable ModelFilter): Set[MMethod] do
var res = new HashSet[MMethod]
for mproperty in collect_inherited_mproperties(mainmodule, filter) do
if mproperty isa MMethod then res.add(mproperty)
end
return res
end
# Collect all methods accessible by `self`
#
# This include introduced, redefined, inherited methods.
fun collect_accessible_mmethods(mainmodule: MModule, filter: nullable ModelFilter): Set[MMethod] do
var set = new HashSet[MMethod]
set.add_all(collect_intro_mmethods(filter))
set.add_all(collect_redef_mmethods(filter))
set.add_all(collect_inherited_mmethods(mainmodule, filter))
return set
end
# Collect all attributes introduced in `self`
fun collect_intro_mattributes(filter: nullable ModelFilter): Set[MAttribute] do
var res = new HashSet[MAttribute]
for mproperty in collect_intro_mproperties(filter) do
if mproperty isa MAttribute then res.add(mproperty)
end
return res
end
# Collect all attributes redefined in `self`
fun collect_redef_mattributes(filter: nullable ModelFilter): Set[MAttribute] do
var res = new HashSet[MAttribute]
for mproperty in collect_redef_mproperties(filter) do
if mproperty isa MAttribute then res.add(mproperty)
end
return res
end
# Collect all attributes introduced and redefined in `self`
fun collect_local_mattributes(filter: nullable ModelFilter): Set[MAttribute] do
var set = new HashSet[MAttribute]
set.add_all collect_intro_mattributes(filter)
set.add_all collect_redef_mattributes(filter)
return set
end
# Collect all attributes inherited by `self`
fun collect_inherited_mattributes(mainmodule: MModule, filter: nullable ModelFilter): Set[MAttribute] do
var res = new HashSet[MAttribute]
for mproperty in collect_inherited_mproperties(mainmodule, filter) do
if mproperty isa MAttribute then res.add(mproperty)
end
return res
end
# Collect all attributes accessible by `self`
#
# This include introduced, redefined, inherited mattributes.
fun collect_accessible_mattributes(mainmodule: MModule, filter: nullable ModelFilter): Set[MAttribute] do
var set = new HashSet[MAttribute]
set.add_all(collect_intro_mattributes(filter))
set.add_all(collect_redef_mattributes(filter))
set.add_all(collect_inherited_mattributes(mainmodule, filter))
return set
end
# Collect all init methods introduced in `self`
fun collect_intro_inits(filter: nullable ModelFilter): Set[MMethod] do
var res = new HashSet[MMethod]
for mproperty in collect_intro_mmethods(filter) do
if mproperty.is_init then res.add(mproperty)
end
return res
end
# Collect all init methods redefined in `self`
fun collect_redef_inits(filter: nullable ModelFilter): Set[MMethod] do
var res = new HashSet[MMethod]
for mproperty in collect_redef_mmethods(filter) do
if mproperty.is_init then res.add(mproperty)
end
return res
end
# Collect all init methods introduced and redefined in `self`
fun collect_local_inits(filter: nullable ModelFilter): Set[MMethod] do
var set = new HashSet[MMethod]
set.add_all collect_intro_inits(filter)
set.add_all collect_redef_inits(filter)
return set
end
# Collect all init methods inherited by `self`
fun collect_inherited_inits(mainmodule: MModule, filter: nullable ModelFilter): Set[MMethod] do
var res = new HashSet[MMethod]
for mproperty in collect_inherited_mmethods(mainmodule, filter) do
if mproperty.is_init then res.add(mproperty)
end
return res
end
# Collect all init methods accessible by `self`
#
# This include introduced, redefined, inherited inits.
fun collect_accessible_inits(mainmodule: MModule, filter: nullable ModelFilter): Set[MMethod] do
var set = new HashSet[MMethod]
set.add_all(collect_intro_inits(filter))
set.add_all(collect_redef_inits(filter))
set.add_all(collect_inherited_inits(mainmodule, filter))
return set
end
# Collect all virtual types introduced in `self`
fun collect_intro_vts(filter: nullable ModelFilter): Set[MVirtualTypeProp] do
var res = new HashSet[MVirtualTypeProp]
for mproperty in collect_intro_mproperties(filter) do
if mproperty isa MVirtualTypeProp then res.add(mproperty)
end
return res
end
# Collect all virtual types redefined in `self`
fun collect_redef_vts(filter: nullable ModelFilter): Set[MVirtualTypeProp] do
var res = new HashSet[MVirtualTypeProp]
for mproperty in collect_intro_mproperties(filter) 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(filter: nullable ModelFilter): Set[MVirtualTypeProp] do
var set = new HashSet[MVirtualTypeProp]
set.add_all collect_intro_vts(filter)
set.add_all collect_redef_vts(filter)
return set
end
# Collect all virtual types inherited by `self`
fun collect_inherited_vts(mainmodule: MModule, filter: nullable ModelFilter): Set[MVirtualTypeProp] do
var res = new HashSet[MVirtualTypeProp]
for mproperty in collect_inherited_mproperties(mainmodule, filter) 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(mainmodule: MModule, filter: nullable ModelFilter): Set[MVirtualTypeProp] do
var set = new HashSet[MVirtualTypeProp]
for mproperty in collect_accessible_mproperties(mainmodule, filter) 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
if mclass.visibility != public_visibility then
res.add mclass.visibility.to_s
end
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
if mclassdef.mclass == self.mclass then mclassdefs.add mclassdef
end
mainmodule.linearize_mclassdefs(mclassdefs)
return mclassdefs
end
redef fun collect_parents(mainmodule, filter) do
var res = new HashSet[MENTITY]
var hierarchy = self.in_hierarchy
if hierarchy == null then return res
for parent in hierarchy.direct_greaters do
if parent == self then continue
if filter == null or filter.accept_mentity(parent) then res.add parent
end
return res
end
redef fun collect_children(mainmodule, filter) do
var res = new HashSet[MENTITY]
var hierarchy = self.in_hierarchy
if hierarchy == null then return res
for child in hierarchy.direct_smallers do
if child == self then continue
if filter == null or filter.accept_mentity(child) then res.add child
end
return res
end
# Collect all property definitions in `self`
fun collect_mpropdefs(filter: nullable ModelFilter): Set[MPropDef] do
var res = new HashSet[MPropDef]
for mpropdef in mpropdefs do
if filter == null or filter.accept_mentity(mpropdef) then res.add mpropdef
end
return res
end
# Collect all attribute definitions in `self`
fun collect_mattributedefs(filter: nullable ModelFilter): Set[MAttributeDef] do
var res = new HashSet[MAttributeDef]
for mpropdef in collect_mpropdefs(filter) do
if not mpropdef isa MAttributeDef then continue
res.add mpropdef
end
return res
end
# Collect all methods definitions in `self`
fun collect_mmethoddefs(filter: nullable ModelFilter): Set[MMethodDef] do
var res = new HashSet[MMethodDef]
for mpropdef in collect_mpropdefs(filter) 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(filter: nullable ModelFilter): Set[MVirtualTypeDef] do
var res = new HashSet[MVirtualTypeDef]
for mpropdef in collect_mpropdefs(filter) 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(filter: nullable ModelFilter): Set[MPropDef] do
var res = new HashSet[MPropDef]
for mpropdef in mpropdefs do
if not mpropdef.is_intro then continue
if filter == null or filter.accept_mentity(mpropdef) then res.add mpropdef
end
return res
end
# Collect all property definitions that are redefinition in `self`
fun collect_redef_mpropdefs(filter: nullable ModelFilter): Set[MPropDef] do
var res = new HashSet[MPropDef]
for mpropdef in mpropdefs do
if mpropdef.is_intro then continue
if filter == null or filter.accept_mentity(mpropdef) then res.add mpropdef
end
return res
end
end
redef class MProperty
redef fun collect_modifiers do return intro.collect_modifiers
redef fun collect_linearization(mainmodule) do
var mpropdefs = self.mpropdefs.to_a
mainmodule.linearize_mpropdefs(mpropdefs)
return mpropdefs
end
# Collect all property definitions of `self`
fun collect_mpropdefs(filter: nullable ModelFilter): Set[MPropDef] do
var res = new HashSet[MPropDef]
for mpropdef in mpropdefs do
if filter == null or filter.accept_mentity(mpropdef) then res.add mpropdef
end
return res
end
# Collect all direct super definitions of `self`
redef fun collect_parents(mainmodule, filter) do
var res = new HashSet[MENTITY]
for mpropdef in mpropdefs do
for parent in mpropdef.collect_parents(mainmodule, filter) do
var mprop = parent.mproperty
if filter == null or filter.accept_mentity(mprop) then res.add mprop
end
end
return res
end
# Collection all definitions that have `self` as a direct super definition
redef fun collect_children(mainmodule, filter) do
var res = new HashSet[MENTITY]
for mpropdef in mpropdefs do
for child in mpropdef.collect_parents(mainmodule, filter) do
var mprop = child.mproperty
if filter == null or filter.accept_mentity(mprop) then res.add mprop
end
end
return res
end
end
redef class MPropDef
redef fun collect_modifiers do
var res = super
if not is_intro then
res.add "redef"
else
if mproperty.visibility != public_visibility then
res.add mproperty.visibility.to_s
end
end
var mprop = self
if mprop isa MVirtualTypeDef then
res.add "type"
else if mprop isa MMethodDef then
if mprop.is_abstract then
res.add "abstract"
else if mprop.is_intern then
res.add "intern"
end
if mprop.mproperty.is_init then
res.add "init"
else
res.add "fun"
end
else if mprop isa MAttributeDef then
res.add "var"
end
return res
end
redef fun collect_linearization(mainmodule) do
var mpropdefs = new Array[MPropDef]
var mentity = self
while not mentity.is_intro do
mpropdefs.add mentity
mentity = mentity.lookup_next_definition(mainmodule, mentity.mclassdef.bound_mtype)
end
mpropdefs.add mentity
mainmodule.linearize_mpropdefs(mpropdefs)
return mpropdefs
end
# Collect only the next definition of `self`
redef fun collect_parents(mainmodule, filter) do
var res = new HashSet[MENTITY]
var mpropdef = self
while not mpropdef.is_intro do
mpropdef = mpropdef.lookup_next_definition(mclassdef.mmodule, mclassdef.bound_mtype)
res.add mpropdef
end
return res
end
# Collect all children definitions that directly depend on `self`
redef fun collect_children(mainmodule, filter) do
var res = new HashSet[MENTITY]
for mpropdef in mproperty.collect_mpropdefs(filter) do
if mpropdef.collect_parents(mainmodule, filter).has(self) then res.add mpropdef
end
return res
end
end
src/model/model_collect.nit:17,1--1179,3