# First setup you view from a Model:
#
# ~~~nitih
-# var view = new ModelView(model)
+# var view = new ModelView(model, mainmodule)
# ~~~
#
# Then ask question using the view:
# * `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]
- mentities.add self
var poset = new POSet[MENTITY]
- while mentities.not_empty do
- var mentity = mentities.pop
- if done.has(mentity) then continue
- done.add 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(view) do
poset.add_edge(mentity, parent)
- mentities.add 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(view) do
poset.add_edge(child, mentity)
- mentities.add child
+ children.add child
end
end
return poset
# 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
+ for mgroup in collect_all_mgroups(view) do
res.add_all mgroup.collect_mmodules(view)
end
return res
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
- if mentity == self then continue
- if not view.accept_mentity(mentity) then continue
- res.add mentity
- end
- return res
- end
-
# Collect all modules directly imported by `self`
redef fun collect_parents(view) do
var res = new HashSet[MENTITY]
# This method uses a flattened hierarchy containing all the mclassdefs.
redef fun collect_parents(view) do
var res = new HashSet[MENTITY]
- for mclassdef in mclassdefs do
- for parent in mclassdef.collect_parents(view) do
- var mclass = parent.mclass
- if mclass == self or not view.accept_mentity(parent) then continue
- res.add mclass
- end
- end
- return res
- end
-
- # Collect all ancestors of `self`
- redef fun collect_ancestors(view) do
- var res = new HashSet[MENTITY]
- for mclassdef in mclassdefs do
- for parent in mclassdef.collect_parents(view) do
- if not view.accept_mentity(parent) then continue
- res.add parent.mclass
- end
+ if not view.mainmodule.flatten_mclass_hierarchy.has(self) then return res
+ for mclass in in_hierarchy(view.mainmodule).direct_greaters do
+ if mclass == self or not view.accept_mentity(mclass) then continue
+ res.add mclass
end
return res
end
# This method uses a flattened hierarchy containing all the mclassdefs.
redef fun collect_children(view) do
var res = new HashSet[MENTITY]
- for mclassdef in mclassdefs do
- for child in mclassdef.collect_children(view) do
- var mclass = child.mclass
- if mclass == self or not view.accept_mentity(child) then continue
- res.add mclass
- end
+ if not view.mainmodule.flatten_mclass_hierarchy.has(self) then return res
+ for mclass in in_hierarchy(view.mainmodule).direct_smallers do
+ if mclass == self or not view.accept_mentity(mclass) then continue
+ res.add mclass
end
return res
end
if not is_intro then
res.add "redef"
else
- res.add mclass.visibility.to_s
+ if mclass.visibility != public_visibility then
+ res.add mclass.visibility.to_s
+ end
end
res.add mclass.kind.to_s
return res
return mclassdefs
end
- redef fun collect_ancestors(view) do
- var res = new HashSet[MENTITY]
- var hierarchy = self.in_hierarchy
- if hierarchy == null then return res
- for parent in hierarchy.greaters do
- if parent == self or not view.accept_mentity(parent) then continue
- res.add parent
- end
- return res
- end
-
redef fun collect_parents(view) do
var res = new HashSet[MENTITY]
var hierarchy = self.in_hierarchy
if not is_intro then
res.add "redef"
else
- res.add mproperty.visibility.to_s
+ if mproperty.visibility != public_visibility then
+ res.add mproperty.visibility.to_s
+ end
end
var mprop = self
if mprop isa MVirtualTypeDef then