X-Git-Url: http://nitlanguage.org diff --git a/src/model_utils.nit b/src/model_utils.nit index 6bdc558..bc5ca17 100644 --- a/src/model_utils.nit +++ b/src/model_utils.nit @@ -17,8 +17,7 @@ # Model exploration and traversing facilities module model_utils -import toolcontext -import exprbuilder +import modelbuilder redef class MModule # Get the list of mclasses refined in 'self'. @@ -34,6 +33,7 @@ redef class MModule fun imported_mclasses: Set[MClass] do var mclasses = new HashSet[MClass] for m in in_importation.greaters do + if m == self then continue for c in m.mclassdefs do mclasses.add(c.mclass) end return mclasses @@ -42,6 +42,16 @@ end redef class MClass + # Get the public owner of 'self'. + fun public_owner: MModule do + var public_owner = self.intro_mmodule.public_owner + if public_owner == null then + return self.intro_mmodule + else + return public_owner + end + end + # Get direct parents of 'self'. fun parents: Set[MClass] do var ret = new HashSet[MClass] @@ -65,6 +75,30 @@ redef class MClass return lst end + # Get direct children of 'self'. + fun children: Set[MClass] do + var lst = new HashSet[MClass] + for mclassdef in self.mclassdefs do + for sub_mclassdef in mclassdef.in_hierarchy.direct_smallers do + if sub_mclassdef == mclassdef then continue # skip self + lst.add(sub_mclassdef.mclass) + end + end + return lst + end + + # Get all children of 'self'. + fun descendants: Set[MClass] do + var lst = new HashSet[MClass] + for mclassdef in self.mclassdefs do + for sub_mclassdef in mclassdef.in_hierarchy.smallers do + if sub_mclassdef == mclassdef then continue # skip self + lst.add(sub_mclassdef.mclass) + end + end + return lst + end + # Get the list of constructors available for 'self'. fun constructors: Set[MMethod] do var res = new HashSet[MMethod] @@ -91,6 +125,17 @@ redef class MClass return res end + # Get the set of properties introduced in 'self'. + fun intro_mproperties: Set[MProperty] do + var res = new HashSet[MProperty] + for mclassdef in mclassdefs do + for mpropdef in mclassdef.mpropdefs do + if mpropdef.is_intro then res.add(mpropdef.mproperty) + end + end + return res + end + # Get the list of locally refined methods in 'self'. fun redef_methods: Set[MMethod] do var res = new HashSet[MMethod] @@ -104,6 +149,17 @@ redef class MClass return res end + # Get the set of locally refined properties in 'self'. + fun redef_mproperties: Set[MProperty] do + var res = new HashSet[MProperty] + for mclassdef in mclassdefs do + for mpropdef in mclassdef.mpropdefs do + if not mpropdef.is_intro then res.add(mpropdef.mproperty) + end + end + return res + end + # Get the list of methods inherited by 'self'. fun inherited_methods: Set[MMethod] do var res = new HashSet[MMethod] @@ -115,6 +171,48 @@ redef class MClass return res end + # Get the set of all properties inherited by self + fun inherited_mproperties: Set[MProperty] do + var res = new HashSet[MProperty] + for s in ancestors do + for m in s.intro_mproperties do + if not self.intro_mproperties.has(m) and not self.redef_mproperties.has(m) then res.add(m) + end + end + return res + end + + # Get the list of all virtual types available in 'self'. + fun virtual_types: Set[MVirtualTypeProp] do + var res = new HashSet[MVirtualTypeProp] + for mclassdef in mclassdefs do + for mpropdef in mclassdef.mpropdefs do + if mpropdef isa MVirtualTypeDef then + res.add(mpropdef.mproperty) + end + end + end + for ancestor in ancestors do + for mclassdef in ancestor.mclassdefs do + for mpropdef in mclassdef.mpropdefs do + if mpropdef isa MVirtualTypeDef then + res.add(mpropdef.mproperty) + end + end + end + end + return res + end + + # Get the list of all parameter types in 'self'. + fun parameter_types: Map[String, MType] do + var res = new HashMap[String, MType] + for i in [0..intro.parameter_names.length[ do + res[intro.parameter_names[i]] = intro.bound_mtype.arguments[i] + end + return res + end + fun is_class: Bool do return self.kind == concrete_kind or self.kind == abstract_kind end @@ -131,3 +229,40 @@ redef class MClass return self.kind == abstract_kind end end + +# Sorters + +# Sort mmodules by their name +class MModuleNameSorter + super AbstractSorter[MModule] + redef fun compare(a, b) do return a.name <=> b.name + init do end +end + +# Sort mclasses by their name +class MClassNameSorter + super AbstractSorter[MClass] + redef fun compare(a, b) do return a.name <=> b.name + init do end +end + +# Sort mclassdefs by their name +class MClassDefNameSorter + super AbstractSorter[MClassDef] + redef fun compare(a, b) do return a.mclass.name <=> b.mclass.name + init do end +end + +# Sort mproperties by their name +class MPropertyNameSorter + super AbstractSorter[MProperty] + redef fun compare(a, b) do return a.name <=> b.name + init do end +end + +# Sort mpropdefs by their name +class MPropDefNameSorter + super AbstractSorter[MPropDef] + redef fun compare(a, b) do return a.mproperty.name <=> b.mproperty.name + init do end +end