X-Git-Url: http://nitlanguage.org diff --git a/src/model/model_collect.nit b/src/model/model_collect.nit index c8d3766..79970e5 100644 --- a/src/model/model_collect.nit +++ b/src/model/model_collect.nit @@ -31,8 +31,38 @@ module model_collect import model_views +redef class MEntity + + # Collect modifier keywords like `redef`, `private` etc. + fun collect_modifiers: Array[String] do + return new Array[String] + end +end + +redef class MPackage + redef fun collect_modifiers do + var res = super + res.add "package" + return res + end +end + +redef class MGroup + redef fun collect_modifiers do + var res = super + res.add "group" + return res + end +end + redef class MModule + redef fun collect_modifiers do + var res = super + res.add "module" + return res + end + # Collect all transitive imports. fun collect_ancestors(view: ModelView): Set[MModule] do var res = new HashSet[MModule] @@ -82,8 +112,6 @@ redef class MModule var mmodules = new HashSet[MModule] mmodules.add self mmodules.add_all collect_ancestors(view) - mmodules.add_all collect_parents(view) - mmodules.add_all collect_children(view) mmodules.add_all collect_descendants(view) return view.mmodules_poset(mmodules) end @@ -133,6 +161,8 @@ end redef class MClass + redef fun collect_modifiers do return intro.collect_modifiers + # Collect direct parents of `self` with `visibility >= to min_visibility`. fun collect_parents(view: ModelView): Set[MClass] do var res = new HashSet[MClass] @@ -188,6 +218,15 @@ redef class MClass return res end + # Build a class hierarchy poset for `self` based on its ancestors and descendants. + fun hierarchy_poset(mainmodule: MModule, view: ModelView): POSet[MClass] do + var mclasses = new HashSet[MClass] + mclasses.add self + mclasses.add_all collect_ancestors(view) + mclasses.add_all collect_descendants(view) + return view.mclasses_poset(mainmodule, mclasses) + end + # Collect all mproperties introduced in 'self' with `visibility >= min_visibility`. fun collect_intro_mproperties(view: ModelView): Set[MProperty] do var set = new HashSet[MProperty] @@ -268,6 +307,15 @@ redef class MClass return set end + # Collect mmethods inherited by 'self' if accepted by `view`. + fun collect_inherited_mmethods(view: ModelView): Set[MMethod] do + var res = new HashSet[MMethod] + for mproperty in collect_inherited_mproperties(view) do + if mproperty isa MMethod then res.add(mproperty) + end + return res + end + # Collect mattributes introduced in 'self' with `visibility >= min_visibility`. fun collect_intro_mattributes(view: ModelView): Set[MAttribute] do var res = new HashSet[MAttribute] @@ -313,6 +361,52 @@ redef class MClass set.add_all(collect_inherited_mattributes(view)) return set end + + # Collect init mmethods introduced in 'self' if accepted by `view`. + fun collect_intro_inits(view: ModelView): Set[MMethod] do + var res = new HashSet[MMethod] + for mproperty in collect_intro_mmethods(view) do + if mproperty.is_init then res.add(mproperty) + end + return res + end + + # Collect init mmethods redefined in 'self' if accepted by `view`. + fun collect_redef_inits(view: ModelView): Set[MMethod] do + var res = new HashSet[MMethod] + for mproperty in collect_redef_mmethods(view) do + if mproperty.is_init then res.add(mproperty) + end + return res + end + + # Collect init mmethods introduced and redefined in 'self' if accepted by `view`. + fun collect_local_inits(view: ModelView): Set[MMethod] do + var set = new HashSet[MMethod] + set.add_all collect_intro_inits(view) + set.add_all collect_redef_inits(view) + return set + end + + # Collect init mmethods inherited by 'self' if accepted by `view`. + fun collect_inherited_inits(view: ModelView): Set[MMethod] do + var res = new HashSet[MMethod] + for mproperty in collect_inherited_mmethods(view) do + if mproperty.is_init then res.add(mproperty) + end + return res + end + + # Collect all init mmethods accessible by 'self' if accepted by `view`. + # + # This include introduced, redefined, inherited inits. + fun collect_accessible_inits(view: ModelView): Set[MMethod] do + var set = new HashSet[MMethod] + set.add_all(collect_intro_inits(view)) + set.add_all(collect_redef_inits(view)) + set.add_all(collect_inherited_inits(view)) + return set + end end redef class MClassDef @@ -349,9 +443,8 @@ redef class MClassDef return res end - # Collect modifiers like redef, private etc. - fun collect_modifiers: Array[String] do - var res = new Array[String] + redef fun collect_modifiers do + var res = super if not is_intro then res.add "redef" else @@ -362,10 +455,13 @@ redef class MClassDef end end +redef class MProperty + redef fun collect_modifiers do return intro.collect_modifiers +end + redef class MPropDef - # Collect modifiers like redef, private, abstract, intern, fun etc. - fun collect_modifiers: Array[String] do - var res = new Array[String] + redef fun collect_modifiers do + var res = super if not is_intro then res.add "redef" else @@ -385,6 +481,8 @@ redef class MPropDef else res.add "fun" end + else if mprop isa MAttributeDef then + res.add "var" end return res end